目前,我正在开发我的第一个网站。现在,我正在实现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的任何其他复杂问题,我很想知道。
感谢任何反馈。
答案 0 :(得分:1)
此外,很明显,准备好的语句可以更好地防止sql注入。我的问题是在PDO中用户输入清理的点。为了解释,在MySQL扩展中,在清理时必须对诸如mysql_real_escape_string()之类的函数进行硬编码。
理想情况下,它作为数据直接传递给数据库驱动程序(头脑!真棒,总是如此)。但是,如果PDO必须模拟准备好的语句,那么在执行查询时就完成了。
首先,$ stmt-> execute();实际执行整个查询?如果是这样,为什么?如果是这种情况,我的假设是,在某种程度上,它本质上与准备好的语句相关联,因此它被绑定到 [sic] 到准备好的sql语句。
是。 $stmt->execute()
已与$stmt
相关联,因为您在$stmt
上调用了{{1}}。我不确定如何进一步解释这一点。