我使用for循环来选择in。我遇到的问题是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();
}
?>
Prepared语句占位符只能表示SINGLE值。
例如
$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);
恐怕你得用的老方法了
$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);
<?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
}
?>
这不使用prepare,因此不太安全。您可以尝试使用:term_1, :term_2, ...
创建整个列表,然后准备它,然后绑定——这将更安全,也是您应该走的方向。但希望这个代码示例将向您展示如何动态构建sql。
(如果您在循环中绑定,请确保使用中的引用调用
foreach ($search_text as $k=>&$v)
...bindParam($k, $v);
如果你忽略了这一点&然后你就会遇到问题。)