[英]Why does my PHP transaction not work?
我正在為我的投資組合網站創建一個CMS項目。 我無法使更新功能正常工作。 我覺得它與我構建PDO事務的方式有關。 在我的數據庫中,我有一個項目表,類別表和關聯的content_category表。 我能夠很好地將我的項目插入到這些表中。 我想要做的是插入我的項目表然后刪除content_category表中的所有記錄,最后將當前類別記錄插入到該關聯表中以完成事務。 我確實得到了返回聲明“Project Updated”。 但表格沒有更新。 任何人的想法?
這是代碼:
這是我的Project類中的一個函數。
public function update(){
try {
$conn = getConnection();
$conn->beginTransaction();
$sql = "UPDATE project
SET project_title = :title,
project_description = :desc,
project_isFeatured = :feat,
project_mainImage = :image
WHERE project_id = :id";
$st = $conn->prepare($sql);
$st->bindValue(":id", $this->id, PDO::PARAM_INT);
$st->bindValue(":title", $this->title, PDO::PARAM_STR);
$st->bindValue(":desc", $this->description, PDO::PARAM_STR);
$st->bindValue(":feat", $this->isFeatured, PDO::PARAM_BOOL);
$st->bindValue(":image", $this->mainImage, PDO::PARAM_INT);
$st->execute();
$sql = "DELETE from content_category
WHERE content_id = :id";
$st = $conn->prepare($sql);
$st->bindValue("id", $this->id, PDO::PARAM_INT);
$st->execute();
$sql = "INSERT into content_category (content_id, cat_id)
VALUES (?,?)";
$st = $conn->prepare($sql);
foreach($this->categories as $key=>$value){
$st->execute(array(intval($projectID), intval($value)));
}
$conn->commit();
$conn = null;
return "Project updated";
}
catch(Exception $e) {
echo $e->getMessage();
$conn->rollBack();
return "Error... Unable to update!";
}
}
您的表的數據庫引擎需要是INNODB。 如果您使用的是phpMyAdmin,則默認為MyISAM。 (我不知道這是否會導致更新不通過或只是忽略事務行。編輯:非常確定文檔說它會拋出錯誤,如果你在myISAM上開始事務則不會做任何事情)
為了確保您沒有遇到PDO錯誤,您應該像這樣設置PDO錯誤報告:
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
PDO中有一些函數,例如prepare()
,它將返回false或拋出PDOException,具體取決於設置的錯誤模式。 這樣,它會拋出一個異常,你肯定會知道你是否遇到了問題!
此外,如果您的數據庫不支持事務(如MyISAM),則beginTransaction()
函數將返回false。 所以,也許在那里添加一個支票,如:
if($conn->beginTransaction()) {
// Do transaction here
} else {
echo("Unable to use transactions with this database.");
}
奇怪的是,根據PHP文檔 ,如果您的數據庫不支持事務,您將獲得異常...
不幸的是,並非每個數據庫都支持事務,因此當您第一次打開連接時,PDO需要以所謂的“自動提交”模式運行。 自動提交模式意味着您運行的每個查詢都有自己的隱式事務(如果數據庫支持它),或者如果數據庫不支持事務則沒有事務。 如果需要事務,則必須使用PDO :: beginTransaction()方法來啟動事務。 如果底層驅動程序不支持事務,則拋出PDOException(無論您的錯誤處理設置如何:這始終是一個嚴重的錯誤條件) 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.