PDO не видит ошибок MySQL, в результате не отрабатывают транзакции

Хон Гиль Дон

Новичок
PDO не видит ошибок MySQL, в результате не отрабатывают транзакции

У меня наблюдается странная ситуация - PDO не реагирует на ошибки MySQL - соответственно пропадает возможность обеспечивать целлостность изменений с помощью транзакций.

К примеру следующий код:

PHP:
try {
  
  $db = new PDO("...my DSN...");
  $db->beginTransaction();
  
  $ins1 = $db->exec("INSERT INTO test (test1, test2) VALUES (1, 1)");
  $ins2 = $db->exec("INSERT INTO test (test1, test2) VALUES (1, 'incorrect value')");
  $db->commit();

}
catch(PDOException $e)
{
  $db->rollBack();
  echo 'Error:'.$e->getMessage();
}

echo ">>$ins1 and $ins2<<";
генерит следующие запросы к базе:
100617 14:40:25 1 Connect root@localhost on test_db
1 Query START TRANSACTION
1 Query INSERT INTO tst (tst1, tst2) VALUES (1, 0)
1 Query INSERT INTO tst (tst1, tst2) VALUES (0, 'incorrect value')
1 Query COMMIT
1 Quit
и такой вывод:
хотя второй инсерт заведомо ошибочный и долже приводить к генерации PDO исключения и последующему rollback.

В результате в базе остаётся результат только первого запроса, соответственно не обеспечиваыется целостность изменений под транзакцией.

Чем тут можно делу помочь?
 

akd

dive now, work later
Команда форума
ну чисто логически
$db = new PDO("...my DSN...");
try {
 

akd

dive now, work later
Команда форума
прям таки как в мануале?
а где у тебя вот это:
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 

Вурдалак

Продвинутый новичок
Автор оригинала: Хон Гиль Дон
Ну изначально у меня так и было, но чтоб было не подкопаться по поводу синтаксиса я оформил всё как в мануале: http://www.php.net/manual/en/pdo.transactions.php :)
— вот как было, так и оставь. Так, как оформлено в мануале, фактически является ошибкой.
 

Хон Гиль Дон

Новичок
Немогу - как было не работает.
А с
PHP:
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
PDO пускает эксепшн и выполняется код блока catch
 

Вурдалак

Продвинутый новичок
Хон Гиль Дон
Я про
PHP:
try {
	$dbh = new PDO(...);
Правильнее
PHP:
$dbh = new PDO(...);
try {
 

akd

dive now, work later
Команда форума
Mols, не пофиг.

прям ру_похапе какое-то :)
 

Вурдалак

Продвинутый новичок
Mols
Неправильно определять переменную в блоке try, а использовать в catch. Например, в данном случае при ошибке соединения $dbh не будет определена, но при этом будет использоваться в catch.

-~{}~ 18.06.10 18:22:

Тем более там вызывается метод.
 

Mols

Новичок
Вурдалак
Хм... угу. Не пофиг. Протупил.))
З.Ы.
Хотя вполне можно и проверить её существование перед использованием.
Всё равно где-то ловить это исключение придётся.
 

iceman

говнокодер
> PDO пускает эксепшн и выполняется код блока catch

и чо говорит?
 
Сверху