一尘不染

MySQL准备的带有可变大小变量列表的语句

mysql

您将如何用PHP编写一个准备好的MySQL语句,每次使用不同数量的参数?这样的查询的示例是:

SELECT `age`, `name` FROM `people` WHERE id IN (12, 45, 65, 33)

IN条款将有不同数量的ids各自运行它时。

我心中有两种可能的解决方案,但想看看是否有更好的方法。

可能的解决方案1 使该语句接受100个变量,并用保证不在表中的伪值填充其余变量;多次调用100多个值。

可能的解决方案2 请勿使用准备好的语句;严格构建并运行查询以检查可能的注入攻击。


阅读 407

收藏
2020-05-17

共1个答案

一尘不染

我可以想到几个解决方案。

一种解决方案可能是创建一个临时表。在表中插入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);

2020-05-17