2014-11-07 6 views
1

mysqli prepared statements와 함께 sql 트랜잭션을 사용하는 방법을 알아 내려고하고 있습니다. 여러 준비된 문 (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; 
    } 
}