Я с 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'