2013-02-21 41 views
0

我遇到了一段PHP代碼(PHP 5),我正在運行SQL查詢(Transact SQL)。PHP MSSQL(Transact-SQL) - 使用IN子句和數組中的多個值的參數化查詢

的代碼(這是不工作):

$query = " 
    UPDATE my_table 
    SET my_column = 'some_value' 
    WHERE my_id IN (?);" // does not work :-(
sqlsrv_query($my_connection, $query, array('abc', 'def', 'ghi')); // does not work :-(

我所試圖做的事:在my_column更新MY_TABLE與添加my_id等於ABC,DEF和GHI行。

然而,當我寫的不帶參數(這工作)相同的SQL查詢:

$query = " 
    UPDATE my_table 
    SET my_column = 'some_value' 
    WHERE my_id IN ('abc', 'def', 'ghi');" // works :-) 
sqlsrv_query($my_connection, $query); // works :-) 

我試圖這樣

sqlsrv_query($my_connection, $query, array('abc', 'def', 'ghi')); 

執行sqlsrv_query命令這樣

sqlsrv_query($my_connection, $query, array(array('abc', 'def', 'ghi'))); 

和這樣的

sqlsrv_query($my_connection, $query, 'abc', 'def', 'ghi'); 

他們都沒有工作。

有人可以幫我嗎?我對這本手冊有很好的閱讀。並寫這樣的SQL

... WHERE my_id IN (?,?,?)... 

是不是一個選項,因爲我的數組將包含可變數量的值!

謝謝!

+2

'$ query =「UPDATE ... WHERE my_id IN(」。implode ',',array_fill(0,count($ ids),'?'))。「)」;'輕鬆處理多個綁定參數。 – 2013-02-21 19:30:41

+0

嗨科林,謝謝你的回答!通過imploding我的ID數組 - 我仍然從你的解決方案中獲得一個SQL注入安全的「參數化查詢」?看起來不像我(也許我錯了) - 你能解釋一下嗎?!謝謝! – Sebastian 2013-02-21 19:34:36

+1

我不會影響你的數組ID。我創建了一串用逗號分隔的問號(佔位符)。如果你照常綁定,你仍然可以獲得綁定參數的所有好處! – 2013-02-21 19:36:54

回答

0

試試這個:

$params = array('abc', 'def', 'ghi'); //assume it dinamic 
$query = " 
UPDATE my_table 
SET my_column = 'some_value' 
WHERE my_id IN ("; 
$inside = ""; 
foreach ($params as $key => $value) { 

$inside = $inside."?,"; 
} 

$inside = trim ($inside,","); 
$query = $query.$inside.");"; 

sqlsrv_query($my_connection, $query, $params); 

PS:現在的代碼可以處理一個DINAMIC陣列XD

Saludos;)

+0

嗨羅伯特,非常感謝你的幫助!我知道,這工作 - 但不工作,如果我params數組持有一個動態變化的數量的關鍵(即:如果$ params = array('abc','def');我不得不改變? ,?);「...;) – Sebastian 2013-02-21 19:41:37

+0

正在編輯....等待XD – Hackerman 2013-02-21 19:55:13

+0

羅伯特,感謝您的幫助 - 我已經找到了它(請參閱上面的Colins和ESDictors答案的摘要) – Sebastian 2013-02-22 10:14:52

1

我只是處理同樣的問題,只是在Visual Studio。首先,我創建了一串參數添加到SQL語句中。你只需要對付問號,這麼多的我做了什麼比你更需要的(?):

string[] inClause = new string[keywordTerms.Length]; 

for (int i = 0; i < keywordTerms.Length; i++) 
    inClause[i] = ":keyword" + i.ToString("00"); 

然後創建我的選擇的時候,我把以下內容:

sqlStatement += "WHERE kw.keyword IN (" + String.Join(", ", inClause) + ")" 

最後,我在此代碼中添加了參數:

for (int i = 0; i < keywordTerms.Length; i++) 
    cmd.Parameters.Add(inClause[i], OracleDbType.Varchar2, 20, "keyword").Value = keywordTerms[i]; 

希望對您有所幫助!

+0

您好,這是非常感謝!因爲它基本上與Colin指出的解決方案基本相同。基本上,您在SQL語句中添加了相同數量的「:keyword」佔位符,您稍後通過添加我希望能在我的SQL語句中找到只有一個「:keyword」的解決方案,並希望MSSQL足夠聰明,可以讓ONE:關鍵字具有多個值!但是,嗨,您的解決方案也可以運行!謝謝:-) – Sebastian 2013-02-21 19:48:35

+0

我知道你的感受,但經過很多搜索我提出了這種方法,它的工作和我所希望的一樣。祝你好運! – ESDictor 2013-02-21 19:53:23

+0

再次感謝,非常感謝您的幫助! – Sebastian 2013-02-21 19:55:15

0

的回答我的問題是由科林和ESDictor給出:

$params = array('abc', 'def', 'ghi'); 
$query = " 
    UPDATE my_table 
    SET my_column = 'some_value' 
    WHERE my_id IN (" . implode(',', array_fill(0, count($params), '?')) . ");" // works like a charm 
sqlsrv_query($my_connection, $query, $params); 

謝謝你們!我想特別提出你的回答,科林,(但不能因爲你'剛剛'評論.ESDictors的回答基本上是一樣的!