【问题标题】:PDO not binding placeholdersPDO 不绑定占位符
【发布时间】:2013-12-10 14:15:19
【问题描述】:

我正在尝试将我的登录脚本从 mysql 更改为 PDO。 对于我的脚本的其余部分,除了这部分之外,所有接缝都很好,我就是不明白为什么。

我有下面的代码

...
$pasword=md5($_POST['password']);
$email=$_POST['email'];

....

$query ="SELECT id FROM guests WHERE email=':eml' AND password =':pwd' AND lead_guest=17";
// $param2=array(':eml'=>$email,':pwd'=>$pasword);
$state=$dbh->prepare($query);
$state->bindParam(':eml',$email);
$state->bindParam(':pwd',$pasword);
$state->execute();

在当前状态下,它将返回 0 的行数(它不应该),我也尝试过

  //$state->bindParam(':eml',$email);
  //$state->bindParam(':pwd',$pasword);
  $state->execute($param2);

它也返回 0 的行数。

变量$email 和$pasword 当我echo 出来时是正确的,并且脚本使用mysql_ 函数完美运行。

$dbh 变量在标头中创建,并带有$query ="select id where 1",它按预期工作。

我确信(尽管可能是错误的)我将问题缩小到脚本的 state->bindParam() 部分。我完全迷失了为什么脚本的这一部分不起作用任何建议热烈欢迎。

【问题讨论】:

  • 只用 MD5 散列密码是不够的;使用strong password hashing algorithm。
  • 嘿,至少 PHP 准备好的语句的问题开始更频繁地出现在 stackoverflow 上,或者这只是我的印象。
  • @Mihai 我每天都看到 SQL 注入漏洞,甚至每小时。
  • 我认为 pdo 应该可以防止 sql 注入?
  • @MarkGilchrist - PDO 帮助您编写防止 SQL 注入的代码;如果有人编写糟糕的 SQL,那么他们使用的库并不重要。你的代码很好 - 是那些使用 PDO 并且仍然直接从 $_POST 直接连接变量的人做错了。

标签: php mysql pdo prepared-statement


【解决方案1】:

删除单引号 ':

SELECT id FROM guests WHERE email=:eml AND password =:pwd

【讨论】:

    【解决方案2】:

    您的查询将是

    $query ="SELECT id FROM guests WHERE email=:eml AND password =:pwd AND lead_guest=17";
    

    :eml 和 :pwd 周围没有单引号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-24
      • 1970-01-01
      • 2013-05-17
      • 2021-09-07
      • 2014-04-11
      相关资源
      最近更新 更多