【问题标题】:MySql prepared statements in a loopMySql 在循环中准备语句
【发布时间】:2016-04-08 19:47:03
【问题描述】:

我希望检查表中数组的存储值是否出现。像这样的数组:

$myarray=array("122","123","124","125");

我不想在查询中内爆数组,因为它不安全。

SELECT ledger FROM mytable WHERE ledger IN('".implode("','",$myarray)."')

我想为安全准备好声明。我尝试在 for 循环中运行查询,但失败了。

$not = sizeof($myarray);
for ($i = 0; $i < $not; $i++) {
    $qc = 'SELECT ledger FROM mytable WHERE ledger = ?';
    $st = $mysqli->prepare($qc);
    $st->bind_param("i", $myarray[$i]);
    $st->execute();
    $ro = $st->num_rows;
    if ($ro > 0){
        echo "number exists";
        break;
    }
}

这会引发“在非对象上调用成员函数 bind_param()”错误。 我确信有更好的方法来做到这一点。有什么建议吗?

【问题讨论】:

  • chris85,我正在查看表中是否存在数组中的任何值。如果是,是哪一个。
  • 你试过带单引号的 bind_param,比如$st-&gt;bind_param('i', $myarray[$i]);
  • 不要在循环内使用$qc = 'SELECT ...';$st = $mysqli-&gt;prepare($qc);,因为它违背了使用-&gt;prepare() 的部分目的。只在循环内执行-&gt;bind_param()-&gt;execute() 等。
  • @sean,我按照你的建议尝试了。表中有与数组值匹配的记录,但 num_rows 输出 0。知道为什么吗?

标签: php mysql


【解决方案1】:

这应该为您提供原始查询的参数化版本。

$in = '';
$myarray = array('1', '2', '3');
foreach($myarray as $value) {
    $in .= '?, ';
}
//or $in = str_repeat("?, ", count($myarray)); in place of foreach
$query = 'SELECT ledger FROM mytable';
if(!empty($in)) {
    $in = '(' . rtrim($in, ', ') . ')';
    $query .= " where ledger IN $in";
}
echo $query;
//$st = $mysqli->prepare($query);
//$st->execute($myarray);
//$ro = $st->num_rows;

输出:

SELECT ledger FROM mytable where ledger IN (?, ?, ?)

然后您可以对结果执行fetch 并获取所有找到的ledgers

【讨论】:

  • chris85,不需要绑定值吗?
  • 执行将值与占位符绑定。
  • @sridhar 这里的状态是什么?
猜你喜欢
  • 2023-03-23
  • 2018-08-29
  • 2014-06-29
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2012-07-07
  • 1970-01-01
相关资源
最近更新 更多