PHP mysqli重用准备好的语句-数组

PHP mysqli重用准备好的语句-数组,php,mysqli,Php,Mysqli,我有一个脚本,它将一个行数组插入数据库,其中每一行由一个子数组表示。最近,我意识到我在PHP/MySQLi中错误地使用了prepared语句,因为我在遍历大数组时重新准备了相同的语句。然后,我将代码转换为以下内容: $t = reset($data); $stmt = $con->prepare("INSERT INTO tlist VALUES (?,?,?)"); $stmt->bind_param('isi',$t['id'],$t['flag'],$t['cost']); f

我有一个脚本,它将一个行数组插入数据库,其中每一行由一个子数组表示。最近,我意识到我在PHP/MySQLi中错误地使用了prepared语句,因为我在遍历大数组时重新准备了相同的语句。然后,我将代码转换为以下内容:

$t = reset($data);
$stmt = $con->prepare("INSERT INTO tlist VALUES (?,?,?)");
$stmt->bind_param('isi',$t['id'],$t['flag'],$t['cost']);
foreach ($data as $t) {
    $stmt->execute();
}
$stmt->close();
$con->close();
但是,现在它尝试在循环的每次迭代中在
$t
的第一个子数组中插入值。我做错了什么?有没有一种方法可以在不必首先将子数组的值手动分配到标准变量的情况下保持已准备语句的性能提高

编辑:尝试删除重复标记

$question_marks = '';
$types = '';
$values = array();

foreach ($data as $t) {
  if(!empty($question_marks)){
    $question_marks.= ',';
  }
  $question_marks.= "(?,?,?)";
  $types.= 'isi';
  $values[] = $t['id'];
  $values[] = $t['flag'];
  $values[] = $t['cost'];
}
array_unshift($values,$types);
$query = "INSERT INTO `tlist` (`id`,`cost`,`flag`) VALUES ".$question_marks;
$statement = $con->prepare($query);
$ref = new ReflectionClass('mysqli_stmt');
$method = $ref->getMethod("bind_param");
$method->invokeArgs($statement,$values);
$statement->execute();
$statement->close();
类似的东西
已编辑:在我的示例中,连接变量为$db->更改为您的->$con

类似的东西

编辑:在我的示例中,连接变量是$db->更改为您的->$con

您在foreach循环之前声明绑定变量。 如果将“自动提交”设置为false,则可以真正发挥其潜力

$t = reset($data);
$stmt = $con->prepare("INSERT INTO tlist VALUES (?,?,?)");
$stmt->bind_param('isi', $id, $flag, $cost);

$con->autocommit(false);

foreach ($data as $t):

    $id   = $t['id'];
    $flag = $t['flag'];
    $cost = $t['cost'];

    $stmt->execute();

endforeach;

$stmt->close();

$con->commit();
$con->close();

在foreach循环之前声明绑定变量。 如果将“自动提交”设置为false,则可以真正发挥其潜力

$t = reset($data);
$stmt = $con->prepare("INSERT INTO tlist VALUES (?,?,?)");
$stmt->bind_param('isi', $id, $flag, $cost);

$con->autocommit(false);

foreach ($data as $t):

    $id   = $t['id'];
    $flag = $t['flag'];
    $cost = $t['cost'];

    $stmt->execute();

endforeach;

$stmt->close();

$con->commit();
$con->close();

在foreach循环中绑定参数!?抱歉,我的配音标志错误,可能重复。无法收回:/在这个doc()示例中#1显示可以在执行之间更改参数,而无需重新绑定它们……这可能会有帮助:在foreach循环中绑定参数!?抱歉,我的配音标志错误,可能重复。无法收回:/在这个doc()示例中#1显示参数可以在执行之间更改,而无需重新绑定…这可能会有帮助: