This is an example to explain the powerful of the rollback and commit functions.
Let's suppose you want to be sure that all queries have to be executed without errors before writing data on the database.
Here's the code:
<?php
$all_query_ok=true; // our control variable
//we make 4 inserts, the last one generates an error
//if at least one query returns an error we change our control variable
$mysqli->query("INSERT INTO myCity (id) VALUES (100)") ? null : $all_query_ok=false;
$mysqli->query("INSERT INTO myCity (id) VALUES (200)") ? null : $all_query_ok=false;
$mysqli->query("INSERT INTO myCity (id) VALUES (300)") ? null : $all_query_ok=false;
$mysqli->query("INSERT INTO myCity (id) VALUES (100)") ? null : $all_query_ok=false; //duplicated PRIMARY KEY VALUE
//now let's test our control variable
$all_query_ok ? $mysqli->commit() : $mysqli->rollback();
$mysqli->close();
?>
hope to be helpful!
mysqli::commit
mysqli_commit
(PHP 5)
mysqli::commit -- mysqli_commit — Фиксирует текущую транзакцию
Описание
Объектно-ориентированный стиль
bool mysqli::commit
( void
)
Процедурный стиль
Фиксирует транзакцию для установленного соединения с базой данных.
Список параметров
-
link -
Только для процедурного стиля: Идентификатор соединения, полученный с помощью mysqli_connect() или mysqli_init()
Возвращаемые значения
Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.
Примеры
Пример #1 Пример использования mysqli::commit()
Объектно-ориентированный стиль
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* Проверить соединение */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$mysqli->query("CREATE TABLE Language LIKE CountryLanguage");
/* Откл. автофиксацию изменений */
$mysqli->autocommit(FALSE);
/* Вставить некоторые значения */
$mysqli->query("INSERT INTO Language VALUES ('DEU', 'Bavarian', 'F', 11.2)");
$mysqli->query("INSERT INTO Language VALUES ('DEU', 'Swabian', 'F', 9.4)");
/* Фиксировать транзакцию */
$mysqli->commit();
/* Удалить таблицу */
$mysqli->query("DROP TABLE Language");
/* Закрыть соединение */
$mysqli->close();
?>
Процедурный стиль
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "test");
/* Проверить соединение */
if (!$link) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* Откл. автофиксацию изменений */
mysqli_autocommit($link, FALSE);
mysqli_query($link, "CREATE TABLE Language LIKE CountryLanguage");
/* Вставить некоторые значения */
mysqli_query($link, "INSERT INTO Language VALUES ('DEU', 'Bavarian', 'F', 11.2)");
mysqli_query($link, "INSERT INTO Language VALUES ('DEU', 'Swabian', 'F', 9.4)");
/* Фиксировать транзакцию */
mysqli_commit($link);
/* Закрыть соединение */
mysqli_close($link);
?>
Смотрите также
- mysqli_autocommit() - Включает или отключает автоматическую фиксацию изменений базы данных
- mysqli_rollback() - Откат текущей транзакции
Lorenzo - webmaster AT 4tour DOT it ¶
4 years ago
Bob Johnson ¶
3 years ago
The compactness of Lorenzo's code is admirable.
However, it is a good idea to also check $mysqli->affected_rows to make sure that the INSERT statement did not fail.
<?php
$result_query = @mysqli_query($query, $connect);
if (($result_query == false) &&
(mysqli_affected_rows($connect) == 0))
{
// verify the query executed completely and verify that it
// had impact on the table
$success = false;
// here also, the developer could choose to add a ROLLBACK
// statement
}
?>
