mysql_query 不支持多条查询,解决方法是使用 InnoDB 和事务。
此数据库类/函数将接受一个查询数组的数组,它会自动检查数据库中每一行的受影响行数,如果其中一行是 0,则回滚并返回 false,否则提交并返回 true。函数调用非常简单,易于阅读等。
----------
类 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);
}