我正在使用PHP脚本批量插入数据到MySQL表中。如何使脚本跳过任何引发错误的查询并继续执行下一个错误。例如,如果字段slug
接受唯一值,并且我尝试两次插入相同的值,则会抛出duplicate entry for key slug
错误,脚本将停止执行。
如何让它继续下一个陈述?
这是一个代码示例:
for ($row = $begin_row; $row <= $highestRow; $row++) {
$sql = sprintf("INSERT INTO ".$dbprefix."terms (name, slug, term_group) VALUES (%s, %s, %s)",
GetSQLValueString($name, "text"),
GetSQLValueString($slug, "text"),
GetSQLValueString(0, "int"));
$result = mysql_query($sql) or die(mysql_error());
}
答案 0 :(得分:4)
只需删除代码or die(mysql_error());
当你得到mysql_error时,你什么都不做,转到下一个查询。
for ($row = $begin_row; $row <= $highestRow; $row++) {
$sql = sprintf("INSERT INTO ".$dbprefix."terms (name, slug, term_group) VALUES (%s, %s, %s)",
GetSQLValueString($name, "text"),
GetSQLValueString($slug, "text"),
GetSQLValueString(0, "int"));
$result = mysql_query($sql); //possible error thrown, but we will do nothing in this case
}
答案 1 :(得分:1)
如何让脚本跳过任何引发错误的查询
这样做会是一个非常糟糕的主意。如果查询抛出错误,则表示数据错误或代码错误。
查看您提供的代码(它不会批量插入)会导致重复键的错误 - 这可能不是处理中的有效错误 - 要处理此问题,您应该修改代码:
$sql = sprintf("INSERT IGNORE INTO "...
虽然可能有合理的理由忽略其他错误,但您应该只明确忽略您知道的有效案例的错误,例如
if (!$result = mysql_query($sql)) {
$err=mysql_errno();
$msg="error " . $err . "\nin $sql\n\n" . mysql_error();
if (!array_key_exists($err, $aceptable_error) {
die("Failed: $msg");
} else {
print "warning: $msg";
}
}