2015-02-23 67 views
-1

我使用for循环中的选择。我遇到的问题是我在IN语句中有多个值。我知道IN(term_1, term_2)我们需要一段时间来分隔每一个。当我使用for循环时,我不知道如何附加该句点。首先,它是在括号内而不是在最后。在这种情况下,如何在IN声明中使用循环?

<?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

你不能这样做那。我的意思是,你可以,但是在你的声明中你不会得到更多的价值。用IN语句编写的语句失败。你必须全力以赴,自己摆脱这些价值。 – Halfstop 2015-02-23 21:19:42

+0

谢谢!如果我不使用准备语句或MySQL准备,我还没有尝试过呢。但是当我有时间的时候。谢谢你的时间。 – conan 2015-02-23 21:29:04

+0

@Halfstop - 其实你可以建立从一个简单的数组准备的语句,使用'修剪(str_repeat(“?”,计数($值)),“”)'来设置一个简单的''占位符'? IN'语句,则值传递给绑定为一个数组在'的execute()' – 2015-02-23 21:30:50

回答

1

准备好的语句占位符只能表示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); 
+0

'$ SQL = sprintf的( 'SELECT ...其中foo IN(%S)',内爆( '',array_fill(0,计数($值),)) '?');' – Sammitch 2015-02-23 22:07:56

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); 
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); 

如果你省略这&然后你的问题。)

相关问题