你能用 PDO 查询帮助我理解这个 PHP 代码吗? [关闭]

Posted

技术标签:

【中文标题】你能用 PDO 查询帮助我理解这个 PHP 代码吗? [关闭]【英文标题】:Could you help me understand this PHP code with a PDO query? [closed] 【发布时间】:2020-08-23 23:38:52 【问题描述】:

各位好朋友,由于我是新手,所以我正在更彻底地学习 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 或 INSERT... SELECT 查询的内容吗?对于后者,请参阅w3schools.com/sql/sql_insert_into_select.asp $id 是一个被绑定的参数。你的问题是什么?如果你这样做了mysqli,这应该不会那么难理解。 @StackSlave 为什么建议mysqli 而不是PDO?这是走错路了。 问题不清楚,您需要澄清一下。 query 只是执行某些功能的 SQL,而 PDO 是将查询发送到 DB 的驱动程序。还有其他驱动程序,但它们通常仅限于特定数据库。 PDO 更加通用,可以与许多 DB 一起使用。 @user3783243,我从来没有在我的评论中建议过。但是如果您使用的是 MySQL mysqli,那么输入的方式就更少了,因为它不需要为每个参数使用单独的方法。 【参考方案1】:
$pdo= conecta();

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

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

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

$pdo->beginTransaction();

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

因此,每个$pdo-&gt;beginTransaction(); 必须以$pdo-&gt;commit();$pdo-&gt;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)";

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

但是在插入之后我们还没有提交。所以如果DELETE查询产生错误,PDO会抛出异常,因为它设置为异常错误模式。这个异常会被try-catch捕获,整个事务都会回滚。

否则,如果DELETE成功,也不会有异常,所以之前插入的数据会committed到数据库中,并显示变化。

【讨论】:

以上是关于你能用 PDO 查询帮助我理解这个 PHP 代码吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

pdo lastInsertId() 不断返回 0

为托管程序中的 foreach php pdo 提供的参数无效

我可以在 PHP/PDO 中使用 PostgreSQL 简单查询模式吗?

PHP/PDO/MySQL:将多个查询转换为单个查询

Jquery:你能给我解释一下这行代码吗?帮助我理解它,或提供我可以了解它的参考

你能用纯序言写 between/3 吗?