【问题标题】:Using PDO to make a MySQL search query and display list of results使用 PDO 进行 MySQL 搜索查询并显示结果列表
【发布时间】:2014-06-27 17:43:17
【问题描述】:

正如标题所示,我正在尝试使用 PDO 和 MySQL 显示搜索结果列表...我有一个食谱表,其中包含 recipe_id、名称和描述。我想要一个搜索框,它可以在名称或描述中找到关键字,即“沙拉”或“胡萝卜”,并通过仅显示其名称来返回所有匹配食谱的列表。在我改用 PDO 之前,我有以下代码,它完全符合我的需要:

<?php
include ("dbconnect.php");

if (!isset($_POST['search']))    {
    header("Location:index.php");
}

$search_sql="SELECT * FROM Recipe WHERE name LIKE '%".$_POST['search']."%' OR description LIKE '%".$_POST['search']."%'";
$search_query=mysql_query($search_sql);
if (mysql_num_rows($search_query)!=0) {
    $search_rs=mysql_fetch_assoc($search_query); }
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Untitled Document</title>
</head>
<body>
<h3>Search results</h3>
<?php
if (mysql_num_rows($search_query)!=0) {
    do { ?>
        <p><?php echo $search_rs['name']; ?></p>
    <?php }
    while ($search_rs=mysql_fetch_assoc($search_query));
}
else {
    echo "No results found";
}
?>
</body>
</html>

但是,我在使用 PDO 做同样的事情时遇到了困难......到目前为止,我已经提出了以下代码,但我怀疑我做错了,而且我不知道如何显示实际结果.. .如果有人能提供一些帮助,我将不胜感激,请原谅我对此事的了解不足,我还是新手。

        <?php
include ("dbconnect.php");

if (!isset($_POST['search']))    {
    header("Location:index.php");
}

// keep track post values
$name = "%".$_POST['search']."%";
$description = "%".$_POST['search']."%";

$pdo = Database::connect();
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql ='SELECT * FROM recipe WHERE name LIKE ? OR description LIKE ?';
$q = $pdo->prepare($sql);
$q->execute(array($name,$description));
$data = $q->fetchAll(PDO::FETCH_ASSOC);
Database::disconnect();
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8">
    <link   href="css/bootstrap.min.css" rel="stylesheet">
    <script src="js/bootstrap.min.js"></script>
    <title>Untitled Document</title>
</head>
<body>
<div class="container">
    <div class="row">
        <table class="table table-striped table-bordered">
            <thead>
                 <tr>
                    <th>Search Results</th>
                 </tr>
            </thead>
            <tbody>
    <?php
    if ($data != null) {
        foreach($data as $row)
             {
                 echo '<tr>';
                 echo '<td>'. $row['name'] . '</td>';
                 echo '</tr>';
             }
        }else
             {
                 echo '<td>'. "No results found" .'</td>';
             }?>
            </tbody>
        </table>
    </div>
</div>
</body>
</html>

【问题讨论】:

  • 我对切换到 PDO 并摆脱您在第一个示例中的 SQL 注入漏洞的支持。

标签: php mysql search pdo


【解决方案1】:

您需要将% 放在您的参数上:

 // keep track post values
 $name = "%".$_POST['search']."%";
 $description = "%".$_POST['search']."%";

注意,这通常会执行得很糟糕,因为以% 开头的like 会杀死您在namedescription 上的所有索引。随着数据的增长,您将开始看到放缓。

相反,您可以查看全文搜索选项:http://blog.marceloaltmann.com/en-using-the-mysql-fulltext-index-search-pt-utilizando-mysql-fulltext/

【讨论】:

  • 嗯,我打算保留这些,我无法想象为什么我没有...非常感谢您指出这一点!您对如何显示结果有什么建议吗?我什至需要 foreach 循环吗?
  • @TonyPeitchev 您可以通过将 fetch 替换为 $data = $q-&gt;fetchAll(PDO::FETCH_ASSOC); 来获得结果的关联数组,然后像任何数组 foreach($data as $row){ ...} 一样循环 $date
  • 非常感谢!我已经在主帖中编辑了代码,现在它就像一个魅力:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-29
相关资源
最近更新 更多