$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可以正常工作。
我不能为我的生活找出原因。
答案 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
函数在做什么。