【问题标题】:PHP PDO versus MySQL Extension QuestionsPHP PDO 与 MySQL 扩展问题
【发布时间】:2012-09-10 00:13:06
【问题描述】:

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

感谢任何反馈。

【问题讨论】:

  • 请问为什么我被否决了?在我看来,这是建设性的。
  • “如果是这样,为什么?” --- 因为你调用了它?
  • 这不是问题,为什么执行 $stmt->execute() 会导致整个函数执行。该语法与简单执行相比有什么意义>
  • 你了解对象的工作原理吗?
  • @Mlagma:因为你没有绑定也不能绑定参数到字符串,而且字符串没有execute()方法,因为它本质上不是SQL语句?

标签: php mysql pdo


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多