Введение в PHP
Базы данных MySQL, язык запросов
Отображение данных
Модификация данных
Способы авторизации пользователя

26 мая 2004

Я работаю преподавателем в одной фирме, проводящей курсы по PHP. Может быть кому-нибудь пригодится написанная мной методичка. Буду рад прочитать ваши отзывы.

написать автору

2. Каталог товаров.

 

Создадим каталог товаров, в котором они разбиты на категории и подкатегории. Структура базы данных будет выглядеть следующим образом:

 

 

Таблицы:

Разделы – бытовая техника, одежда, продукты питания ….

Категории – телевизоры, магнитофоны, платья, молочные продукты, колбасы….

Производители – производители товара.

Товары – название, информация о товаре, стоимость.

 

Связи в таблицах осуществляются через целочисленное поле id.

 

Необходимо создать сайт с каталогом продукции, в котором можно вывести товары, по категориям, разделам и производителям, кроме этого можно вывести каждый товар отдельно, и осуществлять поиск по наименованию товаров.

 

Для начала выведем все товары на одной странице. Отображаться в каждой строке будут наименование товара и его цена:

 

Телевизор  5000

Холодильник 10000

Утюг 1500

и тд.

 

листинг 4 (page1.php):

1.                <?php

2.                include('connect.php');

3.                $query_str_tovar="select * from  tovar";

4.                $query_tovar=mysql_query($query_str_tovar,$connect);

5.                $count_tovar=mysql_num_rows($query_tovar);

6.                ?>

7.                <html>

8.                <body>

9.                <?php

10.            for ($i=1;$i<=$count_tovar;$i++)

11.            {

12.            $row_tovar=mysql_fetch_assoc($query_tovar);

13.            echo $row_tovar['tovar_name'];

14.            echo $row_tovar['tovar_price'];

15.            echo "<br>";

16.            };

17.            ?>

18.            </body>

19.            </html>

 

листинг 5(connect.php) :

1.    <?php

2.    $server="localhost";

3.    $user="root";

4.    $password="";

5.    $baza="catalog";

6.    $connect=mysql_pconnect($server,$user,$password);

7.    mysql_select_db($baza,$connect);

8.    ?>

 

Листинг 5 представляет собой файл connect.php , в котором описывается подключение к базе данных.  Это пример модульного программирования, когда часто повторяющийся участок кода выносится в отдельную подпрограмму. В нашем случае, этот код выполняется когда производится вызов функции include('connect.php'); в строке 2 листинга 4. Это команда интерпретатору PHP выполнить код находящийся в указанном файле. Когда файл исполняется, парсер пребывает в "режиме HTML", то есть будет выводить содержимое файла, пока не встретит первый стартовый тег PHP (<?PHP ). Таким образом можно вставлять в выводимый файл любые элементы (удобно использовать для вставки оформления). При обработке PHP все переменные для этих файлов будут общими.

 

Следующий шаг: нам необходимо вывести товары соответствующие  определенному производителю. Для этого изменим запрос в строке 3 таким образом: $query_str_tovar="select * from  tovar WHERE id_proizv=2"; теперь у нас будут выбираться только товары id_proizv которых равен 2. Зная какому производителю соответствует число (таблица proizv) и меняя его можно выбирать товары интересующих нас производителей.

 

Но это не удобно, поэтому мы свяжем таблицы товаров и производителей и будем вверху страницы в строчку выводить всех производителей в виде ссылок, а затем при переходе по ссылке определенного производителя будем выводить товары только этого производителя. Код написан таким образом, что используется только один файл php, т.е. при переходе по ссылке браузер переходит на эту же страницу, но с новыми параметрами.

 

листинг 6 (page2.php):

 

1.      <?php

2.      include('connect.php');

3.      if (isset($_GET['proizv']))

4.      {$proizv=$_GET['proizv'];}

5.      else

6.      {$proizv=1;};

7.      $query_str_proizv="select * from  proizv";

8.      $query_proizv=mysql_query($query_str_proizv,$connect);

9.      $count_proizv=mysql_num_rows($query_proizv);

10.      $query_str_tovar="select * from  tovar WHERE id_proizv=".$proizv;

11.      $query_tovar=mysql_query($query_str_tovar,$connect);

12.      $count_tovar=mysql_num_rows($query_tovar);

13.      ?>

14.      <html>

15.      <body>

16.      <?php

17.       for ($i=1;$i<=$count_proizv;$i++)

18.      {

19.      $row_proizv=mysql_fetch_assoc($query_proizv);

20.       echo "<a href = 'page2.php?proizv=".$row_proizv['id']."' > ".$row_proizv['proizv_name']." </a> - ";

21.      };

22.      echo "<br>товары<br>";

23.      for ($i=1;$i<=$count_tovar;$i++)

24.      {

25.      $row_tovar=mysql_fetch_assoc($query_tovar);

26.      echo $row_tovar['tovar_name']." - ".$row_tovar['tovar_price']."<br>";

27.      };

28.      ?>

29.      </body>

30.      </html>

 

Принцип работы этой программы заключается в следующем :

Из таблицы производителей выбираются все записи и из имен производителей формируются ссылки, с переменной proizv которая представляет собой id производителя. Ссылки формируются в цикле, который обрабатывает все записи из таблицы производителей. Рассмотрим подробнее строку 20  

echo "<a href='page2.php?proizv=".$row_proizv['id']."'>" .$row_proizv['proizv_name']."</a>";

то что выделено курсивом является строкой, а текст выделенный жирным – код php. Здесь мы видим тэг ссылки  на страницу page.php с переменной proizv которая равна полю id текущей записи ( $row_proizv['id']  ) и текст ссылки является именем производителя ( $row_proizv['proizv_name'] ). При обработке цикла эти переменные будут заменены на число id и текст proizv_name.  Сформированная ссылка будет выглядеть так

<a href=’page2.php?proizv=2’ > Производитель_2 </a>

в строке браузера: “http://www.mycatalog.ru/page2.php?proizv=2”

При переходе по этой ссылке браузер отобразит эту же страницу page2.php и передаст серверу параметр proizv=2. Как было рассмотрено выше, переменные передаваемые при помощи средств HTML в данном случае метод GET принимаются в php коде следующим образом:

$имя_переменной_php = $_GET[“имя_переменной _html”];

В строке 4 мы присваиваем переменной $proizv значение переданного параметра proizv. Теперь мы можем использовать это значение при составлении запроса для таблицы товаров. Поскольку мы знаем id производителя, то добавим в запрос условие строка 10.

$query_str_tovar="select * from  tovar WHERE id_proizv=".$proizv;

поскольку запрос это строка, переменная $proizv будет заменена на число и запрос выведет записи у которых id_proizv соответствует этому числу, в нашем случае – 2. Запрос будет выглядеть так

“SELECT * from  tovar WHERE id_proizv=2”

Но если при обработке строки 10 не будет определена переменная $proizv то интерпретатор выдаст ошибку. Это может случиться при переходе на эту страницу без передачи параметра proizv например:  “http://www.mycatalog.ru/page2.php” .

Для защиты от этой ситуации применим строки 3-6. Это оператор условия, который при существовании параметра proizv

(строка 3  if (isset($_GET['proizv']))  ) передает его переменной $proizv

(строка 4   {$proizv=$_GET['proizv'];}   ), а в противном случае, присваивает переменной $proizv значение по умолчанию – 1.

(строка 6    {$proizv=1;};    )

Существование переменной проверяется оператором isset(имя_переменной), который при существовании данной переменной возвращает истину, а при отсутствии такой переменной возвращает ложь.

Таким образом, при отсутствии в строке запроса параметра proizv будет выбран производитель с id=1.

 

Теперь необходимо вывести детальную информацию по каждому товару, это поле tovar_info и изображение товара tovar_pict. Для этого на этой же странице будем выводить товары не в виде названия, а в виде ссылки но уже на другую страницу page4.php. В качестве параметра будем предавать число id товара, аналогично выбору производителя. измененная страница с каталогом товаров – page3.php

 

листинг 7 (page4.php) :

 

1.      <?php

2.      include('connect.php');

3.      if (isset($_GET['tovar']))

4.      {$tovar=$_GET['tovar'];}

5.      else

6.      {$tovar=1;};

