当前位置:  开发笔记 > 编程语言 > 正文

MySQL Prepared具有可变大小变量列表的语句

如何解决《MySQLPrepared具有可变大小变量列表的语句》经验,为你挑选了2个好方法。

你会如何在PHP中编写一个准备好的MySQL语句,每次都需要不同数量的参数?这种查询的一个例子是:

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

IN子句id每次运行时都会有不同数量的s.

我脑子里有两种可能的解决方案,但想看看是否有更好的方法.

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

可能的解决方案2不要使用准备好的声明; 构建并运行查询严格检查可能的注入攻击.



1> Zoredache..:

我能想到几个解决方案.

一种解决方案可能是创建临时表.为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);


@orrd,meh ...当我写这个答案的时候,我试图让它变得冗长,所以很容易理解.我同意,它可以简化,但我不认为你建议的简化会使答案更容易理解,或者对性能有任何重大影响.在任何情况下,我都会更新我的答案并为您添加一个紧凑版本.

2> Gumbo..:

还有一个FIND_IN_SET函数,其第二个参数是逗号分隔值的字符串:

SELECT age, name FROM people WHERE FIND_IN_SET(id, '12,45,65,33')


问题是:它不会使用主索引,在每行执行FIND_IN_SET时默认为全表扫描.
推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有