PHP准备了多个LIKE条件的SQL

问题描述 投票:0回答:2

我想在一个包含用户定义的搜索词的表中进行搜索。我这样做是通过拆分构造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():类型定义字符串中的元素数与绑定变量数不匹配

php mysql
2个回答
0
投票

你的问题在这里:

$stmt->bind_param($bind, $param);

你在做的是:

$stmt->bind_param("ss", $param);

虽然您可能希望param满足两个字符串,但您不需要为每个字符串传递变量。我会尝试为此进行爆炸。


0
投票

有人早些时候发布了一个答案,但又删除了它。这个答案实际上有效,我只需要从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>";
}
© www.soinside.com 2019 - 2024. All rights reserved.