为什么此查询在 Sequel Pro 中有效,但在 PHP 中无效


Why does this query work in Sequel Pro but not in PHP?

$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 语句中使用一个邮政编码时,db_query工作正常。

我一辈子都想不通为什么会这样。

如果没有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函数在做什么。