php - PDO 中的开始事务

标签 php mysql pdo

我最近开始学习 PDO。 我的问题是如何执行超过 1 个准备好的语句。 在我的示例中,我尝试将新学生添加到数据库中。 代码的第一部分我将学生添加到“学生”表中。 代码的第二部分我试图将他的所有类(class)(从数组,例如数组(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();
   }

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

最佳答案

如果这些是准备好的语句,那么您只需“创建”它们一次,并且可以多次执行它们。还编辑了您的代码以打印错误信息,用它来调试。

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

关于php - PDO 中的开始事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39779542/

相关文章:

php - 如何使用 SQLite 和 PHP 将图像保存到数据库?

php - 保护 CSV 文件的 SQL 插入免受 SQL 注入(inject)

php - 当我使用以下语句更新用户表时,为什么行计数始终为 0

php - 如何 "reset"CodeIgniter 连续查询的事件记录?

PHP setcookie 1 年不起作用

java - Spring JdbcTemplate 在创建存储过程时抛出错误

mysql - 为单个 mysql 表中的每个最大列选择 ID

php - 匹配两个不带秒的日期并显示结果

php - 在html输入字段中显示MySQL表数据(PDO)

php - 连续运行 PHP 脚本