Keep in mind this bug: https://bugs.php.net/bug.php?id=66528
you could not rely on commit() return value while using MySql(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)
PDO::commit β Π€ΠΈΠΊΡΠΈΡΡΠ΅Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ
Π€ΠΈΠΊΡΠΈΡΡΠ΅Ρ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Ρ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Ρ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½ΡΡ Π² ΡΠ΅ΠΆΠΈΠΌ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠΈΠΊΡΠ°ΡΠΈΠΈ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ Π²ΡΠ·ΠΎΠ² PDO::beginTransaction() Π½Π΅ Π½Π°ΡΠ½ΡΡ Π½ΠΎΠ²ΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ.
Π‘ΠΈΠ³Π½Π°ΡΡΡΠ° ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ².
Π€ΡΠ½ΠΊΡΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ true, Π΅ΡΠ»ΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΠ»Π°ΡΡ ΡΡΠΏΠ΅ΡΠ½ΠΎ, ΠΈΠ»ΠΈ false, Π΅ΡΠ»ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ΠΎΡΠΈΠ±ΠΊΠ°.
ΠΡΠ·ΡΠ²Π°Π΅Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ PDOException, Π΅ΡΠ»ΠΈ Π½Π΅Ρ Π°ΠΊΡΠΈΠ²Π½ΠΎΠΉ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ.
ΠΠ°ΠΌΠ΅ΡΠ°Π½ΠΈΠ΅: ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΡΡΡ, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ Π΄Π»Ρ Π°ΡΡΠΈΠ±ΡΡΠ°
PDO::ATTR_ERRMODEΠ½Π΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΠΈ ΡΠ΅ΠΆΠΈΠΌPDO::ERRMODE_EXCEPTION.
ΠΡΠΈΠΌΠ΅Ρ #1 Π€ΠΈΠΊΡΠ°ΡΠΈΡ ΠΎΠ±ΡΡΠ½ΠΎΠΉ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ
<?php
/* ΠΠ°ΡΠ°Π»ΠΎ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ, ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠΈΠΊΡΠ°ΡΠΈΠΈ */
$dbh->beginTransaction();
/* ΠΡΡΠ°Π²ΠΊΠ° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° Π·Π°ΠΏΠΈΡΠ΅ΠΉ ΠΏΠΎ ΠΏΡΠΈΠ½ΡΠΈΠΏΡ "Π²ΡΠ΅ ΠΈΠ»ΠΈ Π½ΠΈΡΠ΅Π³ΠΎ" */
$sql = 'INSERT INTO fruit
(name, colour, calories)
VALUES (?, ?, ?)';
$sth = $dbh->prepare($sql);
foreach ($fruits as $fruit) {
$sth->execute(array(
$fruit->name,
$fruit->colour,
$fruit->calories,
));
}
/* Π€ΠΈΠΊΡΠ°ΡΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ */
$dbh->commit();
/* Π‘ΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Ρ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½ΡΡ
ΡΠ½ΠΎΠ²Π° Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠΈΠΊΡΠ°ΡΠΈΠΈ */
?>
ΠΡΠΈΠΌΠ΅Ρ #2 Π€ΠΈΠΊΡΠ°ΡΠΈΡ DDL-ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ
<?php
/* ΠΠ°ΡΠ°Π»ΠΎ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ, ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠΈΠΊΡΠ°ΡΠΈΠΈ */
$dbh->beginTransaction();
/* ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΡ
Π΅ΠΌΡ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
*/
$sth = $dbh->exec("DROP TABLE fruit");
/* Π€ΠΈΠΊΡΠ°ΡΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ */
$dbh->commit();
/* Π‘ΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Ρ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½ΡΡ
ΡΠ½ΠΎΠ²Π° Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠΈΠΊΡΠ°ΡΠΈΠΈ */
?>ΠΠ°ΠΌΠ΅ΡΠ°Π½ΠΈΠ΅: ΠΠ΅ Π²ΡΠ΅ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡΠΌ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ DDL-Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡΠΌΠΈ: Π² Π½Π΅ΠΊΠΎΡΠΎΡΡΡ Π³Π΅Π½Π΅ΡΠΈΡΡΡΡΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ, ΡΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π² Π΄ΡΡΠ³ΠΈΡ (Π²ΠΊΠ»ΡΡΠ°Ρ MySQL) ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠΈΠΊΡΠΈΡΡΠ΅ΡΡΡ ΠΏΠΎΡΠ»Π΅ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ Π²ΡΡΡΠ΅ΡΠΈΠ²ΡΠ΅Π³ΠΎΡΡ DDL-Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ.
Keep in mind this bug: https://bugs.php.net/bug.php?id=66528
you could not rely on commit() return value while using MySql