2012-10-09 32 views
5

Tek bilmek istediğim mysqli'nin prepare, execute ve rollback birlikte kullanabilmesidir?Mysqli'yi birlikte hazırlayabilir, yürütebilir ve geri alabilir misiniz?

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

Bunu yapabilir misiniz? Yukarıdaki kodun bir döngüye sahip olduğunu veya değişkenlerin bunlarda yeni veriler aldığını varsayalım.

+0

Denediniz mi? –

+0

Yapabildiğinizi/yapamayacağınızı varsayan nedir? –

+0

Bunu denedim ve sonuçlarda net değil, bu yüzden soruyorum. PHP belgeleri, birlikte çalışmayı, yürütmeyi ve geri alma işlemini birlikte yaparsa, hiçbir şekilde bir şey söylemez. Herhangi biri denemek ya da işe almak için olsun? –

cevap

0

Bunun üstesinden gelmenin en iyi yolu, istisnalarla (her zaman olduğu gibi, PHP hatası/uyarı iletileri gibi) gerçekleşir. Basitçe bizim commit() aramamız da başarısız olabilir. Not: finally sadece yeni PHP sürümlerinde kullanılabilir.

<?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); 
} 
İlgili konular