Зважаючи на те, що найбільш рекомендований режим помилок для PDO є ERRMODE_EXCEPTION
, пряма execute()
перевірка результатів ніколи не працюватиме . Оскільки виконання коду навіть не досягає умови, запропонованої в інших відповідях.
Отже, є три можливих сценарії для обробки результату виконання запиту в PDO:
- Щоб визначити успіх, перевірка не потрібна. Просто дотримуйтесь потоку програм.
- Щоб вирішити несподівану помилку, дотримуйтесь тієї самої - не потрібний негайний код обробки. У випадку помилки в базі даних буде викинуто виняток, і це буде перетворюватися на оброблювач помилок на рівні сайту, що призведе до загальної сторінки 500 помилок.
- Для обробки очікуваної помилки, як дублікату первинного ключа, і якщо у вас є певний сценарій для обробки цієї конкретної помилки, тоді використовуйте
try..catch
оператора.
Для звичайного користувача PHP це звучить дещо чужо - як це, а не для перевірки прямого результату операції? - але саме так працюють винятки - ви перевіряєте помилку десь в іншому місці. Раз назавжди. Надзвичайно зручно.
Отже, у двох словах: у звичайному коді вам взагалі не потрібна помилка. Просто збережіть свій код таким, як є:
$stmt->bindParam(':field1', $field1, PDO::PARAM_STR);
$stmt->bindParam(':field2', $field2, PDO::PARAM_STR);
$stmt->execute();
echo "Success!"; // whatever
Про успіх він вам це скаже, при помилці - звичайну сторінку помилок, яку ваша програма показує з такого приводу.
Тільки у випадку, якщо у вас є сценарій обробки, відмінний від просто повідомлення про помилку, помістіть оператор вставки в try..catch
оператор, перевірте, чи була ця помилка очікуваною, та обробіть її; або - якщо помилка була якоюсь іншою - повторно викиньте виняток, щоб зробити можливим обробку загальнодоступного обробника помилок. Нижче наведено приклад коду з моєї статті про обробку помилок за допомогою PDO :
try {
$pdo->prepare("INSERT INTO users VALUES (NULL,?,?,?,?)")->execute($data);
} catch (PDOException $e) {
if ($e->getCode() == 1062) {
// Take some action if there is a key constraint violation, i.e. duplicate name
} else {
throw $e;
}
}
echo "Success!";
У наведеному вище коді ми перевіряємо конкретну помилку, щоб виконати певні дії, і повторно викидаємо виняток для будь-якої іншої помилки (наприклад, такої таблиці немає), про яку буде повідомлено програмісту.
Знову ж таки - просто сказати користувачеві щось на кшталт "Ваша вставка успішна" жодна умова ніколи не потрібна.