在这种情况下,如何在in语句中使用for循环


How can I use for loop in a IN statement in this situation?

我使用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);

如果你忽略了这一点&然后你就会遇到问题。)