PDO 约束错误 1062,但工作已完成?
PDO Contraint Error 1062, but work is complete?
我有一个奇怪的情况,我的 PDO 语句出现错误,但实际上工作已经完成。
我试图复制 tables,首先删除给定 table 中的旧数据,然后将新数据从临时 tables 写入真实 [=20] =]s.
$tables = array('tbl1', 'tbl2', 'tbl3');
foreach ($tables as $table) {
$temp_table = $table."_temp";
$stmt = $connection->query("DELETE FROM $table");
$stmt->execute();
$stmt = $connection->query("INSERT INTO $table (SELECT * FROM $temp_table)");
$stmt->execute();
}
我在中间放置了一个 sleep 以确保它正常工作并且我的 table 数据被删除然后重写,但我收到以下错误:
Uncaught PDOException: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1' for key 'PRIMARY'
我确定我要么遗漏了某些东西,要么以从未打算完成的方式执行此操作,但我真的不知道是哪个。
有什么想法吗?
虽然这是一个快速简单的修复方法,但我还是将问题留在这里以防其他人遇到此问题。毕竟这个站是用来学习的吧?
在执行准备语句时,需要执行语句,因为您传递的是未知参数。
$stmt = $connection->prepare("INSERT INTO users (`first_name`,`last_name`,`username`)
VALUES (:first_name, :last_name, :username)");
$parameters = array(":first_name" => $user_details['first_name'],
":last_name" => $user_details['last_name'],
":username" => $user_details['username']);
$stmt->execute($paramArray);
但是,在执行标准查询时,不需要执行,因为不需要额外的参数。事实上,添加带有查询的执行只会复制查询。
$stmt = $connection->query("SELECT * FROM users");
有很多关于此的文档,但找到答案并不总是那么容易,而且有些事情(例如)根本没有讨论。这里有一些很好的来源:
我有一个奇怪的情况,我的 PDO 语句出现错误,但实际上工作已经完成。
我试图复制 tables,首先删除给定 table 中的旧数据,然后将新数据从临时 tables 写入真实 [=20] =]s.
$tables = array('tbl1', 'tbl2', 'tbl3');
foreach ($tables as $table) {
$temp_table = $table."_temp";
$stmt = $connection->query("DELETE FROM $table");
$stmt->execute();
$stmt = $connection->query("INSERT INTO $table (SELECT * FROM $temp_table)");
$stmt->execute();
}
我在中间放置了一个 sleep 以确保它正常工作并且我的 table 数据被删除然后重写,但我收到以下错误:
Uncaught PDOException: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1' for key 'PRIMARY'
我确定我要么遗漏了某些东西,要么以从未打算完成的方式执行此操作,但我真的不知道是哪个。 有什么想法吗?
虽然这是一个快速简单的修复方法,但我还是将问题留在这里以防其他人遇到此问题。毕竟这个站是用来学习的吧?
在执行准备语句时,需要执行语句,因为您传递的是未知参数。
$stmt = $connection->prepare("INSERT INTO users (`first_name`,`last_name`,`username`)
VALUES (:first_name, :last_name, :username)");
$parameters = array(":first_name" => $user_details['first_name'],
":last_name" => $user_details['last_name'],
":username" => $user_details['username']);
$stmt->execute($paramArray);
但是,在执行标准查询时,不需要执行,因为不需要额外的参数。事实上,添加带有查询的执行只会复制查询。
$stmt = $connection->query("SELECT * FROM users");
有很多关于此的文档,但找到答案并不总是那么容易,而且有些事情(例如)根本没有讨论。这里有一些很好的来源: