【问题标题】:Why does this SQLite transaction with prepared statements not work?为什么这个带有准备好的语句的 SQLite 事务不起作用?
【发布时间】:2016-04-25 00:54:41
【问题描述】:

我正在尝试将 SQLite 事务和准备好的语句结合起来,以获得数千条记录的最佳插入速度。但是,所有插入的行都是空的。

在插入之前打印变量表明它们具有正确的数据并且没有错误。

$db->beginTransaction();
$insert_stmt = $db->prepare("INSERT INTO `table` VALUES (:id, :value2, :value3, :value4)");
$insert_stmt->bindValue(":id", $id);
$insert_stmt->bindValue(":value2", $value2);
$insert_stmt->bindValue(":value3", $value3);
$insert_stmt->bindValue(":value4", $value4);

foreach ($records as $record)
{
  $id = $record["id"];
  $value2 = $record["value2"];
  $value3 = $record["value3"];
  $value4 = $record["value4"];
  $insert_stmt->execute();
  print_r($db->errorInfo()); // print errors
}

$db->commit();
  1. 代码有什么问题?
  2. 如何获得更好的输出?例如,在执行之前打印准备好的语句,看看它是否有问题。

【问题讨论】:

  • table 是您的真实表名还是只是一个示例?如果它真的在backtick 中使用,因为它是mysql 中的保留关键字
  • 在前面的评论之后,value2:value2 的类型吗?
  • "table" 不是真正的表名。反正我加了反引号。 value2,我在清理数据时错过了“:”。已更正。

标签: php sqlite pdo transactions insert


【解决方案1】:

您必须将 bindValue 调用放入您的循环中。

当您执行bindValue 时,这些值会被复制到语句中。之后您用来执行此操作的变量发生了什么都无关紧要。

【讨论】:

  • 所以这个答案是错误的? stackoverflow.com/a/12725863 编辑:刚刚尝试过,你是对的,当我在循环内进行绑定时它可以工作。谢谢!
  • 嗯。我对 PHP 的了解还不够,无法回答这个问题。您可能想对其他答案发表评论。也许我们错过了什么。
猜你喜欢
  • 2015-07-27
  • 1970-01-01
  • 2015-12-07
  • 2020-08-21
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多