7.      $query_str_tovar="select * from tovar, proizv

  WHERE tovar.id_proizv=proizv.id AND tovar.id=".$tovar;

8.      $query_tovar=mysql_query($query_str_tovar,$connect);

9.      ?>

10.      <html>

11.      <head>

12.      </head>

13.      <body>

14.      <?php

15.      $row_tovar=mysql_fetch_assoc($query_tovar);

16.      echo "производитель: ".$row_tovar['proizv_name']."<br>";

17.      echo "название: ".$row_tovar['tovar_name']."<br>";

18.      echo "цена: ".$row_tovar['tovar_price']."<br>";

19.      echo "<img src='images/".$row_tovar['tovar_pict']."'>";

20.      ?>

21.      </body>

22.      </html>

 

На этой странице по аналогии с предыдущей параметр tovar проверяется и если он существует, то передается переменной $tovar. Затем из таблицы товар выбирается одна запись соответствующая данному id и выводится информация по данной записи. Особенностями является следующее : поскольку мы не знаем имя производителя, а только его id (id_proizv  в таблице товаров) , то мы можем связать таблицы tovar и proizv по полю id и получить соответствующую информацию уже из таблицы proizv. Связь осуществляется условием «tovar.id_proizv=proizv.id» , заметьте в запросе участвуют две таблицы. В строке 16 мы выводим имя производителя.

Вторая особенность – это изображение товара (строка 19). Мы знаем тэг img, который в общем случае выглядит так <img src=”имя_файла”> В поле tovar_pict таблицы tovar хранится имя файла, которое мы подставим в тэг изображения. Обычно картинки хранятся в папке images поэтому в коде напишем: echo "<img src='images/".$row_tovar['tovar_pict']."'>";

если имя файла image.jpg то получим

 <img src='images/image.jpg' >

 

Поиск по наименованию товара

 

Часто бывает необходимо найти запись в таблице, зная лишь часть информации. рассмотрим это на примере поиска товара по его названию. Поскольку информация о товарах хранится в базе данных MySQL, то воспользуемся её инструментами. Простейший поиск можно организовать с помощью такого запроса:

SELECT * FROM tovar WHERE tovar_name=”Телевизор

Данный запрос выберет из таблицы все товары, которые называются «Телевизор». Но зачастую бывает такая ситуация, когда полное название не известно, а известна только часть имени. Это называется поиск по подстроке. В этом случае применяется следующий вид запроса:

SELECT * FROM tovar WHERE tovar_name LIKE “%Теле%”

Этот запрос выведет все записи, в имени которых встречается подстрока «Теле», причем регистр букв, в данном случае не имеет значения.

Отсюда можно сделать вывод, что поиск по наименованию можно осуществить таким же образом, что и выбор товаров по определенному производителю. Только вместо числа id параметром в данном случае выступает строка – часть имени товара. Следовательно, её можно передавать в строке адреса, а затем подставлять в запрос. Мы уже научились создавать несколько ссылок, передающих строго фиксированные значения параметра. (1,2,3, …. и тд.). Но в данном случае, мы не можем предугадать какой товар потребуется пользователю и должны предоставить ему самостоятельно вводить данные для поиска. Здесь не обойтись простыми ссылками и мы воспользуемся формами.

Формы это средство HTML, которое позволяет принимать данные от пользователя и при наступлении события SUBMIT (нажатие на кнопку, щелчок по картинке, событие JavaScript и др.) отправлять их серверу. Отправка происходит одним из двух методов: GET – передача в строке адреса и POST – передача информации в заголовке HTTP-пакета. Существенно эти методы ничем не отличаются. Рассмотрим пример.

 

Листинг 8 (page5.php):

 

1.      <?php

2.      include('connect.php');

3.      if (isset($_GET['poisk']))

4.      {$poisk=$_GET['poisk'];}

5.      else

6.      {$poisk="";};

7.      $query_str_tovar="SELECT * FROM  tovar

  WHERE tovar_name LIKE '%".$poisk."%'";

8.      $query_tovar=mysql_query($query_str_tovar,$connect);

9.      $count_tovar=mysql_num_rows($query_tovar);

10.      ?>

11.      <html>

12.      <body>

