你能用 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->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)";
即,它从表autos
中选择字段nombre_a
、desc_a
和probar
,然后将每个选定的行插入到表registro
中。但更改尚未显示在数据库中。如果下一个DELETE
查询出现错误,这个插入操作会被回滚。这是因为您启动了一个事务,这意味着您不会在未将 PDO 告知 commit()
的情况下向数据库发送任何更改。
但是在插入之后我们还没有提交。所以如果DELETE
查询产生错误,PDO会抛出异常,因为它设置为异常错误模式。这个异常会被try-catch捕获,整个事务都会回滚。
否则,如果DELETE
成功,也不会有异常,所以之前插入的数据会committed
到数据库中,并显示变化。
【讨论】:
以上是关于你能用 PDO 查询帮助我理解这个 PHP 代码吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
为托管程序中的 foreach php pdo 提供的参数无效
我可以在 PHP/PDO 中使用 PostgreSQL 简单查询模式吗?