PHP的交易错误,我总是得到一个回滚错误

时间:2020-04-01 11:52:14

标签: php pdo

im试图一次更新2个表。根据我的研究,我必须为此使用一笔交易:

protected function myUpdateFunction(){
        try{
            $this->connect()->beginTransaction();

        $itemID = filter_input(INPUT_POST, 'updateItemID');
        $itemName = filter_input(INPUT_POST, 'updateItemName');
        $itemDescription = filter_input(INPUT_POST, 'updateItemDescription');
        $itemPrice = filter_input(INPUT_POST, 'updateItemPrice');
        $itemStock = filter_input(INPUT_POST, 'updateItemStock');
        $updateItemBtn = filter_input(INPUT_POST, 'updateItemBtn');

        $sql = "UPDATE oopphp_items SET itemName = ?, itemDescription = ?, itemPrice = ?, itemStock = ? WHERE itemID = ?";
        $stmt = $this->connect()->prepare($sql);
        $stmt->bindParam(1, $itemName, PDO::PARAM_STR);
        $stmt->bindParam(2, $itemDescription, PDO::PARAM_STR);
        $stmt->bindParam(3, $itemPrice, PDO::PARAM_STR);
        $stmt->bindParam(4, $itemStock, PDO::PARAM_INT);
        $stmt->bindParam(5, $itemID, PDO::PARAM_INT);
        $stmt->execute();


        //wishlist
        $itemID_fk = filter_input(INPUT_POST, 'updateItemID');
        $itemName_fk = filter_input(INPUT_POST, 'updateItemName');
        $itemDescription_fk = filter_input(INPUT_POST, 'updateItemDescription');
        $itemPrice_fk = filter_input(INPUT_POST, 'updateItemPrice');

        $sql = "UPDATE oopphp_wishlist SET itemName_fk = ?, itemDescription_fk = ?, itemPrice_fk = ? WHERE itemID_fk = ?";
        $stmt = $this->connect()->prepare($sql);
        $stmt->bindParam(1, $itemName_fk, PDO::PARAM_STR);
        $stmt->bindParam(2, $itemDescription_fk, PDO::PARAM_STR);
        $stmt->bindParam(3, $itemPrice_fk, PDO::PARAM_STR);
        $stmt->bindParam(4, $itemID_fk, PDO::PARAM_INT);
        $stmt->execute();

        $this->connect()->commit();
        }
        catch(Exception $e){
                echo $e->getMessage();
                $this->connect()->rollBack();

        }
    }

我得到以下错误:

致命错误:未捕获的PDOException:没有活动的事务

当我尝试寻找答案时,他们都说要放入尝试捕捉器中,而我已经这样做了。我能找到的所有示例都是这样做的。如此处所示:PHP PDO - There is no active transaction

我还发现有人建议将它们添加到数据库文件中

$pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute( PDO::ATTR_EMULATE_PREPARES, false);
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, FALSE);

它也已经做过任何事情。

现在,如果我只是删除catch()中的代码,那么错误就会消失,并且我的两个更新查询都可以工作。

我能发现的唯一区别是所有示例都没有将它们的数据库连接作为函数。

所以我在哪里:

$this->connect()->beginTransaction();

他们这样做:

$pdo->beginTransaction();

,对于commit()和rollBack()来说显然是相同的。虽然我无法想象这是问题所在。特别是当我删除catch()内容时效果很好。

这是我从以下位置获取代码的地方:https://thisinterestsme.com/php-pdo-transaction-example/

除了connect()和$ pdo,我似乎有相同的代码。

我的连接功能:

protected function connect(){
        try{
            $dsn = 'mysql:host=' . $this->DB_HOST . ';dbname=' . $this->DB_NAME;
            $pdo = new PDO($dsn, $this->DB_USER, $this->DB_PASS);

            //setting default fetch mode
            $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

            //setting errors for exceptions for try/catch
            $pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

            $pdo->setAttribute( PDO::ATTR_EMULATE_PREPARES, false);
            $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, false);
            return $pdo;
        }
        catch(PDOException $error){
            echo 'Connection error: ' . $error->getMessage();
        }
        finally{
            //$pdo = null;
        }
    }

我在评论的帮助下修复了该问题,如果以后有人看到它,则在最后注释最后: 我提到的这一行: $ pdo-> setAttribute(PDO :: ATTR_AUTOCOMMIT,FALSE);

做到了,所以我的CRUD不再起作用了。另外2个setAttribute()暂时没有引起任何错误。

1 个答案:

答案 0 :(得分:2)

调用connect()时,每次都会得到一个不同的PDO对象。因此,

$this->connect()->beginTransaction(); // pdo object 1

$this->connect()->commit();   // pdo object 4

PDO对象4没有正在进行的事务!异常是正常的。

快速修复:

在您尝试阻止

 $pdo = $this->connect();
 $pdo->beginTransaction();
  ....  // replace all $this->connect() by $pdo
 $pdo->commit();