2014-11-07 3 views
1

Я пытаюсь выяснить, как использовать транзакции sql с подготовленными операциями mysqli. Я не смог найти примеры, которые используют несколько подготовленных операторов (это не OO), поэтому я не уверен, как использовать транзакции с ними. Это ближайший я мог понять:Несколько mysqli подготовленных операторов с транзакциями

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; 
    } 
} 
Смежные вопросы