好的同事,由于我是新手,我对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查询,所以我想看看您能给我什么提示或建议。
我的查询是要知道并破译该函数的确切功能,因为它使我非常困惑
答案 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_a
,probar
和autos
,然后将每个选定的行插入表registro
中。但是更改尚未显示在数据库中。如果在下一个DELETE
查询中发生错误,则该插入操作将被回滚。这是因为您开始了事务,这意味着您在不通知PDO到commit()
的情况下不会将任何更改发送到数据库。
但是插入后,我们还没有提交。因此,如果DELETE
查询产生错误,PDO将被设置为异常错误模式,从而引发异常。该异常将被try-catch捕获,整个事务将被回滚。
否则,如果DELETE
成功,则不会有异常,因此先前插入的数据将committed
到数据库,并显示更改。