【问题标题】:Search function in php using pdo [duplicate]使用pdo在php中搜索功能[重复]
【发布时间】:2023-03-03 01:56:01
【问题描述】:

我的任务是为我的小组项目构建一个非常简单的搜索功能,但我目前陷入困境,无法再继续!

这个想法是使用关键字(例如黄金、手表、皮革)进行搜索,当您点击搜索时,它应该向数据库发送一个选择查询。

我分解了 get 数组并将其从空格中删除并在单词周围放置 %,然后我将它们分解为一个名为 $searchQuery 的字符串。

我与数据库建立了连接,当我搜索一个单词(例如,仅黄金或手表)时,它的效果很好,并且给了我期望的结果,但是一旦有多个单词,它只是说“未找到产品”。

下面是我的代码。第一个是表格,第二个差不多是搜索功能。任何帮助将不胜感激!

<form action="index.php?action=search" method="get">

    <input type="text" name="q">
    <button type="submit">Sök</button>

</form>

搜索功能代码

<?php
 var_dump($_GET['q']);

 $query = explode(",", $_GET['q']);
 var_dump($query);
 $searchQuery = array();

foreach($query as $question) {
  $question = trim($question);
  $question = "%".$question."%";
  $searchQuery[] = $question;
}

echo "<pre>";
var_dump($searchQuery);
echo "</pre>"; 

$searchQuery = implode(' AND title LIKE ', $searchQuery);

echo "<pre>";
var_dump($searchQuery);
echo "</pre>";

$sql = "SELECT * FROM products WHERE title LIKE :search";
$stmt = $conn->prepare($sql);
$stmt->bindParam(':search', $searchQuery);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);

echo "<pre>";
var_dump($result);
echo "</pre>";

$count = $stmt->rowCount();
?> 

<ul>
<?
 if($count == 0) {
   echo "Inga produkter hittades";
 } else {
 foreach ($result as $product) {
    echo "<li>";
    echo $product['title'].", ".$product['price'].":-";
    echo "</li>";
  }
}

?>
</ul>

【问题讨论】:

  • 你的 AND 应该是 OR 吗?
  • 我尝试用 OR 替换 AND,但它仍然不会给我任何东西。感谢您的回答!
  • 您还需要将查询与占位符分开。就目前而言,您将查询的 AND title LIKE 部分作为要过滤的值传递。占位符不是替代连接函数。
  • ?action=search 你也没有使用 PHP 正在寻找 $_GET['action'] 数组并等于“搜索”的部分。
  • 我想我明白你的意思,但你能进一步解释一下吗? AND title LIKE 不应该在 implode 函数中?编辑: ?action=search 正常工作,$_GET['action'] 通过索引页“连接”

标签: php mysql search pdo


【解决方案1】:

您的代码充满错误。

首先$question = "%".$question."%"; 将生成LIKE %some% - sql 中的错误。应该是$searchQuery[] = "'%".trim($question)."%'";

第二次你的WHERE title LIKE :search 将整个AND LIKE '%asd%' AND LIKE '%sdf%' 放入单个参数中,并将被解析为字符串。即使这部分可以工作,您也会遇到查询WHERE title LIKE AND LIKE '%asd%' AND LIKE '%sdf%' - 另一个 sql 错误。


我认为你的代码应该是这样的

$likes = [];

foreach($query as $question) {
    $likes[] = "'%".trim($question)."%'";
}

$sql = "SELECT * FROM products";

if (!empty($likes)) {
   $sql .= " WHERE title LIKE "
       .array_shift($likes) // remove first element from array
       .implode(" OR title LIKE ", $likes); // implode rests with 'OR'
}

$stmt = $conn->prepare($sql);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);

【讨论】:

  • 是的!现在可以开始工作了!非常感谢!
  • @KarlEdenstål 这个答案违背了准备语句的目的并使您的代码容易受到 SQL 注入
  • @Your Common Sense 我可以在你的 PDO 教程中阅读更多关于准备好的语句吗?我刚刚开始使用搜索功能,我一定会努力使它更安全!作为初学者很有趣!感谢您的提醒!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-02
  • 1970-01-01
  • 2014-08-25
  • 1970-01-01
  • 1970-01-01
  • 2012-06-28
相关资源
最近更新 更多