我想在一个包含用户定义的搜索词的表中进行搜索。我这样做是通过拆分构造sql的字符串来实现的。
但我似乎无法使其发挥作用。它工作正常,如果只输入一个单词,但有两个或多个单词就会崩溃。
$q = $_GET['q']; //Search word
$q = htmlspecialchars($q);
$q_exploded = explode ( " ", $q );
foreach( $q_exploded as $search_each ) {
$where .= "content LIKE ? OR ";
$bind .= "s";
$param .= "%$search_each%, ";
}
$where = rtrim($where,'OR ');
$param = rtrim($param,', ');
$sql = "SELECT ads_id FROM search_index WHERE ".$where."";
echo $sql . "<br>".$param."<br>".$bind."<br>";
$stmt = $dbconn->prepare($sql);
$stmt->bind_param($bind, $param);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
echo $row['ads_id'];
}
这是我的错误
SELECT ads_id FROM search_index WHERE content LIKE?或内容喜欢?
%word1%,%word2%
SS
警告:mysqli_stmt :: bind_param():类型定义字符串中的元素数与绑定变量数不匹配
你的问题在这里:
$stmt->bind_param($bind, $param);
你在做的是:
$stmt->bind_param("ss", $param);
虽然您可能希望param满足两个字符串,但您不需要为每个字符串传递变量。我会尝试为此进行爆炸。
有人早些时候发布了一个答案,但又删除了它。这个答案实际上有效,我只需要从mySQLi更改为DPO。
解决方案:$ q = htmlspecialchars($ q); $ q_exploded = explode(“”,$ q);
$where = [];
$bind = [];
foreach ($q_exploded as $idx => $search_each) {
$key = ':val' . $idx;
$where[] = "content LIKE " . $key;
$bind[$key] = "%$search_each%";
}
$sql = "SELECT ads_id FROM search_index WHERE " . implode(" OR ", $where);
$stmt = $pdo_conn->prepare($sql);
$stmt->execute($bind);
$result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
while ($row = $stmt->fetch()) {
echo $row['ads_id'] . "<br>";
}