2011-03-20 179 views
7

有沒有辦法用預處理語句做事務?MySQLi準備好的語句和事務

我的意思是,我可以用下面的例子與$mysqli->autocommit(FALSE);$mysqli->commit();$mysqli->rollback();

//Preparing the statment 

$insert_stmt=$mysqli->prepare("INSERT INTO x VALUES(?,?)") 
or die($mysqli->error); 

//associate variables with the input parameters 

$insert_stmt->bind_param("is", $my_number,$my_string); //i=integer 

//Execute the statement multiple times.... 

for ($my_number = 1; $my_number <= 10; $my_number++) 
{ 
    $my_string="row ".$my_number; 
    $insert_stmt->execute() or die ($insert_stmt->error); 
} 
$insert_stmt->close(); 

我已經環顧四周卻找不到使用預處理語句(不PDO)的任何例子: http://php.net/manual/en/mysqli.prepare.php與交易,我只能在這裏找到像這些提到的例子:http://book.opensourceproject.org.cn/lamp/mysql/mysqlstored/opensource/0596100892/mysqlspp-chp-13-sect-2.html其中事務和預處理語句不會相互混合。

將它們一起使用會錯誤嗎?

回答

7

準備好的語句和事務是不相關的技術和技術。

您可能希望直接發出START TRANSACTIONCOMMIT/ROLLBACK命令,而不是使用專用方法。它們在功能上等同。

對於你的循環,你會發出你的prepare,那麼你的COMMIT後退出循環START TRANSACTION之前。在準備好的語句已經啓動但執行之前,您可能不應嘗試打開事務。

出於某種原因,他們沒有添加「啓動事務」命令,以關閉自動提交。這是關於mysqli的奇怪事情之一,這使我總是推薦PDO。 :)在事務處理期間,打開事務隱式關閉自動提交。

+0

非常感謝:)我不應該檢查循環後的錯誤,並回滾錯誤(並提交如果沒有錯誤) – Yerel 2011-03-21 00:25:07

+0

這是PDO超過mysqli的其他重大優勢之一 - 您可以將它設置爲拋出異常,因此不必一遍又一遍地檢查錯誤代碼,這意味着回滾或提交的決定可以大大簡化。 – Charles 2011-03-21 00:30:42

+2

OMG,這對我有很大的幫助。我製作了一個'插入〜5000行的腳本,完成需要數小時。添加'$ mysqli-> autocommit(FALSE);'和'$ mysqli-> commit();'讓它在幾分鐘內運行! :-) – 2012-04-12 18:31:36