2017-08-09 15 views
0

CLOUDテーブルとIDCテーブルにデータを挿入したい。PHP mysqlでBeginTransactionが動作しない

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

SQLインジェクションの警告 –

+0

ので、あなたがそれらを使用するとどうなりますか? –

+0

'beginTransaction()'と 'commit()'を使用すると、どのようなエラーが発生しますか? –

答えて

0

取引データベースはストレージエンジンとしてInnoDB使用している場合にのみ使用可能です。おそらくMyISAM

あなたは生のPOSTデータを使用するので、あなたのコードは、SQLインジェクションの脆弱性があり、注意点としてストレージエンジンの違いの詳細についてはこちらをご覧https://dev.mysql.com/doc/refman/5.7/en/storage-engines.html


を持っているを使用しています準備されていないクエリ。 (http://php.net/manual/ru/pdo.prepare.phpを参照してください)あなたの接続を開始し、最後に取得するHow can I prevent SQL injection in PHP?

+0

@ CROZET、mysql>表示エンジン\ g、InnoDB | DEFAULT。私のデータベースはInnoDBをストレージエンジンとして使用しています。$ query = "begin; ....... commit; conn-> query($ query);うまく動作します。 – stack

+0

@CROZET、show create table、IDC、CLOUDはENGINE = InnoDBです。ストレージエンジンに関しては関係ありません。 – stack

+0

@stackあなたはまだ質問のコメントの質問に答えていません:あなたはトランザクションを使用して何が起こり、どのようなエラーがありますか? –

0

てみてください、私は準備されたステートメントを使用することをお勧めいたしますでしょうまた、以下のようにIDを挿入:あなたはそこに見ている必要があり

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(); 
    } 
} 
関連する問題