2012-10-09 8 views
5

सभी मैं जानना चाहता हूँ अगर आप mysqli के prepare, execute, और rollback एक साथ उपयोग कर सकते हैं?आप mysqli, तैयार निष्पादित, और साथ में रोलबैक का उपयोग कर सकते हैं?

$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();} 

क्या आप ऐसा कर सकते हैं? आइए मान लें कि उपर्युक्त कोड में लूप है और वेरिएबल्स में नया डेटा मिलता है।

+0

क्या आपने इसे आजमाया है? –

+0

आप क्या मानते हैं बनाता है आप कर सकते थे/नहीं कर सकता? –

+0

मैं इसे करने की कोशिश की है और यह परिणामों पर स्पष्ट नहीं है, जिसके कारण मैं पूछ रहा हूँ। पीएचपी दस्तावेज कुछ भी नहीं कहता है अगर तैयार, निष्पादित, और रोलबैक एक साथ काम करते हैं। कोई भी कभी कोशिश करता है और इसे काम करने के लिए मिलता है? –

उत्तर

0

इसे संभालने का सबसे अच्छा तरीका अपवादों के साथ है (हमेशा के रूप में, डर PHP त्रुटि/चेतावनी सामान)। बस क्योंकि हमारे commit() कॉल भी असफल हो सकता है। ध्यान दें कि finally नए पीएचपी संस्करणों में ही उपलब्ध है।

<?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); 
} 
संबंधित मुद्दे