2012-10-09 33 views
5

Tất cả những gì tôi muốn biết là nếu bạn có thể sử dụng số điện thoại prepare, executerollback của tôi?Bạn có thể sử dụng Mysqli chuẩn bị, thực thi và quay lại với nhau không?

$m = new mysqli($dbhost,$dbuser,$dbpassword,$dbname); 

$m->autocommit(FALSE); 
$stmt = $m->prepare("INSERT `table` (`name`,`gender`,`age`) VALUES (?,?,?)"); 
$stmt->bind_param("ssi", $name, $gender, $age); 
$query_ok = $stmt->execute(); 

$stmt = $m->prepare("INSERT `table` (`name`,`gender`,`age`) VALUES (?,?,?)"); 
$stmt->bind_param("ssi", $name, $gender, $age); 
if ($query_ok) {$query_ok = $stmt->execute();} 

if (!$query_ok) {$m->rollback();} else {$m->commit();} 

Bạn có thể làm việc này không? Giả sử rằng đoạn mã trên có một vòng lặp và hoặc các biến có được dữ liệu mới trong chúng.

+0

Bạn đã thử chưa? –

+0

Điều gì khiến bạn cho rằng mình có thể/không thể? –

+0

Tôi đã thử nó và nó không rõ ràng về kết quả, đó là lý do tại sao tôi yêu cầu. Các tài liệu PHP không nói bất cứ điều gì một trong hai cách nếu chuẩn bị, thực hiện và rollback làm việc với nhau. Bất kỳ ai từng thử và làm cho nó hoạt động? –

Trả lời

0

Cách tốt nhất để xử lý vấn đề này là có ngoại lệ (như mọi khi, darn các lỗi cảnh báo/cảnh báo PHP). Đơn giản vì cuộc gọi commit() của chúng tôi cũng có thể không thành công. Lưu ý rằng finally chỉ khả dụng trong các phiên bản PHP mới hơn.

<?php 

// Transform all errors to exceptions! 
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 

try { 
    $connection = new \mysqli($dbhost, $dbuser, $dbpassword, $dbname); 
    $connection->autocommit(false); 

    $stmt = $connection->prepare("INSERT `table` (`name`, `gender`, `age`) VALUES (?, ?, ?)"); 
    $stmt->bind_param("ssi", $name, $gender, $age); 
    $stmt->execute(); 

    // We can simply reuse the prepared statement if it's the same query. 
    //$stmt = $connection->prepare("INSERT `table` (`name`, `gender`, `age`) VALUES (?, ?, ?)"); 

    // We can even reuse the bound parameters. 
    //$stmt->bind_param("ssi", $name, $gender, $age); 

    // Yet it would be better to write it like this: 
    /* 
    $stmt = $connection->prepare("INSERT `table` (`name`, `gender`, `age`) VALUES (?, ?, ?), (?, ?, ?)"); 
    $stmt->bind_param("ssissi", $name, $gender, $age, $name, $gender, $age); 
    */ 

    $stmt->execute(); 
    $stmt->commit(); 
} 
catch (\mysqli_sql_exception $exception) { 
    $connection->rollback(); 
    throw $exception; 
} 
finally { 
    isset($stmt) && $stmt->close(); 
    $connection->autocommit(true); 
} 
Các vấn đề liên quan