Несколько mysqli подготовленных заявлений с транзакциями

Я пытаюсь выяснить, как использовать транзакции SQL с подготовленными MySQL заявлениями. Я не смог найти ни одного примера, который бы использовал несколько подготовленных операторов (которые не являются ОО), поэтому я не совсем уверен, как использовать транзакции с ними.
Это самый близкий мне показатель:

    mysqli_autocommit($database, FALSE);

$transferq = 'INSERT INTO money (user_id, bank, onhand, type, amount, source) VALUES (?, ?, ?, ?, ?, ?)';
$transferstmt = mysqli_stmt_init($database);
mysqli_stmt_prepare($transferstmt, $transferq);
mysqli_stmt_bind_param($transferstmt, 'iiisis', $userid, $newbank, $newmoney, $type, $amount, $source);
mysqli_stmt_execute($transferstmt);

$insertq = 'UPDATE users SET money=?, bank=? WHERE user_id=' . $userid . ' LIMIT 1';
$insertstmt = mysqli_stmt_init($database);
mysqli_stmt_prepare($insertstmt, $insertq);
mysqli_stmt_bind_param($insertstmt, 'ii', $newmoney, $newbank);
mysqli_stmt_execute($insertstmt);

mysqli_commit($database);

Но я понятия не имею, будет ли это работать. Моя самая большая проблема, однако, заключается в том, что я не уверен, как проверить, не сработали ли запросы или нет (и, следовательно, принять или нет). Я видел пример, который, я думаю, сделал что-то вроде

if(mysqli_stmt_execute($stmt)){
mysqli_commit($database);
}else{
mysqli_rollback($database);
}

Но я не могу этого сделать, поскольку у меня есть несколько подготовленных операторов для выполнения.

Как это должно работать?

1

Решение

Может я не понял вашего вопроса, но что по этому поводу?

mysqli_autocommit($database, FALSE);

$transferq = 'INSERT INTO money (user_id, bank, onhand, type, amount, source) VALUES (?, ?, ?, ?, ?, ?)';
$transferstmt = mysqli_stmt_init($database);
mysqli_stmt_prepare($transferstmt, $transferq);
mysqli_stmt_bind_param($transferstmt, 'iiisis', $userid, $newbank, $newmoney, $type, $amount, $source);
if (not mysqli_stmt_execute($transferstmt) ){
mysqli_rollback($database);
return;
}

$insertq = 'UPDATE users SET money=?, bank=? WHERE user_id=' . $userid . ' LIMIT 1';
$insertstmt = mysqli_stmt_init($database);
mysqli_stmt_prepare($insertstmt, $insertq);
mysqli_stmt_bind_param($insertstmt, 'ii', $newmoney, $newbank);

if (not mysqli_stmt_execute($insertstmt) ){
mysqli_rollback($database);
return;
}

mysqli_commit($database);

Следующий уровень если форма этого объектно-ориентированного использования mysqli или PDO (без транзакций, как пример способа работы с базой данных):

class my_database{
private static $inner_link_to_driver;
protected static function factory( ){
if (not static::$inner_link_to_driver){
static::$inner_link_to_driver = new ...(USER, SERVER, PASSWD, PORT);
}
return static::$inner_link_to_driver;
}
public static function do_something($params, &$message ){
$query = "...";
$stmt = static::factory()->prepare($query);
if (not $stmp ){
$message = 'Error prepare query '.$query.PHP_EOL.static::factory()-> ..(get_error);
return FALSE;
}

if (not $stmt->execute($params) ){
$message = 'Error execute query '.$query.PHP_EOL.static::factory()-> ..(get_error);
return FALSE;
}
return TRUE;
}
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]