1

我正在使用 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());
}
4

2 回答 2

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
}
于 2013-06-07T13:12:23.520 回答
2

如何使脚本跳过任何引发错误的查询

这样做将是一个非常糟糕的主意。如果查询抛出错误,则要么存在错误数据,要么您的代码错误。

查看您提供的代码(它不会批量插入),它将为重复键引发错误 - 这可能不是处理中的有效错误 - 要处理此问题,您应该修改代码:

$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";
        }
    }
于 2013-06-07T13:22:42.937 回答