捕获错误并在插入唯一列时继续

时间:2010-12-07 21:12:57

标签: php mysql insert unique

我有一个独特的专栏。根据我的理解,当您尝试将某些数据插入到违反其唯一性的列中时,查询将停止处理。我想做的只是捕获错误并继续其余的行。你会如何使用PHP和MySQL以最有效的方式做到这一点?

这里有一个简短的例子 http://pastie.org/1357001

我真正想知道的是,如果发生错误,循环会被破坏吗?

3 个答案:

答案 0 :(得分:2)

我和这个人在一起。违反约束不应该在PHP中导致异常。您只需测试mysqli_stmt::execute的返回值,或者您正在使用的任何值,并处理已发生的任何错误:

$mysqli = new mysqli('host', 'user', 'password', 'db');

// Prepare an INSERT;
$stmt = $mysqli->prepare('INSERT INTO mytable (id, data) VALUES (?, ?)');
$data = 'Some data';

// Insert 3 rows.
for ( $id = 1; $id <= 3 ; $id++ ) {

    // Attempt to insert each row twice.
    for ( $test = 1; $test <= 2; $test++ ) {

        // Bind the ID and data.
        $stmt->bind_param('is', $id, $data);

        // Execute the statement.
        if ( $stmt->execute() ) {
            // No error.
            echo "Inserted row ID $id\n";
        } else {
            // An error, but no exception.
            printf(
                "Error %d inserting row ID %d: %s\n",
                $stmt->errno,
                $id,
                $stmt->error
            );
        }
    }    
}

打印:

Inserted row ID 1
Error 1062 inserting row ID 1: Duplicate entry '1' for key 'PRIMARY'
Inserted row ID 2
Error 1062 inserting row ID 2: Duplicate entry '2' for key 'PRIMARY'
Inserted row ID 3
Error 1062 inserting row ID 3: Duplicate entry '3' for key 'PRIMARY'

答案 1 :(得分:1)

你应该能够发现这个错误:

try {
    // execute SQL query for one record
} catch(Exception $e) {
    // handle error here
}

答案 2 :(得分:1)

foreach($somethings as $something)
{
    try
    {
       //mysql_query
    }
    catch(Exception $e)
    {
        $failed[] = $e;
        continue;
    }

    //process anything else.
}

例外是要走的路。