Опубликован: 08.05.2007 | Доступ: свободный | Студентов: 12881 / 3013 | Оценка: 4.13 / 3.77 | Длительность: 12:58:00
Дополнительный материал 1:

Приложение PHP E-Commerce

< Лекция 12 || Дополнительный материал 1: 123456789101112 || Дополнительный материал 2 >

Поиск продуктов

Страница search.php вызывается для выполнения поиска в таблице Products с помощью одного из двух методов. Поиск категории продукта находит все названия программных продуктов в этой категории на основе соответствующего значения ItemType в их записях. Поиск по ключевым словам находит все названия программных продуктов, содержащие ключевое слово в одном из своих полей. В обоих случаях создается список из полей ItemNumber, ItemTitle, и ItemPrice соответствующих записей о продуктах. Список продуктов соединяется также со страницей detail.php, где представлена вся информация о продукте.


Получение строк запросов

Когда загружается страница search.php она получает строку запроса со страницы, на которой был сделан запрос поиска категории или поиска по критерию. Возможны два вида строк запроса:

?Category=CategoryName
?Criterion=KeywordValue

Одной из первых задач на этой странице поэтому является получение этого значения из массива строки запроса Request.QueryString, который создается, когда пара имя/значение попадает на сервер. Обычно в массиве доступно одно из двух значений. Однако в одном случае нет ни одного значения. Это происходит, когда форма поиска отправляется с пустым полем критерия поиска. В этом случае нет имени категории или значения ключевого слова на этой странице. Все эти ситуации учитываются в следующем сценарии, который появляется в верхней части страницы search.php.

<?php
$Category = $_GET[Category];
$Criterion = $_GET[Criterion];

if ($Category == "" && $Criterion == "")
{
 header("Location:home.php");
 }

?>

Значения строки запроса присваиваются переменным Category (Категория) и Criterion (Критерий). Отметим также, что если оба эти значения будут null, в соответствии с описанной выше ситуацией, то посетитель немедленно перенаправляется на страницу home.php. В этом случае нечего искать.

Структура страницы

Основное содержимое этой страницы кодируется внутри третьего раздела страницы (напомним, что первый раздел включает файл header.inc, а второй раздел включает файл menu.inc ). Именно в этом разделе используются две процедуры поиска. Страница поэтому имеет следующую структуру:

<?php
$Category = $_GET[Category];
$Criterion = $_GET[Criterion];

if ($Category == "" && $Criterion == "")

{
 header("Location:home.php");
  
}
  
?>

<html>
<head>
	<title>Сайт eCommerce</title>
	<link href="stylesheetEC.css" rel="stylesheet">
	<<?php require("jscript.inc") ?>
</head>
<body>


<div style="position:absolute; top:0px; left:0px; width:780px; 
  background-color:seagreen; color:white; padding:5px">
  
  <?php
  require("header.inc")
  ?>
  
</div>

<div style="position:absolute; top:75px; left:10px; width:175px">
  
 <?php
  require("menu.inc")
  ?>
   
</div>

<div style="position:absolute; top:75px; left:200px; width:550px">

 if ($Category != "") { 
	  ...code for category search

}

if ($Criterion != "") {
 	  ...code for keyword search
}
</div>
</body>
</html>
Пример I.6.

Если имеется значение Category, то это значение было передано на эту страницу и должно использоваться для поиска категории. Если, с другой стороны, на страницу было передано значение Criterion, то должен выполняться этот тип поиска.

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

Для продукта соответствующего значению Category, переданного на эту страницу, подходящие записи представляют в таблице. Из подходящих записей выводятся три поля: ItemNumber, ItemTitle, и ItemPrice. Код начинается с вывода заголовка таблицы и заголовков столбцов над значениями таблицы. На следующем листинге значение переменной Category выводится в заголовке, чтобы помочь идентифицировать результаты поиска.

