2014-08-28 59 views
-2
$zips = array('10583','06890','06854'); 

$list = implode("','",$zips); 

$q = "SELECT site_id FROM site_zipcodes WHERE zipcode IN ('%s')"; 

$result = db_query($q, $list); 

此查詢不會返回任何結果。爲什麼此查詢在Sequel Pro中工作,但不在PHP中?

然而,相同的參數的sprintf返回

SELECT site_id FROM site_zipcodes WHERE zipcode IN ('10583','06890','06854') 

,當我把查詢到續集專業,我得到三個結果(預期的行爲)。

當我在IN語句中使用一個zipcode時,db_query工作得很好。

我不能爲我的生活弄清楚爲什麼會發生這種情況。

+2

如果在傳遞完整的SQL字符串時'db_query()'正常工作,那就太好了。但是我們不能告訴你'($ q,$ list)'不會發生什麼,因爲你沒有共享你的特定的db_query函數。 – mario 2014-08-28 17:10:20

+0

如果sprintf生成有效的SQL查詢,爲什麼不''查詢= sprintf($ q,$ list);'? – 2014-08-28 18:40:11

回答

0

沒有關於db_query函數的定義,不可能說明這不起作用的原因。爲了調試這個,db_query函數可以回顯(或var_dump)發送到數據庫的實際SQL文本。

但很可能,由db_query函數生成的SQL不包括IN列表中的逗號分隔符。逗號分隔符必須是SQL文本的一部分。作爲綁定參數的值的一部分傳入的任何逗號都被認爲是該值的一部分。

如果我們用一個事先準備好的聲明,就像這樣:

SELECT * FROM foo WHERE bar IN (?) 

我們提供'fee','fi','fo','fum'作爲綁定參數的值,這相當於這樣的運行語句:

SELECT * FROM foo WHERE bar IN ('''fee'',''fi'',''fo'',''fum''') 

這樣查詢將只返回其中bar等於該單個字符串的行。實際上等同於:

SELECT * FROM foo WHERE bar = '''fee'',''fi'',''fo'',''fum''' 

要搜索匹配該列表中的一個值的行,使用帶綁定參數的聲明中,SQL文本將需要的形式爲:

SELECT * FROM foo WHERE bar IN (? , ? , ? , ?) 

逗號需要成爲實際SQL文本的一部分。我們會爲四個綁定參數中的每一個提供一個單獨的值。


但同樣,我只是猜測在什麼db_query功能在做什麼。

相關問題