Программирование поиска по ключевым словам
Поиск по ключевым словам действует почти таким же образом, как и поиск по категории. Основное различие состоит в способе извлечения записей о продуктах из таблицы 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, переданным на страницу из меню поиска.
Пример I.8.
(html, txt)
Как можно видеть, единственное реальное различие в двух сценариях состоит в том, что поиск по ключевым словам использует более сложную команду 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.
Пример I.9.
(html, txt)
{ 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.