無論事務中的所有查詢都未成功執行,我的查詢都可以正常工作。我應該怎麼做才能使MySQL事務在我的代碼中工作?
$this->mysqli->autocommit(FALSE);
$query = $this->mysqli->real_escape_string("INSERT INTO `product` (`name`, `price`) VALUES (?,?)");
$prod = $this->mysqli->prepare($query);
$prod->bind_param("ss", $name,$price);
$prod->execute();
$query = $this->mysqli->real_escape_string("INSERT INTO `member` (`user`, `address`) VALUES (?,?)");
$prod = $this->mysqli->prepare($query);
$prod->bind_param("ss", $user,$address);
$prod->execute();
$query = $this->mysqli->real_escape_string(" SOME BAD WRITTEN QUERY") ;
$prod = $this->mysqli->prepare($query);
$prod->execute();
if (!$this->mysqli->commit())
{
print("\nTransaction commit failed\n");
$this->mysqli->rollback();
}
$this->mysqli->autocommit(TRUE);
這段代碼正在工作並插入前兩個查詢,當然是第三個查詢。
但事務不起作用,無論它插入的每一個查詢都起作用,而且我想只在所有三個查詢都正確完成時才插入。
我使用InnoDB引擎和PHP 5.5
你是否開始交易? 'mysqli-> begin_transaction()' – 2014-10-05 21:43:15
@ gloomy.penguin當autocommit關閉時,你不需要明確地開始事務,只提交它們。 – 2014-10-05 21:53:14
你不應該在SQL語句中調用'real_escape_string()'。你正確地綁定了參數,這就足夠了。沒有好處,並且試圖逃避整個SQL語句可能會有一些傷害。只需使用'$ query =「INSERT INTO ... VALUES(?,?)」'來構建純字符串。 – 2014-10-05 21:54:23