您将如何用PHP编写一个准备好的MySQL语句,每次使用不同数量的参数?这样的查询的示例是:
SELECT age
, name
FROM people
WHERE id IN (12, 45, 65, 33) 该IN条款将有不同数量的ids各自运行它时。
我心中有两种可能的解决方案,但想看看是否有更好的方法。
可能的解决方案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);我可以想到几个解决方案。
一种解决方案可能是创建一个临时表。在表中插入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);我可以想到几个解决方案。
一种解决方案可能是创建一个临时表。在表中插入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);来源:stack overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。