PDO中的beginTransaction

时间:2016-09-29 20:36:04

标签: php mysql pdo

我最近开始学习PDO。 我的问题是如何执行超过1个准备好的声明。 在我的例子中,我试图将新学生添加到数据库中。 代码的第一部分是将学生添加到“学生”中。表。 代码的第二部分我试图将他的所有类(从数组(如PHP,JAVA,ANGULAR))添加到student_class表(包含2列 - student_id和class_id)中。 这是我尝试过的片段:

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

结果是:用户被添加到&#39;学生&#39;表但是课程保持不变(我没有得到错误),所以我想我第二部分做错了。 我希望你能对这件事有所了解。

1 个答案:

答案 0 :(得分:1)

如果这些是准备好的陈述,那么你只能&#34;创建&#34;他们一次,可以多次执行。还编辑了代码以打印错误信息,用它来调试。

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