您能通过PDO查询帮助我理解此PHP代码吗?

时间:2020-08-23 23:38:52

标签: php mysql sql pdo

好的同事,由于我是新手,我对PHP的学习更加彻底了,我已经使用MySQLi进行了数据库查询,并且我想学习PDO替代方法,因为我可以连接到MySQL以外的其他数据库。 因此,我决定查看不同的示例,并发现一个我不太了解的示例,因此决定逐行查看。

<?php
    function doSomething($id){
        
        $pdo= conecta(); 
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $motivo= "probar"; 
        $res=0;
        $e="";

        try{
            $pdo->beginTransaction();

            $sql= "INSERT INTO registro (nombre_c, desc_c, motivo_c) (SELECT nombre_a, desc_a, :motivo FROM autos WHERE id=:id)";
            $stmt= $pdo->prepare($sql);
            $stmt->bindParam(':id', $id, PDO::PARAM_INT);
            $stmt->bindParam(':motivo', $motivo,PDO::PARAM_STR);
            $res1 = $stmt->execute();
            
            $sql="DELETE FROM autos WHERE id=:id";
            $stmt= $pdo->prepare($sql);
            $stmt->bindParam(':id', $id, PDO::PARAM_INT);
            $res2 = $stmt->execute();

            $pdo->commit();
            $res=$res1&&$res2;
        }catch(PDOException $e){
            $pdo->rollBack();
        }

        unset($stmt);
        unset($pdo);
        return array($res?"actualizado":"error", $e);

    }

?>

我的想法是逐行了解它,以便使我学到的东西对我来说更好。 从我所看到的,创建了一个方法,该方法接收$ id属性并连接到数据库并创建了一个更新(我不知道查询是否做得很好,因为这对我来说似乎很奇怪) 我很难理解PDO查询,所以我想看看您能给我什么提示或建议。

我的查询是要知道并破译该函数的确切功能,因为它使我非常困惑

1 个答案:

答案 0 :(得分:0)

$pdo= conecta();

我想这是一个成功连接的pdo对象。

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

这意味着pdo在遇到错误时将引发异常。 (作为替代示例,您可以将其设置为PDO::ERRMODE_WARNING,它将在错误时产生php警告)

$pdo->beginTransaction();

通过这种方式,您告诉PDO您开始与数据库通信,此后您可能想通过$pdo->commit();接受更改或通过$pdo->rollBack();拒绝更改

因此,每个$pdo->beginTransaction();必须以$pdo->commit();$pdo->rollBack();结尾

$sql= "INSERT INTO registro (nombre_c, desc_c, motivo_c) (SELECT nombre_a, desc_a, :motivo FROM autos WHERE id=:id)";
$stmt= $pdo->prepare($sql);

在此步骤中,字符串查询将传递给PDO并准备执行(必须防止注入)。

$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$stmt->bindParam(':motivo', $motivo,PDO::PARAM_STR);

绑定参数就像告诉pdo认为所指示的标志(以:开头)等于传递的变量。第三个参数是变量类型,通常可以省略。

$res1 = $stmt->execute();

执行查询本身。因此,在此步骤中,将执行先前准备的查询:

$sql= "INSERT INTO registro (nombre_c, desc_c, motivo_c) (SELECT nombre_a, desc_a, :motivo FROM autos WHERE id=:id)";

即,它从表nombre_a中选择字段desc_aprobarautos,然后将每个选定的行插入表registro中。但是更改尚未显示在数据库中。如果在下一个DELETE查询中发生错误,则该插入操作将被回滚。这是因为您开始了事务,这意味着您在不通知PDO到commit()的情况下不会将任何更改发送到数据库。

但是插入后,我们还没有提交。因此,如果DELETE查询产生错误,PDO将被设置为异常错误模式,从而引发异常。该异常将被try-catch捕获,整个事务将被回滚。

否则,如果DELETE成功,则不会有异常,因此先前插入的数据将committed到数据库,并显示更改。