PHP PDO与MySQL扩展问题

时间:2012-09-10 00:13:07

标签: php mysql pdo

目前,我正在开发我的第一个网站。现在,我正在实现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的任何其他复杂问题,我很想知道。

感谢任何反馈。

1 个答案:

答案 0 :(得分:1)

  

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

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

  

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

是。 $stmt->execute()已与$stmt相关联,因为您在$stmt上调用了{{1}}。我不确定如何进一步解释这一点。