为什么这个查询在Sequel Pro中工作但在PHP中不起作用?

时间:2014-08-28 17:06:35

标签: php mysql

$zips = array('10583','06890','06854');

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

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

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

此查询不返回任何结果。

但是,具有相同参数的sprintf将返回

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

当我将该查询放入Sequel Pro时,我得到三个结果(预期的行为)。

当我在IN语句中使用一个zipcode时,db_query可以正常工作。

我不能为我的生活找出原因。

1 个答案:

答案 0 :(得分:0)

如果没有db_query函数的定义,就无法说明为什么这不起作用。为了进行调试,db_query函数可以回显(或var_dump)发送到数据库的实际SQL文本。

但很可能,db_query函数生成的SQL不包含IN列表中的逗号分隔符。逗号分隔符必须是SQL文本的一部分。任何作为bind参数值的一部分传入的逗号都被视为值的一部分。

如果我们使用准备好的声明,如下:

SELECT * FROM foo WHERE bar IN ( ? )

我们提供 'fee','fi','fo','fum' 作为bind参数的值,这相当于运行语句,如下所示:

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函数在做什么。