2016-09-29 6 views
0

私は最近、PDOについて学び始めました。 私の質問は、準備されたステートメントを1つ以上実行する方法です。 私の例では、私は新しい学生をデータベースに追加しようとしています。 コードの最初の部分は、学生を 'students'表に追加しています。 コードの2番目の部分は、student_idとclass_idという2つの列を含むstudent_classテーブルに、すべてのクラス(配列(PHP、JAVA、ANGULAR)から配列)を追加しようとしています。 は、ここで私が試したものの抜粋です:PDOでの取引

function addStudent($name, $phone, $email, $classes){ 
     global $conn; 
     //first part 
     $stat = $conn->prepare("INSERT INTO students (sName, phone, email) VALUES(:name, :phone, :email)"); 
     $stat->bindValue("name",$name,PDO::PARAM_STR); 
     $stat->bindValue("phone",$phone,PDO::PARAM_STR); 
     $stat->bindValue("email",$email,PDO::PARAM_STR); 
     $stat->execute(); 
     //second part 
     //insert classes into student_class 
     $lastId = $conn->lastInsertId(); 
     $conn->beginTransaction(); 
     $len = count($classes); 
     for ($i=0; $i < $len; $i++) { 
      $cid = getClassByName($classes[$i]);//returns the class id 
      $cl = $conn->prepare("INSERT INTO student_class (student_id,class_id) VALUES(:sid, :cid)"); 
      $cl->bindValue("sid",$lastId,PDO::PARAM_INT); 
      $cl->bindValue("cid",$cid,PDO::PARAM_INT); 
      $cl->execute(); 
     } 
     $conn->commit(); 
    } 

try{ 
    addStudent($params['name'], $params['phone'], $params['email'], $params['classes']); 
    } 
catch(PDOException $e){ 
     echo $e->getMessage(); 
     $conn->rollback(); 
    } 

この結果は次のとおりです。ユーザーが「学生のテーブルに追加されますが、クラスが(私はエラーを取得していないよ)そのまま残るので、私は私は2番目の部分で何か間違っていると思います。 私はあなたがこの問題についていくつかの光を当てることができることを願っています。

答えて

1

これらの文が準備されている場合は、それらを一度「作成」するだけで複数回実行できます。また、エラー情報を出力するコードを編集し、デバッグに使用します。

function addStudent($name, $phone, $email, $classes){ 
     global $conn; 
     //first part 
     $stat = $conn->prepare("INSERT INTO students (sName, phone, email) VALUES(:name, :phone, :email)"); 
     $stat->bindValue("name",$name,PDO::PARAM_STR); 
     $stat->bindValue("phone",$phone,PDO::PARAM_STR); 
     $stat->bindValue("email",$email,PDO::PARAM_STR); 
     $stat->execute(); 

     //second part 
     //insert classes into student_class 
     $lastId = $conn->lastInsertId(); 
     $conn->beginTransaction(); 
     $len = count($classes); 

     $cl = $conn->prepare("INSERT INTO student_class (student_id,class_id) VALUES(:sid, :cid)"); 
     if (!$cl) { 
      echo "\nPDO::errorInfo():\n"; 
      print_r($conn->errorInfo()); 
     } 
     for ($i=0; $i < $len; $i++) { 
      $cid = getClassByName($classes[$i]);//returns the class id 
      $cl->bindValue("sid",$lastId,PDO::PARAM_INT); 
      $cl->bindValue("cid",$cid,PDO::PARAM_INT); 
      $cl->execute(); 

      echo "\nPDOStatement::errorInfo():\n"; 
      $arr = $cl->errorInfo(); 
      print_r($arr); 
     } 
     $conn->commit(); 
    } 

try{ 
    addStudent($params['name'], $params['phone'], $params['email'], $params['classes']); 
    } 
catch(PDOException $e){ 
     echo $e->getMessage(); 
     $conn->rollback(); 
    }