Placido
Наблюдаю
Пытаюсь разобраться с подготовленными выражениями + транзакциями в PDO. Возникли сложности.
Суть проблемы. Есть код
Ситуации:
1. Если SQL корректный, код не работает. Ошибок, исключений не возникает.
2. Если в части UPDATE SQL с ошибкой, то выбрасывается исключение, как и должно быть.
3. Если в части UPDATE SQL корректный, а в части INSERT - с ошибкой, то исключение не выбрасывается, ошибки не происходит, но и код не выполняется.
4. Если убрать транзакцию - все выполняется нормально.
5. Если каждое выражение подготавливать отдельно, то все работает нормально, исключения выбрасываются когда нужно, но код выглядит коряво - приходится делать одинаковый $stmt->bindValue(...) для каждого выражения (а у меня есть подготовленные запросы, где необходимо сделать три запроса подряд (UPDATE, DELETE, INSERT), связывая каждый из них с десятком одинаковых параметров). Например, так:
В чем может быть проблема, что использовать множественные запросы в одном prepare() вместе с транзакцией не получается, хотя без использования транзакций все происходит нормально?
Вопрос с подробным кодом можно найти на stackoverflow (задавал вопрос там, но пока вразумительного объяснения не получил).
Суть проблемы. Есть код
PHP:
$conn->dbh->beginTransaction();
$this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->dbh->prepare(
'UPDATE `таблица 1` ... (корректный SQL) ...;
INSERT INTO `таблица 1` ... (корректный SQL) ...;';
$stmt->bindValue(...);
try
{
$stmt->execute();
$conn->dbh->commit();
}
catch (Exception $e)
{
$dbh->rollBack();
echo $e->getMessage();
}
1. Если SQL корректный, код не работает. Ошибок, исключений не возникает.
2. Если в части UPDATE SQL с ошибкой, то выбрасывается исключение, как и должно быть.
3. Если в части UPDATE SQL корректный, а в части INSERT - с ошибкой, то исключение не выбрасывается, ошибки не происходит, но и код не выполняется.
4. Если убрать транзакцию - все выполняется нормально.
5. Если каждое выражение подготавливать отдельно, то все работает нормально, исключения выбрасываются когда нужно, но код выглядит коряво - приходится делать одинаковый $stmt->bindValue(...) для каждого выражения (а у меня есть подготовленные запросы, где необходимо сделать три запроса подряд (UPDATE, DELETE, INSERT), связывая каждый из них с десятком одинаковых параметров). Например, так:
PHP:
$conn->dbh->beginTransaction();
$this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt_1 = $conn->dbh->prepare(
'UPDATE `таблица 1` ... (корректный SQL) ...;');
$stmt_1->bindValue(...);
$stmt_2 = $conn->dbh->prepare(
'INSERT INTO `таблица 1` ... (корректный SQL) ...;');
$stmt_2->bindValue(...);
try
{
$stmt_1->execute();
$stmt_2->execute();
$conn->dbh->commit();
}
catch (Exception $e)
{
$dbh->rollBack();
echo $e->getMessage();
}
Вопрос с подробным кодом можно найти на stackoverflow (задавал вопрос там, но пока вразумительного объяснения не получил).