Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 因为我正在将mysqli查询更改为PDO准备的语句,所以我可以消除所有转义吗?_Php_Mysqli_Pdo_Sanitization - Fatal编程技术网

Php 因为我正在将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

我正在放弃做正确的事情,并将所有mysqli查询改为使用PDO,因此我希望有人能确认我做得正确。这里有一个旧的:

$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更有意义吗?还是一个六个,另一个半打?