Как проверить добавление в базу в PDO?

Сабж в теме...
Раньше я писал так:
if ( -1 !== mysql_affected_rows() ) {
            echo 'Вы успешно зарегистрированы!';
        } else {
            echo 'Ошибка при регистрации';
        }

В PDO читал есть такая штука как номер последней добавленной записи:
$insertId=$db->lastInsertId();
Но если вставка не удалась она же мне вернёт просто предыдущую и всё...
  • Вопрос задан
  • 4688 просмотров
Решения вопроса 1
rdifb0
@rdifb0
Программист, реалист
Неужели так сложно почитать мануал?
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
Использовать lastInsertId для проверки удалась вставка или нет - плохая идея.
Небольшой пример с php.net

Пример
Example on a new Row: 
<?php 
$sql = "INSERT INTO city (`city`) VALUES ('Paris') ON DUPLICATE KEY UPDATE `city` = 'Paris"; 
$dbh->query($sql); 
echo $dbh->lastInsertId(); 
?> 

Above displays: 1 
Expected display: 1 

Example on an existing row that gets updated: 
<?php 
$sql = "INSERT INTO city (`city`) VALUES ('Paris') ON DUPLICATE KEY UPDATE `city` = 'Paris"; 
$dbh->query($sql); 
echo $dbh->lastInsertId(); 
?> 
Above displays: 2 
Expected display: 1 (since no new records were inserted)


Поведение вызвано тем что innodb всегда увеличивает автоинкрементный счетчик вне зависимости от того удалась вставка или нет.

На мой взгляд если у Вас есть необходимость проверять успешность вставки, лучше использовать транзакции, но и там есть нюансы (пример оттуда же)

<?php 
try { 
    $dbh = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); 

    $stmt = $dbh->prepare("INSERT INTO test (name, email) VALUES(?,?)"); 

    try { 
        $dbh->beginTransaction(); 
        $tmt->execute( array('user', 'user@example.com')); 
        $dbh->commit(); 
        print $dbh->lastInsertId(); 
    } catch(PDOExecption $e) { 
        $dbh->rollback(); 
        print "Error!: " . $e->getMessage() . "</br>"; 
    } 
} catch( PDOExecption $e ) { 
    print "Error!: " . $e->getMessage() . "</br>"; 
} 
?>
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
lastInsertId надо вызывать когда вы удостоверились что данные были записаны в базу. А удостовериться можно банально проверив что при выполнении запроса не возникло ошибок. mysql_affected_rows тут не нужен, достаточно делать проверки на наличие ошибок после exec, а еще лучше - сказать PDO в случае чего выкидывать исключения и обрабатывать их.
Ответ написан
Комментировать
FanatPHP
@FanatPHP
Чебуратор тега РНР
Как проверить добавление в базу в PDO?

По какой-то причне новички этот вопрос задают постоянно.
Но при этом никто не может ответить, ПОЧЕМУ надо проверять успешность вставки.
Только чтобы написать сакраментальную фразу 'Ошибка при регистрации'?

Ну то есть, понятно, что в мануале из прошлого века был код -1 !== mysql_affected_rows(), и его надо обязательно перетащить в новый проект. Но надо иногда задумываься - какой смысл в тех действиях, которые ты совершаешь. Какой юзкейс должен привести к необходимости такой ошибки. И как надо по-человечески её обрабатывать.

Дя тех, кто хочет жить в XXI веке, а не застрять навечно в XX, несколько пояснений:

1. Проверять результат работы функций PDO не нужно никогда.
2. Если хочется вывести сообщение типа "что-то сломалось", надо это не писать после каждой функции, а делать ЦЕНТРАЛИЗОВАННО, в error handler-e
3. Если хочется проверить одну-единственную ошибку, про которую заранее известно, и есть понимание того, как её надо обрабатывать - можно использовать try-catch.

Всё. Кроме этих трёх пунктов никаких проверок на успешность вставки быть не должно
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы