php - 具有可变大小变量列表的 MySQL 准备语句

标签 php sql mysql prepared-statement

您将如何用 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/

相关文章:

php - 如何检查请求是否来自google、facebook、twitter和bing爬虫?

mysql - SQL行到列?

mysql - SQL:显示接下来 2 个周末的事件

php - 在以下场景中如何将表格从 php 文件打印到 TCPDF?

php - MySQL 查找时间片中的日期间隙

php - 如何添加每天和总访客计数器

javascript - Ajax 和 JavaScript,如何*不*使用 JQuery 来 POST 数组?

php - 在 MySQL 查询中使用 PHP 变量

javascript - 尝试将法语/英语文本更新到 mysql 数据库时出错

sql - oracle地理编码查询真的很慢,我如何优化动态字段?