2015-01-22 2 views
1

У меня есть PHP-скрипт, использующий PDO Transactions.PDO beginTransaction Not Letting Script Execute

$PDO->beginTransaction(); 

$sth = $PDO->prepare("INSERT INTO tbl_last_packing_upload (folderID, subfolderID) VALUES (1, 1)"); 
$sth->execute(); 

По некоторым причинам, это работает локально (в INSERT работает), но не тогда, когда я толкаю его на мой удаленный сервер.

Чтобы получить удаленную работу INSERT, мне нужно положить ее ВЫШЕ $PDO->beginTransaction();. Следующие работы удаленно:

$sth = $PDO->prepare("INSERT INTO tbl_last_packing_upload (folderID, subfolderID) VALUES (1, 1)"); 
$sth->execute(); 

$PDO->beginTransaction(); 

Почему мой INSERT не срабатывают на моем удаленном сервере, когда я это помещается внутри beginTransaction? У меня есть много других PHP-скриптов на одном удаленном сервере с использованием транзакций, и все они работают нормально.

Любые идеи?

+1

У вас есть еще один скрипт, который уже открыл незаблокированную транзакцию на сервере? У вас есть PDO, бросающий полезные ошибки? '$ PDO-> setAttribute (PDO :: ATTR_ERRMODE, PDO :: ERRMODE_EXCEPTION);' –

+0

@MichaelBerkowski Я проверил MySQL с помощью 'show innodb status;' и я не вижу никаких открытых или висячих транзакций. У меня есть эта строка, которую вы упомянули: '$ PDO-> setAttribute (PDO :: ATTR_ERRMODE, PDO :: ERRMODE_EXCEPTION);', но куда будут отправляться эти ошибки, чтобы я мог их просматривать? – FastTrack

+1

Если это находится в 'try/catch', вы, вероятно, поймаете исключение? Если он не находится в try/catch, исключение будет фатальным, и вы можете увидеть его на экране, если вы включили display_errors -'ini_set ('display_errors', 1); 'В противном случае перейдите в журнал ошибок вашего веб-сервера чтобы увидеть детали фатальной ошибки, предположив, что у вас есть 'error_reporting = E_ALL' в php.ini или' error_reporting (E_ALL); ' –

ответ

1

Если ранее не была открыта открытая транзакция ($PDO->beginTransaction()), не должно быть проблем с кодом, опубликованным. Если была открытая транзакция, PDO генерирует исключение при попытке запустить новый.

Вы уже настроили PDO бросать исключения, а не ошибки молча

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

и если сделка и INSERT заявление код обернуты в try/catch блоке, то вам нужно отладить и проверить ошибку попавшего в блок catch.

Ошибка, допущенная в catch (PDOException $e) {...}, сама по себе не войдет в встроенный механизм отчетности об ошибках PHP, поэтому вам нужно заставить ее печатать в месте, которое вы можете прочитать. На веб-сервере производства вы не захотите распечатывать его на экране, поэтому вместо этого я бы рекомендовал записать его в журнал ошибок веб-сервера с помощью PHP error_log() function. Простая запись в лог-файл по умолчанию требует только сообщения в качестве параметра.

try { 
    // everything posted above 
} catch (PDOException $e) { 
    // Caught an error, write it to the log 
    error_log("Error at line " . __LINE__ . " in " . __FILE__ . ": " . $e->getMessage()); 
    // Whatever else you already do to handle the error... 
    // etc... 
} 
+0

Один вопрос: в вашем последнем абзаце вы говорите: «Ошибка, пойманная в' catch ...', не войдет в встроенный механизм отчетности ошибок PHP сам по себе ». Тем не менее, я удалил свой вызов 'error_log' в блоке' catch', и PHP все еще регистрировал ошибку, как если бы у меня был звонок. Есть ли причина для этого? Просто пытаюсь понять ... – FastTrack

+0

@FastTrack Вы используете фреймворк какого-то типа, который, возможно, определил собственную обработку ошибок? Если PDO бросает исключения (а не выдаёт E_WARNING), и вы поймаете эти исключения, они не будут регистрироваться как ошибки. Но если PDO фактически выдаёт предупреждения, а не бросает исключения, они могут регистрироваться. –