Ошибка захвата и продолжение при вставке в уникальный столбец - PullRequest
0 голосов
/ 08 декабря 2010

У меня есть уникальный столбец.Дело в том, что, насколько я понимаю, когда вы пытаетесь вставить в этот столбец некоторые данные, которые нарушают его уникальность, запрос перестанет обрабатываться.Я хочу просто зафиксировать ошибку и продолжить с остальными строками.Как бы вы сделали это наиболее эффективным способом, используя PHP и MySQL?

здесь у вас есть короткий пример http://pastie.org/1357001

, что мне действительно интересно, так это то, что цикл будет разорван, еслиошибка возникает?

Ответы [ 3 ]

2 голосов
/ 08 декабря 2010

Я с ajreal на этом. Нарушение ограничения не должно вызывать исключения в 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 голос
/ 08 декабря 2010
foreach($somethings as $something)
{
    try
    {
       //mysql_query
    }
    catch(Exception $e)
    {
        $failed[] = $e;
        continue;
    }

    //process anything else.
}

Исключения - это путь.

1 голос
/ 08 декабря 2010

Вы должны быть в состоянии отловить эту ошибку:

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