【问题标题】:beginTransaction in PDOPDO 中的开始事务
【发布时间】:2016-09-29 20:36:03
【问题描述】:

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

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

这样做的结果是:用户被添加到“学生”表中,但课程保持不变(我没有收到任何错误),所以我想我在第二部分做错了什么。 我希望你能对这个问题有所了解。

【问题讨论】:

    标签: php mysql pdo


    【解决方案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();
       }
    

    【讨论】:

      猜你喜欢
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-26
      • 2013-03-25
      • 1970-01-01
      • 1970-01-01
      • 2015-09-30
      相关资源
      最近更新 更多