你能用PDO查询帮助我理解这段PHP代码吗?

你能用PDO查询帮助我理解这段PHP代码吗?,php,mysql,sql,pdo,Php,Mysql,Sql,Pdo,好的同事们,我正在更彻底地学习PHP,因为我是一个新手,我已经用MySQLi进行了数据库查询,我想学习PDO替代方案,因为我可以连接到MySQL以外的其他数据库。 所以我决定看不同的例子,我发现了一个我不太理解的例子,所以我决定逐行看 <?php function doSomething($id){ $pdo= conecta(); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERR

好的同事们,我正在更彻底地学习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查询,所以我想看看您能给我什么提示或建议

我的问题是要知道并破译这个函数的确切功能,因为它让我很困惑

$pdo= conecta();
我想这是一个成功连接的pdo对象

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
这意味着pdo一旦遇到错误就会抛出异常。(作为另一个示例,您可以将其设置为
PDO::ERRMODE_WARNING
,它将在出错时生成php警告)

这样,您就可以告诉PDO您开始与数据库通信,之后您可能希望通过
$PDO->commit()接受更改
或通过
$pdo->rollBack()拒绝它们

因此,每个
$pdo->beginTransaction()必须使用
$pdo->commit()完成
$pdo->rollBack()

在这一步中,字符串查询被传递到PDO并准备执行(这是防止注入所必需的)

绑定参数类似于告诉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)";
也就是说,它从表
autos
中选择字段
nombre\u a
desc\u a
probar
,然后将每个选定行插入表
registro
。但这些更改尚未显示在数据库中。如果在下一次
DELETE
查询中发生错误,将回滚此插入操作。这是因为您启动了一个事务,这意味着您在没有通知PDO进行
commit()
的情况下不会向数据库发送任何更改

但在插入之后,我们还没有做出承诺。因此,如果
DELETE
query产生错误,PDO将抛出异常,因为它被设置为异常错误模式。try-catch将捕获此异常,并回滚整个事务


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

您是否询问PDO或
插入的特定内容。。。选择
query?对于后者,请参见
$id
是一个正在绑定的参数。你的问题是什么?如果你做了
mysqli
,这应该不难理解。@StackSlave为什么建议
mysqli
而不是
PDO
?这是错误的。问题不清楚,你需要澄清。
query
只是执行某些功能的SQL,而PDO是将查询发送到DB的驱动程序。还有其他驱动程序,但它们通常仅限于特定的数据库。PDO更通用,可以与许多数据库一起工作。@user3783243,我在评论中从未建议过。但是,如果您使用的是MySQL,那么mysqli的类型就少了很多,因为它不需要为每个参数使用单独的方法。
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$stmt->bindParam(':motivo', $motivo,PDO::PARAM_STR);
$res1 = $stmt->execute();
$sql= "INSERT INTO registro (nombre_c, desc_c, motivo_c) (SELECT nombre_a, desc_a, :motivo FROM autos WHERE id=:id)";