2017-08-09 50 views
0

我想將數據插入到CLOUD和IDC表中。BeginTransaction無法在PHP中工作

Cloudid是IDC表的外鍵,所以我想使用事務。

之前添加$conn->beginTransaction();$conn->commit();,它工作正常,但沒有它們,它工作正常。

這裏是我的代碼:當數據庫使用InnoDB作爲存儲引擎

<?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

SQL注入警報 –

+0

所以當你使用它們時會發生什麼? –

+0

當你使用'beginTransaction()'和'commit()'時會得到什麼錯誤? –

回答

0

交易僅可用。您可能正在使用MyISAM

看看這裏的更多詳細信息的存儲引擎https://dev.mysql.com/doc/refman/5.7/en/storage-engines.html


作爲一個側面說明之間的區別,你的代碼很容易受到SQL注入,因爲你使用的原始發佈數據未準備好的查詢。你應該看看有:How can I prevent SQL injection in PHP?

+0

@ CROZET,mysql> SHOW ENGINES \ g,它顯示InnoDB |默認。所以我的數據庫使用InnoDB作爲存儲引擎。另外,當$ query =「begin; ....... commit;」時conn-> query($ query);,它工作正常。 – stack

+0

@CROZET,顯示創建表,IDC和CLOUD是ENGINE = InnoDB.So它並不關心存儲引擎。 – stack

+0

@stack你仍然沒有回答問題評論中的問題:你使用這個交易會發生什麼,你會得到什麼錯誤? –

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(); 
    } 
}