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