我正在使用for循环进行选择。我遇到的问题是我在IN语句中有多个值。我知道IN(term_1, term_2)
我们需要一段时间来分隔每一个。当我使用for循环时,我不知道如何追加句点。首先,它在语句括号内,而不是在最后。
<?php
for ($i = 0; $i <= 8; $i++) {
$stm =$db->prepare("SELECT id FROM sign WHERE term IN (:term_$i) GROUP BY os.user_id order by COUNT(os.user_id) DESC ");
$stm->bindParam(":term_$i", $search_text[$i]);
$stm->execute();
}
?>
答案 0 :(得分:1)
预备语句占位符只能表示单个值。
e.g。
$foo = '1,2,3';
$db->prepare("SELECT ... WHERE foo in (:foo)");
bind(':foo', $foo);
会创建一个被解释为
的查询SELECT ... WHERE foo IN ('1,2,3');
注意引号 - 您的三个单独的数字现在是一个单值字符串,查询运行就好像它已写入:
SELECT ... WHERE foo='1,2,3'
您必须构建动态语句并创建与您拥有的值一样多的占位符。
foreach ($values as $val) {
$placeholders[] = '?';
}
$sql = "SELECT ... WHERE foo IN (" . implode(',', $placeholders) . ")";
...prepare/bind other values
$stmt->execute($values);
答案 1 :(得分:0)
我担心你将不得不采用旧式的方式
$stm ="SELECT id FROM sign WHERE term IN (";
for ($i = 0; $i <= 8; $i++) {
$stm.="'";
$stm.=mysqli_real_escape_string($db,$search_text[$i]);
$stm.="'";
}
$stm.=") GROUP BY os.user_id order by COUNT(os.user_id) DESC ";
$db->query($stm);
答案 2 :(得分:0)
<?php
$sep = ''; $lst = '';
for ($i = 0; $i <= 8; $i++) {
$lst .= $sep."'".$search_text[$i]."'";
}
$stm =$db->query("SELECT id FROM sign WHERE term IN ($lst) GROUP BY os.user_id order by COUNT(os.user_id) DESC ");
while ($row = $stm->fetch()) {
// do something with $row
}
?>
这不使用准备,所以不太安全。您可以尝试使用:term_1, :term_2, ...
创建整个列表,然后准备然后进行绑定 - 这样会更安全,也是您应该去的方向。但希望这个代码示例将向您展示如何动态构建您的SQL。
(如果在循环中绑定,请确保使用
中的引用调用foreach ($search_text as $k=>&$v)
...bindParam($k, $v);
如果你放弃那个&amp;然后你就会遇到问题。)