2012-11-12 47 views
2

我準備好的查詢提供params用於在SELECT與看起來是這樣的:如何mysqli的

$sql = "SELECT $t1.id FROM $t1 WHERE $t1.name IN (?)"; 

當我嘗試:

$stmt = Sql::$select->prepare($sql); 
    $string="'aaa','bbb','ccc'"; 
    $stmt->bind_param('s', $string); 

...它沒有返回預期的結果。它將字符串視爲一個名稱,而不是多個單獨的名稱。它如何解決?

功能的其餘部分:

$stmt->execute(); 
    $stmt->store_result(); 
    return $stmt; 
+1

我已經準備語句沒有現成的經驗,但我已經經歷過,而這個問題使用存儲過程可能需要綁定IN語句中的每個參數 – Khaleel

+0

我想我明白你的意思@KhaleelAKarim,但我無法做到 - 字符串中的名字數量未知 –

+0

什麼是'Sql' ?,假設'Sql :: $ select'是你的連接對象,'Sql :: $ select-> error'中的消息(準備之後)是什麼? –

回答

0

嘗試改變這樣的查詢

$sql = "SELECT $t1.id FROM $t1 WHERE FIND_IN_SET($t1.name, ?)>0"; 
$stmt = Sql::$select->prepare($sql); 
$string='aaa,bbb,ccc'; 
$stmt->bind_param('s', $string); 

而且這個解決方案是不可靠的。 請參閱 FIND_IN_SET(str,strlist)

正確的方法是對IN語句中的每個元素使用單獨的佔位符。

另一個建議是,擺脫IN語句並在php中運行循環來生成查詢並綁定參數。

+0

它不會帶來結果(仍然將字符串視爲一個長名稱..) –

+0

http://www.sqlfiddle.com/#!2/8bebb/3 – Khaleel

-2

的問題是,與「S」威脅的參數爲一個字符串,該bind_param功能,所以它基本上是將您的查詢:

"SELECT $t1.id FROM $t1 WHERE $t1.name IN (''aaa','bbb','ccc'')"; 

速戰速決將是改變字符串變量:

$string="aaa','bbb','ccc"; 

注:無前/後引號(你可以使用使這個trim($string, "'")

您也可以嘗試反轉引號:使用"而不是'如果這不起作用。

更可靠和更可靠的解決方案是改變查詢incude一個?每個字符串(使用數組與expolode()/implode() PHP函數。

+3

對不起,但您已嚴重誤解準備語句的工作方式。 –

+0

也無法完成這項工作...... –