你会如何在PHP中编写一个准备好的MySQL语句,每次都需要不同数量的参数?这种查询的一个例子是:
SELECT `age`, `name` FROM `people` WHERE id IN (12, 45, 65, 33)
该IN
子句id
每次运行时都会有不同数量的s.
我脑子里有两种可能的解决方案,但想看看是否有更好的方法.
可能的解决方案1使语句接受100个变量,并使用保证不在表中的虚拟值填充其余变量; 多次调用超过100个值.
可能的解决方案2不要使用准备好的声明; 构建并运行查询严格检查可能的注入攻击.
我能想到几个解决方案.
一种解决方案可能是创建临时表.为in子句中的每个参数插入表中.然后对临时表进行简单连接.
另一种方法可能是做这样的事情.
$dbh=new PDO($dbConnect, $dbUser, $dbPass); $parms=array(12, 45, 65, 33); $parmcount=count($parms); // = 4 $inclause=implode(',',array_fill(0,$parmcount,'?')); // = ?,?,?,? $sql='SELECT age, name FROM people WHERE id IN (%s)'; $preparesql=sprintf($sql,$inclause); // = example statement used in the question $st=$dbh->prepare($preparesql); $st->execute($parms);
我怀疑,但没有证据证明第一个解决方案对于较大的列表可能更好,而后者适用于较小的列表.
为了让@orrd满意,这是一个简洁的版本.
$dbh=new PDO($dbConnect, $dbUser, $dbPass); $parms=array(12, 45, 65, 33); $st=$dbh->prepare(sprintf('SELECT age, name FROM people WHERE id IN (%s)', implode(',',array_fill(0,count($parms),'?')))); $st->execute($parms);
还有一个FIND_IN_SET
函数,其第二个参数是逗号分隔值的字符串:
SELECT age, name FROM people WHERE FIND_IN_SET(id, '12,45,65,33')