if ($Category != "") {
	  <span class="head3">Поиск</span>результатов для категории 
	  <span class="head3"><?php echo $Category ?></span>:
	  <br>
	  <br>
	  <table border="0" cellpadding="3">
	  <tr>
		    <th>Item Number</th>
		    <th>Item Title</th>
		    <th>Item Price</th>
	  </tr>

Вслед за этим на странице выводятся результаты поиска. Каждая запись таблицы Product, которая имеет значение ItemType, совпадающее со значением переменной Category, выбирается для вывода полей ItemNumber, ItemTitle, и ItemPrice. Каждая запись продукта появляется в отдельной строке таблицы вывода. Реализующий это код показан ниже.

<?php
    $conn = odbc_connect
  ('Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\inetpub\wwwroot\PHPTutorial\Ecommerce\databases\ecommerce.mdb','','');
  
  //Формирование оператора SQL SELECT 
$sql = "SELECT ItemNumber,ItemTitle,ItemPrice FROM Products WHERE ItemType = '$Category' ORDER BY ItemNumber";
  
//Выполнение оператора SQL для создания множества записей 
$rs = odbc_exec($conn, $sql);
  
//Цикл по множеству записей и вывод необходимых записей 
while($row = odbc_fetch_array($rs)) 
	
	{
	$ItemNumber = $row[ItemNumber];
	$ItemTitle = $row[ItemTitle];
	$ItemPrice = number_format($row[ItemPrice],2);
	
echo " <tr style=\"color:seagreen; line-height:8pt\"
        onMouseOver=\"this.style.backgroundColor='lightgreen';this.style.color='darkgreen';
          this.style.cursor='hand'\"
        onMouseOut=\"this.style.backgroundColor='white';this.style.color='seagreen'\"
        onClick=\"location.href='detail.php?ItemNumber=$row[ItemNumber]\" .
          \"&Category=$Category'\">
        <td>$ItemNumber</td>
        <td>$ItemTitle</td>
        <td align=\"right\">$ItemPrice</td>
      </tr>";

  	}
	
  	odbc_close($conn);
  
  ?>
	  </table>
<?php

}

?>
Пример I.7.

Сценарий начинается с соединения с базой данных eCommerce.mdb и создания объекта множества записей с именем RSCategory для извлечения подходящих записей из таблицы Products. Выбираются записи, в которых значение ItemType совпадает со значением переменной Category, содержащей значение строки запроса:

SQL="SELECT ItemNumber,ItemTitle,ItemPrice FROM Products  
WHERE ItemType= '$Category' ORDER BY ItemNumber"

Сценарий выполняет итерации на множестве выбранных записей, выводя каждую по очереди в строке таблицы. Значения множества записей присваиваются переменным, чтобы упростить с ними работу.

$ItemNumber = $row[ItemNumber]
$ItemTitle = $row[ItemTitle]
$ItemPrice = number_format($row[ItemPrice],2)
...
<td>echo $ItemNumber</td>
<td>echo $ItemTitle</td>
<td align="right">$echo $ItemPrice</td>

Отметим, что для переменной $ItemPrice перед присваиванием была использована функция PHP number_format, чтобы вывод был представлен в долларах и центах. Значение также выравнивается вправо в ячейке таблицы.

Соединение из строк таблицы

В этой таблице, как и в таблице ссылок на категории в файле menu.inc, вся строка таблицы является ссылкой на страницу detail.php, где приводится полное описание продукта. Эти ссылки и их визуальные эффекты создают, программируя каждый тег <tr> реагировать на события перемещения указателя мыши над строкой и на щелчок мыши.

<tr style="color:seagreen; line-height:8pt"
  onMouseOver="this.style.backgroundColor='lightgreen';this.style.color='darkgreen';
    this.style.cursor='hand'"
  onMouseOut="this.style.backgroundColor='white';this.style.color='seagreen'"
  onClick="location.href='detail.php?ItemNumber=echo $ItemNumber&Category=echo $Category'"
  >

Здесь также линейная спецификация стиля задает для строки используемый по умолчанию цвет текста и толщину линий. Затем встроенные обработчики событий JavaScript динамически изменяют визуальные стили оформления строки на события перемещения курсора мыши. Кроме того, событие onClick создает запрос URL для страницы detail.php. Этот URL форматируется для передачи на страницу detail.php строки запроса, содержащей ItemNumber продукта этой строки, вместе с переменной Category, которая была передана на эту страницу из меню поиска. Использование этого последнего элемента строки запроса рассматривается при обсуждении страницы detail.php.

После вывода всех строк таблицы множество записей и соединение закрываются, и записывается закрывающий тег </table>. Все продукты запрошенной категории выводятся в таблице вместе со ссылками на страницу detail.php, где предоставляется полная информация о продукте.

Программирование поиска по ключевым словам

Поиск по ключевым словам действует почти таким же образом, как и поиск по категории. Основное различие состоит в способе извлечения записей о продуктах из таблицы Products. Первая часть сценария будет идентичной, за исключением вывода значения Criterion, переданного в строке запроса, а не значения Category.

<% If Criterion <> "" Then %>
  <span class="head3">Search</span>results for criterion 
  <span class="head3">echo $Criterion</span>:
  <br>
  <br>
  <table border="0" cellpadding="3">
  <tr>
    <th>Item Number</th>
    <th>Item Title</th>
    <th>Item Price</th>
  </tr>

