2011-05-19 51 views
3

我想將一個數組傳遞給$stmt->bind_param作爲IN變量。我怎樣才能做到這一點?MySQLi爲數組綁定參數IN

$values = array('a','b','c','d'); 
$values = '"' . implode('","', $values) . '"'; 

$stmt->prepare('SELECT value1, value2 FROM table1 WHERE value3 IN (?)'); 
$stmt->bind_param('s', $values); 

我不能讓它爲我的生活工作。有什麼想法嗎?上面的代碼只是一個示例。

+0

你可以單獨綁定它們嗎? – alex 2011-05-19 02:50:52

+0

我認爲這是你內爆的方式。 MySQL不喜歡''''(雙引號)。你試過用單引號嗎? – 2011-05-19 02:53:53

+0

@jason我確實用單引號試過了,但沒有去。 – ATLChris 2011-05-19 03:08:53

回答

2

這是以這種方式進行操作的場景不適用。您正在構建實際的SQL(這就是逗號和引號),並將其作爲參數傳入。它基本上評估爲value3 IN ('...')其中...是整個$values

這也是一個關於報價的好消息。 MySQL使用單引號。

您需要單獨使用字符串連接來構建SQL,或者使用多個參數。

EDIT

作爲一個例子:

$values = array('a','b','c','d'); 
$values = "'" . implode("','", $values) . "'"; 
$stmt->prepare('SELECT value1, value2 FROM table1 WHERE value3 IN (' . $values . ')'); 
+0

你可能會提供一些代碼示例或鏈接所以我可以學到更多? – ATLChris 2011-05-19 03:05:19

+0

謝謝,我需要擔心這種方法的SQL注入嗎?我實際工作中的$ values是用戶生成的 – ATLChris 2011-05-19 11:10:36

+0

@ATLChris,在這種情況下,是的,你應該預先逃脫在將它直接插入到查詢中之前,使用'mysqli-> real_escape_string()'自己設置值。 – 2011-05-19 13:37:29

2

通過一些信息參加(也參見:https://stackoverflow.com/a/13253440/165330)。

It can but SHOULD NOT be done。

一種方法可以使用動態變量來提供可自動引用的變量,並使用call_user_func_array爲回調/方法$ stmt-> bind_param()提供動態數量的參數。

<?php 
$values = array('a','b','c','d'); 

$s = substr(str_repeat(' , ?' , count($values)) , 2); 
$stmt->prepare('SELECT value1, value2 FROM table1 WHERE value3 IN (' . $s . ')'); 
# OR array_map in case of different datatypes 
$typeDefintions = str_repeat('s' , count($values)); 
$params = array($typeDefinitions); 
foreach ($values as $k => $v) { 
    ${ 'varvar' . $k } = $v; 
    $params[] = &${ 'varvar' . $k };# provide references 
} 
call_user_func_array(array($stmt , 'bind_param') , $params);