PHP在循环中覆盖错误并继续下一个语句

时间:2013-06-07 13:09:44

标签: php mysql

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

2 个答案:

答案 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";
        }
    }