Следующий листинг кода показывает процедуру поиска всех продуктов, содержащих значение в одном из своих полей, которое совпадает со значением Criterion, переданным на страницу из меню поиска.

<?php
  
      $conn = odbc_connect
  ('Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\inetpub\wwwroot\PHPTutorial\Ecommerce\databases\ecommerce.mdb','','');
  
    $sql = "SELECT ItemNumber,ItemTitle,ItemPrice FROM Products WHERE";
    $sql = $sql . " ItemNumber LIKE '%" . $Criterion . "%'";
    $sql = $sql . " OR ItemType LIKE '%" . $Criterion . "%'";
    $sql = $sql . " OR ItemProducer LIKE '%" . $Criterion . "%'";
    $sql = $sql . " OR ItemTitle LIKE '%" . $Criterion . "%'";
   $sql = $sql . " OR ItemDescription LIKE '%" . $Criterion . "%'";
    $sql = $sql . " ORDER BY ItemNumber";
    
 //Выполняется оператор SQL и создается множество записей 
		
  $rs = odbc_exec($conn, $sql);
  
//Цикл по множеству записей и вывод необходимых записей 

 while($row = odbc_fetch_array($rs)) 
	
	{
	
	$ItemNumber = $row[ItemNumber];
	$ItemTitle = $row[ItemTitle];
	$ItemPrice = number_format($row[ItemPrice],2);
	
	
	echo "<tr style=\"color:seagreen; line-height:8pt\"
      onMouseOver=\"this.style.backgroundColor='lightgreen';this.style.color='darkgreen';
        this.style.cursor='hand'\"
      onMouseOut=\"this.style.backgroundColor='white';this.style.color='seagreen'\"
      onClick=\"location.href='detail.php?ItemNumber=$ItemNumber\" .
        \"&Criterion=$Criterion'\">
      <td>$ItemNumber</td>
      <td>$ItemTitle</td>
      <td align=\"right\">$$ItemPrice</td>
    </tr>";

	}

	odbc_close($conn);
  
  ?>
 
  </table>

<?php

}

?>
Пример I.8.

Как можно видеть, единственное реальное различие в двух сценариях состоит в том, что поиск по ключевым словам использует более сложную команду SQL SELECT для поиска подходящих продуктов:

$sql = "SELECT ItemNumber,ItemTitle,ItemPrice FROM Products WHERE";
$sql = $sql . " ItemNumber LIKE '%" . $Criterion . "%'";
$sql = $sql . " OR ItemType LIKE '%" . $Criterion . "%'";
$sql = $sql . " OR ItemProducer LIKE '%" . $Criterion . "%'";
$sql = $sql . " OR ItemTitle LIKE '%" . $Criterion . "%'";
$sql = $sql . " OR ItemDescription LIKE '%" . $Criterion . "%'";
$sql = $sql . " ORDER BY ItemNumber";

Так как получается очень длинный оператор SELECT, то он составлен из отдельных частей. Каждая последующая часть строки поиска присоединяется в конце предшествующей строки для создания всего оператора SELECT в переменной $sql.

Как и раньше, извлекаются только поля ItemNumber, ItemTitle, и ItemPrice. Сам поиск совпадения со значением Criterion происходит по пяти полям записей. Строка критерия может присутствовать в любом месте поля, так как для поиска используется оператор LIKE.

Поэтому если происходит совпадение с частью содержимого полей ItemNumber, ItemType, ItemProducer, ItemTitle, или ItemDescription, то эта запись выбирается.

После извлечения множества записей отдельные поля выводятся как строки таблицы, точно так же, как для поиска по категории. Из этих строк также сделаны ссылки, чтобы передать URL на страницу detail.php, добавляя строку запроса — она содержит ItemNumber вместе со значением Criterion, использование которого будет рассмотрено при обсуждении страницы detail.php.

Давайте теперь посмотрим на законченную страницу search.php.

search.php

<?php
$Category = $_GET[Category];
$Criterion = $_GET[Criterion];

if ($Category == "" && $Criterion == "")

{
 header("Location:home.php");
  
}
  
?>

<html>
<head>
  <title>Сайт eCommerce </title>
  <link href="stylesheetEC.css" rel="stylesheet">
  
  <?php
  require("jscript.inc");
  
  ?>
  
</head>
<body>


<div style="position:absolute; top:0px; left:0px; width:780px; 
  background-color:seagreen; color:white; padding:5px">
  
  <?php
  require("header.inc")
  ?>
  
