0

我在查询时遇到问题。我使用以下过程(使用 php PDO 和 MySQL)从一个表中查询:

构建查询字符串 $sql:

SELECT *  
FROM  `user`  
WHERE (`username`=:username OR  `email`=:username) 
      AND  `password`=:password AND  `valid`='1'; 

并使用这个数组 $params:

Params
(
    [:password] => 18155dbf12503d726883784d1d9755f8d3382ba7
    [:username] => fakeEmail@fakeEmail.com
)

调用这个函数:

$results_array = $database->QueryForObject($sql, $params);

public function QueryForObject($query, $binds)
{
     $stmt = $this->db->prepare($query);

     foreach($binds as $bindKey => &$key)
     {
        $stmt->bindParam($bindKey, $key, PDO::PARAM_STR);
     }

     return $this->RunObjectQuery($stmt, NULL , "stdClass");
}

我的问题是用户名可能不完整甚至丢失,它用来查找用户的只是密码......我很确定它不应该这样做,但我不知道为什么。

作为旁注,这里是我的表的描述:

Field            , Type                                           , Null  ,Key  ,Default , Extra
id               , int(10) unsigned                               , NO    ,PRI  ,NULL     auto_increment 
username         , varchar(30)                                    , NO    ,UNI  ,NULL                    
email            , varchar(50)                                    , NO    ,     ,NULL                    
password         , varchar(100)                                   , NO    ,     ,NULL                    
first_name       , varchar(30)                                    , NO    ,     ,NULL                    
last_name        , varchar(30)                                    , NO    ,     ,NULL                    
rights           , enum('normal','medium','high','admin','super') , NO    ,     ,NULL                    
last_loggedin    , timestamp                                      , YES   ,     ,NULL                    
status           , enum('current','expired','temporary')          , NO    ,     ,NULL                    
valid            , tinyint(1)                                     , NO    ,     ,NULL                    
other_comments   , varchar(500)                                   , YES   ,     ,NULL                    
gender           , enum('male','female')                          , YES   ,     ,NULL                    
company_position , varchar(50)                                   ,  YES  ,     , NULL   

欢迎任何建议!

4

1 回答 1

1

这不是一个明确的答案,但我相信我记得 PDO 和命名绑定参数的一个错误,相同的命名绑定参数出现了不止一次。(当我们查看它时,它看起来命名参数正在被转换为位置参数,而 bind_param 只是设置其中一个参数。

作为一种解决方法,我们确保命名参数在语句中只出现一次。

在您的情况下,您可以尝试(作为测试)修改 SQL,使其只有两个命名的绑定参数,例如

SELECT *  
  FROM  `user`  
 WHERE :username IN (`username`,`email`)
   AND  `password`=:password AND `valid`='1'; 

另一种选择是创建第三个命名参数,并为第三个参数提供单独的绑定值。

这不是一个明确的答案,只是一个可以让您调试此问题的方法的建议。

(在我们的例子中,我们采用了变通方法,SQL 语句中的每个命名参数都是唯一的,并且我们为每个参数提供了单独的绑定。)

于 2013-07-17T04:05:34.443 回答