Php MySql在循环中准备语句

Php MySql在循环中准备语句,php,mysql,Php,Mysql,我希望检查表中数组的存储值是否出现。这样的数组: $myarray=array("122","123","124","125"); 我不想在查询中内爆数组,因为它不安全 SELECT ledger FROM mytable WHERE ledger IN('".implode("','",$myarray)."') 为了安全起见,我想找一份事先准备好的声明。我试图在for循环中运行查询,但失败了 $not = sizeof($myarray); for ($i = 0; $i < $n

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

$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;
    }
}
$not=sizeof($myarray);
对于($i=0;$i<$not;$i++){
$qc='从mytable中选择分类账,其中分类账=?';
$st=$mysqli->prepare($qc);
$st->bind_参数(“i”,$myarray[$i]);
$st->execute();
$ro=$st->num\u行;
如果($ro>0){
回音“数字存在”;
打破
}
}
这会引发“对非对象调用成员函数bind_param()”错误。
我相信有更好的方法可以做到这一点。有什么建议吗?

这将为您提供原始查询的参数化版本

$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
,并获取找到的所有
分类账。

chris85,我正在查找表中是否存在数组中的任何值。如果是,是哪一个。您是否尝试过使用单引号的bind_参数,如
$st->bind_参数('i',$myarray[$i])不要做你的
$qc='选择…'
$st=$mysqli->prepare($qc)在循环中,因为它破坏了执行
->prepare()
的部分目的。只有
->bind_param()
->execute()
等在循环内执行。可能重复@肖恩,我按照你的建议试过了。表中有与数组值匹配的记录,但num_行输出0。知道为什么吗?chris85,不需要绑定值吗?execute用占位符绑定值。@sridhar这里的状态是什么?