</div>


<div style="position:absolute; top:75px; left:10px; width:175px">
  
 <?php
  require("menu.inc")
  ?>

</div>

<div style="position:absolute; top:75px; left:200px; width:550px">

<?php If ($Category != "")
{
 ?>
  <span class="head3">Поиск</span>результатов для категории 
  <span class="head3"><?php echo $Category ?></span>:
  <br>
  <br>
  <table border="0" cellpadding="3">
  <tr>
    <th>Item Number</th>
    <th>Item Title</th>
    <th>Item Price</th>
  </tr>
  
  <?php
  
    $conn = odbc_connect
  ('Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\inetpub\wwwroot\PHPTutorial\Ecommerce\databases\ecommerce.mdb','','');
  
  //Формирование оператора SQL SELECT 
		
  $sql = "SELECT ItemNumber,ItemTitle,ItemPrice FROM Products WHERE ItemType = '$Category' ORDER BY ItemNumber";
  
//Выполнение оператора SQL и создание множества записей 
		
  $rs = odbc_exec($conn, $sql);
  
//Цикл по множеству записей и вывод необходимых записей 

 while($row = odbc_fetch_array($rs)) 
	
	{
	$ItemNumber = $row[ItemNumber];
	$ItemTitle = $row[ItemTitle];
	$ItemPrice = number_format($row[ItemPrice],2);
	
	echo "<tr style=\"color:seagreen; line-height:8pt\"
      onMouseOver=\"this.style.backgroundColor='lightgreen';this.style.color='darkgreen';
        this.style.cursor='hand'\"
      onMouseOut=\"this.style.backgroundColor='white';this.style.color='seagreen'\"
      onClick=\"location.href='detail.php?ItemNumber=$row[ItemNumber]\" .
        \"&Category=$Category'\"
      >
      <td>$ItemNumber</td>
      <td>$ItemTitle</td>
      <td align=\"right\">$$ItemPrice</td>
    </tr>";
	
	}
	
	odbc_close($conn);
  
  ?>
  
  </table>
  
<?php

}

 if ($Criterion != "")
 
{
?>

  <span class="head3">Поиск</span>результатов для критерия 
  <span class="head3"><?php echo $Criterion ?></span>:
  <br>
  <br>
  <table border="0" cellpadding="3">
  <tr>
    <th>Item Number</th>
    <th>Item Title</th>
    <th>Item Price</th>
  </tr>
  
  <?php
  
      $conn = odbc_connect
  ('Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\inetpub\wwwroot\PHPTutorial\Ecommerce\databases\ecommerce.mdb','','');
  
    $sql = "SELECT ItemNumber,ItemTitle,ItemPrice FROM Products WHERE";
    $sql = $sql . " ItemNumber LIKE '%" . $Criterion . "%'";
    $sql = $sql . " OR ItemType LIKE '%" . $Criterion . "%'";
    $sql = $sql . " OR ItemProducer LIKE '%" . $Criterion . "%'";
    $sql = $sql . " OR ItemTitle LIKE '%" . $Criterion . "%'";
   $sql = $sql . " OR ItemDescription LIKE '%" . $Criterion . "%'";
    $sql = $sql . " ORDER BY ItemNumber";
   
       //Выполнение оператора SQL и создание множества записей 
		
  $rs = odbc_exec($conn, $sql);
  
//Цикл по множеству записей и вывод необходимых записей 

 while($row = odbc_fetch_array($rs)) 
	
	{
	
	$ItemNumber = $row[ItemNumber];
	$ItemTitle = $row[ItemTitle];
	$ItemPrice = number_format($row[ItemPrice],2);
	
	echo "<tr style=\"color:seagreen; line-height:8pt\"
      onMouseOver=\"this.style.backgroundColor='lightgreen';this.style.color='darkgreen';
        this.style.cursor='hand'\"
      onMouseOut=\"this.style.backgroundColor='white';this.style.color='seagreen'\"
      onClick=\"location.href='detail.php?ItemNumber=$ItemNumber\" .
        \"&Criterion=$Criterion'\">
      <td>$ItemNumber</td>
      <td>$ItemTitle</td>
      <td align=\"right\">$$ItemPrice</td>
    </tr>";
	
	}
	
	odbc_close($conn);
  
  ?>
 
  </table>

<?php

}

?>

</div>

</body>
</html>
Пример I.9.
< Лекция 12 || Дополнительный материал 1: 123456789101112 || Дополнительный материал 2 >
Максим Матросов
Максим Матросов
Наталья Джабасова
Наталья Джабасова