mysql_query 不支援多個查詢,一個解決方法是使用 InnoDB 和交易。
這個資料庫類別/函式會接受一個查詢陣列的陣列,它會自動檢查資料庫中每一行的受影響列數,如果其中一個是 0,它將會回滾並返回 false,否則它將提交並返回 true。該函式的呼叫很簡單且易於閱讀等等。
----------
class MySQLDB
{
private $connection; // MySQL 資料庫連線
/* 類別建構子 */
function MySQLDB(){
/* 建立資料庫連線 */
$this->connection = mysql_connect(DB_SERVER, DB_USER, DB_PASS) or die(mysql_error());
mysql_select_db(DB_NAME, $this->connection) or die(mysql_error());
}
/* 交易函式 */
function begin(){
$null = mysql_query("START TRANSACTION", $this->connection);
return mysql_query("BEGIN", $this->connection);
}
function commit(){
return mysql_query("COMMIT", $this->connection);
}
function rollback(){
return mysql_query("ROLLBACK", $this->connection);
}
function transaction($q_array){
$retval = 1;
$this->begin();
foreach($q_array as $qa){
$result = mysql_query($qa['query'], $this->connection);
if(mysql_affected_rows() == 0){ $retval = 0; }
}
if($retval == 0){
$this->rollback();
return false;
}else{
$this->commit();
return true;
}
}
};
/* 建立資料庫連線物件 */
$database = new MySQLDB;
// 然後從其他任何地方,只需將交易查詢放在一個或多個陣列中,如下所示
function function(){
global $database;
$q = array (
array("query" => "UPDATE table WHERE something = 'something'"),
array("query" => "UPDATE table WHERE something_else = 'something_else'"),
array("query" => "DELETE FROM table WHERE something_else2 = 'something_else2'"),
);
$database->transaction($q);
}