2015-02-23 36 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); 

如果你省略這&然後你的問題。)