BeginTransaction无法在PHP mysql中工作

时间:2017-08-09 08:04:17

标签: php mysql

我想将数据插入CLOUD和IDC表。

Cloudid是IDC表的外键,所以我想使用事务。

在添加$conn->beginTransaction();$conn->commit();之前,它运行正常,但没有它们,它可以正常工作。

这是我的代码:

<?php
if($_GET["act"]=="add")
{
      try
      {
        $conn=new PDO('mysql:host=localhost;port=3306;dbname=xxx' , 'root' , 'xxxx');

        //$conn->beginTransaction();
        $query="
             insert into CLOUD (name,date) VALUES('".$_POST['customerName']."','".$_POST['firstDay']."');
             insert into  IDC (name,id,phone,cloudid) VALUES('".$_POST['engName3']."','".$_POST['engID3']."','".$_POST['engPhone3']."',LAST_INSERT_ID());                 
             insert into  IDC (name,id,phone,cloudid) VALUES('".$_POST['engName4']."','".$_POST['engID4']."','".$_POST['engPhone4']."',LAST_INSERT_ID());
             ";

        $stmt=$conn->query($query);
        //$conn->commit();

        echo "success";
      }
      catch(PDOException $e)
      {
         $conn->rollBack();
         echo "connect failed!".$e->getMesage();
         exit;
      }  

}
?>

2 个答案:

答案 0 :(得分:0)

事务仅在数据库使用InnoDB作为存储引擎时才可用。您可能正在使用MyISAM

有关存储引擎https://dev.mysql.com/doc/refman/5.7/en/storage-engines.html

之间差异的详细信息,请查看此处

作为旁注,您的代码很容易受到SQL注入的影响,因为您在未准备好的查询中使用原始发布数据。你应该看看那里:How can I prevent SQL injection in PHP?

答案 1 :(得分:0)

尝试启动您的连接并获取最后插入的ID,如下所示,我也建议您使用预准备语句(请参阅http://php.net/manual/ru/pdo.prepare.php):

if($_GET["act"]=="add")
{      
    try {
      $dbh = new PDO('mysql:host=localhost;port=3306;dbname=xxx', 'root', 'xxx', 
          array(PDO::ATTR_PERSISTENT => true));
      echo "Connected\n";
    } catch (Exception $e) {
      die("Unable to connect: " . $e->getMessage());
    }

    try {  
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

        $dbh->beginTransaction();

        $stmt = $dbh->prepare('insert into CLOUD (name,date) VALUES(:customerName,:firstDay)');
        $stmt->execute([
            'customerName' => $_POST['customerName'],
            'firstDay' => $_POST['firstDay']
        ]);

        $cloud_id = $dbh->lastInsertId();

        $stmt = $dbh->prepare('insert into IDC (name,id,phone,cloudid) VALUES(:name,:id,:phone,:cloudid)');
        $stmt->bindParam(':name', $name);
        $stmt->bindParam(':id', $id);
        $stmt->bindParam(':phone', $phone);
        $stmt->bindParam(':cloudid', $cloud_id);

        $name = $_POST['engName3'];
        $id = $_POST['engID3'];
        $phone = $_POST['engPhone3'];        
        $stmt->execute();

        $name = $_POST['engName4'];
        $id = $_POST['engID4'];
        $phone = $_POST['engPhone4'];        
        $stmt->execute();        

        $dbh->commit();

    } catch (PDOException $e) {
      $dbh->rollBack();
      echo "Failed: " . $e->getMessage();
    }
}