13.      <form action="" method="get">

14.         <input name="poisk" type="text">

15.         <input type="submit" name="Submit" value="ПОИСК">

16.      </form>

17.      <?php

18.      for ($i=1;$i<=$count_tovar;$i++)

19.      {

20.      $row_tovar=mysql_fetch_assoc($query_tovar);

21.      echo $row_tovar['tovar_name'];

22.      echo $row_tovar['tovar_price'];

23.      echo "<br>";

24.      };

25.      ?>

26.      </body>

27.      </html>

 

Параметр поиска аналогично предыдущим примерам принимается от пользователя и производится проверка его на существование (строки 3-6). При отсутствии параметра поиска, запрос выведет все записи, поскольку по умолчанию задается пустая строка (строка 6). Но можно сделать, например, чтобы при отсутствии параметра или его некорректном значении, на странице выводилось сообщение для пользователя.

Рассмотрим более подробно тэг формы.

<form action="index.html" method="get "  name="Form1">

</form>

Тэг формы имеет атрибуты:

action="имя_страницы_перехода" – имя страницы, на которую перейдет браузер при срабатывании формы (событие submit). Если атрибут равен пустой строке, то браузер перейдет на эту же страницу.

method="метод_передачи_данных" – принимает значения get или post

name="имя_формы" – название формы, когда используется несколько форм на одной странице.

 

Внутри тэга находятся поля (переменные). При срабатывании формы передаются значения всех полей, принадлежащих данной форме.

 

ВНИМАНИЕ: если на странице находятся две и более форм, то при наступлении события submit для одной из форм, передаются данные только этой формы. Данные других форм не учитываются и теряются.

 

В этом примере у нас два поля – это однострочное поле ввода текста и кнопка Submit.

Поле ввода имеет следующие атрибуты:

name – имя переменной (поля), которая впоследствии будет передаваться серверу.

type – тип поля, в данном случае text.

Поле кнопки имеет похожие атрибуты:

name – имя кнопки

type – тип поля – submit (т.е кнопка, при нажатии которой форма срабатывает и отправляет значения своих полей серверу)

value – надпись на кнопке

 

Кроме этого бывают еще поля типа:

password – поле для ввода пароля, похоже на text, но введенные символы заменяются на звездочки.

image – рисунок, обрабатывает нажатия как кнопка submit, кроме этого передает координаты нажатия мыши.

button – кнопка, не отправляющая данные с формы.

hidden – поле, которое имеет значение, но не отображающееся на странице.

textarea – многострочное поле для ввода текста.

и др.

общим для них является наличие имени поля и значения (value).

 

Очень часто встречается такая ситуация, когда количество наименований товаров составляет несколько сотен, а то и тысяч, в этом случае необходимо разбивать вывод товаров на страницы, иначе выводимая страница получится очень большого размера. Примеры этого можно увидеть в поисковиках. Итак, понятно, что постраничный вывод информации – это отображение за один раз только части записей. Допустим, мы желаем, чтобы на странице выводилось за один раз 50 записей. Следовательно, на первой странице выведутся записи 1-50, на второй 51-100, и т.д. Это можно сделать при полоши цикла или встроенных средств MySQL. Зная номер страницы мы можем определить номер начальной записи ((номер_страницы-1)*50) [единица вычитается, потому что для первой страницы начальная запись будет ] и номер конечной записи (номер_начальной _записи+50). Кроме этого необходимо организовать легкий доступ к любой странице. Для этого мы применим ссылки, для каждой страницы (страница_1,  страница_2, и т.д.). Количество ссылок определим так: (общее_количество_записей/количество_записей_на_ странице) округленное в сторону большего. Мы установили, что для отображения любой страницы нам нужен номер страницы и количество записей на ней. Поскольку количество записей на странице остается неизменным (50 записей), мы можем указать это напрямик в коде, остается только одна неизвестная – это номер страницы, и его мы будем передавать с помощью ссылки методом GET. Зная количество страниц, легко при помощи цикла сформировать нужное количество соответствующих ссылок. Каждая ссылка будет передавать номер страницы.

 

Листинг 8: (page6.php)

 

1.      <?php

2.      include('connect.php');

