您将如何用 PHP 编写一条准备好的 MySQL 语句,每次使用不同数量的参数?此类查询的一个示例是:
SELECT `age`, `name` FROM `people` WHERE id IN (12, 45, 65, 33)
每次运行时,IN
子句都会有不同数量的 id
。
我有两种可能的解决方案,但想看看是否有更好的方法。
可能的解决方案 1 让语句接受 100 个变量并用保证不在表中的虚拟值填充其余部分;多次调用超过 100 个值。
可能的解决方案 2 不要使用准备好的语句;构建并运行查询,严格检查是否存在可能的注入(inject)攻击。
最佳答案
我能想到几个解决方案。
一个解决方案可能是创建一个临时表。为 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);
关于php - 具有可变大小变量列表的 MySQL 准备语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/327274/