使用pdo在php中搜索功能

时间:2017-03-21 13:42:59

标签: php mysql search pdo

我的任务是为我的团队项目构建一个非常简单的搜索功能,我目前陷入困境,不能再进一步了!

我们的想法是搜索关键字(例如黄金,手表,皮革),当您点击搜索时,它应该向数据库发送选择查询。

我展开了get数组并从空格中修剪它并将%放在单词周围,然后我将它们打成一个名为$searchQuery的字符串。

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

下面,您将找到我的代码。第一个是表单,secon一个是搜索功能。任何帮助将不胜感激!

<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>

1 个答案:

答案 0 :(得分:0)

您的代码充满了错误。

首先$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);