簡體   English   中英

為什么我的PHP事務不起作用?

[英]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(無論您的錯誤處理設置如何:這始終是一個嚴重的錯誤條件)

提交成功時返回TRUE,失敗時返回FALSE。 你可以檢查一下。 還要檢查errorCode

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM