你能用PDO查询帮助我理解这段PHP代码吗?
好的同事们,我正在更彻底地学习PHP,因为我是一个新手,我已经用MySQLi进行了数据库查询,我想学习PDO替代方案,因为我可以连接到MySQL以外的其他数据库。 所以我决定看不同的例子,我发现了一个我不太理解的例子,所以我决定逐行看你能用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
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)";