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

时间:2015-02-23 21:16:11

标签: php mysql sql for-loop

我正在使用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();
    }

?>

3 个答案:

答案 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;然后你就会遇到问题。)