-4

目前,我正在开发我的第一个网站。现在,我正在实现 PHP 的 MySQL 扩展。然而,从我一直在阅读的内容来看,使用 PHP 的 PDO 将是一种更好的方法,原因有很多,例如使用占位符等等。

在浏览了一些代码之后,我对一些事情感到好奇。例如,假设我创建了一个连接和查询:

$pdo = new PDO('mysql:host=localhost;dbname=something','root','abc');

$sql="select id from users where username = :username and password = :password";

$stmt = $pdo->prepare($sql);

$stmt->bindParam(":username",$_POST['username']);
$stmt->bindParam(":password",$_POST['password']);

$stmt->execute();

首先,是否 $stmt->execute(); 实际执行整个查询?如果是这样,为什么?如果是这种情况,我的假设是,在某种程度上,它本质上与准备好的语句相关联,因此它绑定到准备好的 sql 语句。

此外,很明显准备好的语句可以更好地防止 sql 注入。我的问题是什么时候在 PDO 中清理了用户输入。为了解释,在 MySQL 扩展中,诸如 mysql_real_escape_string() 之类的函数必须在清理时进行硬编码。

如果使用 MySQL 扩展时不存在使用 PDO 的任何其他复杂性,我很想知道。

任何反馈表示赞赏。

4

1 回答 1

1

此外,很明显准备好的语句可以更好地防止 sql 注入。我的问题是什么时候在 PDO 中清理了用户输入。为了解释,在 MySQL 扩展中,诸如 mysql_real_escape_string() 之类的函数必须在清理时进行硬编码。

理想情况下,它作为数据直接传递给数据库驱动程序(头韵!总是很棒)。但是,如果 PDO 必须模拟准备好的语句,那么它会在执行查询时完成。

首先,是否 $stmt->execute(); 实际执行整个查询?如果是这样,为什么?如果是这种情况,我的假设是,在某种程度上,它本质上与准备好的语句相关联,因此它被绑定[原文如此]到准备好的 sql 语句。

是的。$stmt->execute()已连接到,$stmt因为您正在调用它$stmt。我不确定如何进一步解释这一点。

于 2012-09-10T00:20:55.890 回答