3.      if (isset($_GET['page']))

4.      {$page=$_GET['page'];}

5.      else

6.      {$page=1;};

7.      $begin=($page-1)*50;

8.      $query_str_tovar_total="select * from  tovar";

9.      $query_tovar_total=mysql_query($query_str_tovar_total, $connect);

10.      $count_tovar_total=mysql_num_rows($query_tovar_total);

11.      $page_count=ceil($count_tovar_total/50);

12.      $query_str_tovar="select * from  tovar limit ".$begin.", 50";

13.      $query_tovar=mysql_query($query_str_tovar,$connect);

14.      $count_tovar=mysql_num_rows($query_tovar);

15.      ?>

16.      <html>

17.      <body>

18.      <?php

19.      for ($i=1;$i<=$count_tovar;$i++)

20.      {

21.      $row_tovar=mysql_fetch_assoc($query_tovar);

22.      echo $row_tovar['tovar_name'];

23.      echo $row_tovar['tovar_price'];

24.      echo "<br>";

25.      };

26.      for ($i=1;$i<=$page_count;$i++)

27.      {echo "<a href='page6.php?page=".$i."'>Страница ".$i." </a>"; };

28.      ?>

29.      </body>

30.      </html>

 

Рассмотрим листинг:

Строки 3-6 стандартная проверка переменной page на существование. По умолчанию отображаем первую страницу.

Строка 7: вычисляем номер начальной записи запроса.

Строки 8-10 запрос, который содержит все записи (не ограничен) для вычисления общего количества записей ($count_tovar_total)

Строка 11 $page_count=ceil($count_tovar_total/50); вычисление общего количества страниц.

Строка 12: $query_str_tovar="select * from  tovar limit ".$begin.", 50"; запрос с ограничением количества выводимых записей. Выведет 50 записей начиная с записи с номером $begin.

Строки 19-25 вывод запроса.

Строки 26-28 вывод ссылок передающих параметр – номер страницы. Это осуществляется при помощи цикла от 1 до $page_count (общего количества страниц)

 

Сортировка по наименованию и цене

 

В каталогах товаров часто можно встретить такие опции как сортировку по какому-нибудь параметру, например по цене, названию, дате выпуска, техническому параметру и т.п.

 

Для сортировки мы будем использовать стандартную функцию языка MySQL ORDER BY. Рассмотрим пример такого запроса:

SELECT * FROM  tovar ORDER BY tovar_name

Данный запрос выдаст записи из таблицы товаров в порядке возрастания по полю tovar_name. В данном случае сортировка будет осуществляться в алфавитном порядке, поскольку это текстовое поле. MySQL автоматически определит тип поля и сортировка числового поля будет осуществлена по величине чисел, сортировка поля с датой или временем – по времени.

 

Листинг 8 (page7.php)

 

1.      <?php

2.      include('connect.php');

3.      if (isset($_GET['sort']))

4.      {$sort=$_GET['sort'];}

5.      else

6.      {$sort="tovar_name";};

7.      $query_str_tovar="select * from  tovar ORDER BY ".$sort ;

8.      $query_tovar=mysql_query($query_str_tovar,$connect);

9.      $count_tovar=mysql_num_rows($query_tovar);

10.      ?>

11.      <html>

12.      <body>

13.      <a href="page7.php?sort=tovar_name">Сортитровать по названию</a>

14.      <a href="page7.php?sort=tovar_price">Сортитровать по цене</a>

15.      <?php

16.      for ($i=1;$i<=$count_tovar;$i++)

17.      {

18.      $row_tovar=mysql_fetch_assoc($query_tovar);

19.      echo $row_tovar['tovar_name'];

20.      echo $row_tovar['tovar_price'];

21.      echo "<br>";

22.      };

23.      ?>

24.      </body>

25.      </html>

 

 

Переменная $sort передается при помощи ссылок (строки 13-14), значение параметра является полем, используемым для сортировки, которое затем подставляется в запрос (строка 7). Для проверки существования применяется условие строки 3-6. По умолчанию задается сортировка по полю tovar_name (строка 6).

Рейтинг@Mail.ru

Copyright © 2004 by inet-studio
 

Сайт создан в системе uCoz