2012-05-14 2 views
2

есть ли существенное различие между PHP 5.4 и 5.2.13 для следующего кода? Он работает с PHP 5.4 (& mysql 5.1.62), при этом не отображается ошибка и выполняется запрос. Однако с 5.2.13 (& MySQL 5.1.3.0) он не показывает какую-либо ошибку (она не попадает в к блоку улова), но эти данные не включены в базу данныхPHP PDO и транзакции - различное поведение на PHP 5.4 и PHP 5.2.13

$db = new PDO(DHOST, DUSER, DPASS, array(PDO::ATTR_PERSISTENT => true, PDO::ATTR_EMULATE_PREPARES => true)); 
     $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 

try { 
     $db->beginTransaction(); 
     $db->exec($insertString); 
     $db->commit(); 
    } catch (Exception $e) { 
     try { 
      $db->rollBack(); 
      throwDbError($handler->errorInfo()); 
     } catch (Exception $e2) { 
      ... 
     } 
    } 

Если я ommit строки с beginTransaction и commit, он также работает в PHP 5.2, но мне нужны транзакции. Обе таблицы в базах mysql используют InnoDB

+2

Строка 'DB_DAO :: $ db-> setAttribute (PDO :: ATTR_ERRMODE, PDO :: ERRMODE_WARNING);' выглядит подозрительно. Может ли 5.4 использовать режим ошибки исключения? –

+0

извините, старый фрагмент кода – ladar

ответ

1

Режим ошибки не установлен для исключения исключений. Изменение:

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 

To:

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

Там не должно быть никакой заметной разницы между этими двумя версиями PHP.

+0

Спасибо, после этого я получил «исключение PDO: невозможно выполнить запросы, пока другие небуферизованные запросы активны». Не знаю, в чем разница, но, по крайней мере, я нашел проблему и сделал некоторое обходное решение. – ladar

+0

Может быть разница в библиотеках mysqlclient, с которыми она связана. Не уверен, но я рад, что вы нашли обходной путь :) –

0

Вы должны поймать PDOException, а не Exception.

+1

Все классы исключений проистекают из Exception –

+0

@Narf, хотя это может быть лучше, оно не решает проблему. –