我遇到查询问题。我使用以下过程从一个表中查询(使用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
欢迎任何建议!!
答案 0 :(得分:1)
这不是一个明确的答案,但我相信我记得PDO的一个错误并且命名了绑定参数,同一个命名的绑定参数出现不止一次。 (当我们查看它时,看起来命名参数被转换为位置参数,而bind_param只设置其中一个参数。
作为一种解决方法,我们确保命名参数在语句中只出现一次。
在您的情况下,您可以尝试(作为测试)修改SQL,使其只有两个命名绑定参数,例如
SELECT *
FROM `user`
WHERE :username IN (`username`,`email`)
AND `password`=:password AND `valid`='1';
另一种方法是创建第三个命名参数,并为第三个参数提供单独的绑定值。
这不是一个明确的答案,只是建议一种可能允许您调试此问题的方法。
(在我们的例子中,我们采用了解决方法,SQL语句中的每个命名参数都是唯一的,我们为每个参数提供了单独的绑定。)