Php 因为我正在将mysqli查询更改为PDO准备的语句,所以我可以消除所有转义吗?
我正在放弃做正确的事情,并将所有mysqli查询改为使用PDO,因此我希望有人能确认我做得正确。这里有一个旧的:Php 因为我正在将mysqli查询更改为PDO准备的语句,所以我可以消除所有转义吗?,php,mysqli,pdo,sanitization,Php,Mysqli,Pdo,Sanitization,我正在放弃做正确的事情,并将所有mysqli查询改为使用PDO,因此我希望有人能确认我做得正确。这里有一个旧的: $sql = "INSERT into profile (profileid, name, description) values ('$profileid', '$name', '$description')"; $sql= mysqli_query($connection,$sql); if (!$sql) { die("Datab
$sql = "INSERT into profile (profileid, name, description) values ('$profileid', '$name', '$description')";
$sql= mysqli_query($connection,$sql);
if (!$sql) {
die("Database query failed: " . mysqli_error($connection));
} else {
redirect_to('/my-account');
}
下面是我如何重写的:
$stmt = $pdo->prepare("INSERT into pools (profileid, name, description) values (:profileid, :name, :description)");
$stmt->execute([':profileid' => $profileid, ':name' => $name, ':poolname' => $poolname, ':description' => $description]);
redirect_to('/my-pools');
当我测试时,它似乎工作得很好,只是想确保我做的每件事都是正确的。一切看起来都好吗
另外,我想我的主要问题是,在我以前的mysqli查询之前,我会这样做来清理数据:
$description = mysqli_real_escape_string($connection,$_POST['description']);
对于PDO,只要我在语句中使用占位符,我就不再需要那个了,对吗?希望在切换到PDO后删除代码中的所有转义内容之前进行确认。这会起作用,但您只是将所有参数绑定为字符串,这是将绑定值传递给execute方法时的默认行为 如果需要更多控制或希望更具体地说明参数的类型,则应使用bindValue和bindParam并传递一个PDO预定义常量:
PDO::PARAM_BOOL
PDO::PARAM_NULL
PDO::PARAM_INT
PDO::PARAM_STR
PDO::PARAM_LOB
PDO::PARAM_STMT
PDO::PARAM_INPUT_OUTPUT
文档中的示例:
<?php
/* Execute a prepared statement by binding PHP variables */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);
$sth->execute();
请参阅以下答案以了解bindValue和bindParam之间的差异:
是的。你说得对。如果使用准备好的语句,则不需要,甚至应该转义数据。原因是当使用准备好的语句时,查询和值是分开发送的。查询将不会与值连接。使用mysqli,您也不必。我想说,PDO更好,所以如果你愿意,请转换,但我想你应该知道,你不需要PDO来准备语句。嗯,你认为mysqli准备语句比使用PDO更有意义吗?还是一个六个,另一个半打?