更新
我连接到错误的数据库。是的,请向我吐口水,这是我应得的。我很抱歉给你带来麻烦。
如果我尝试这样做,MySQL(通过PDO)不会返回任何结果
$db = new db('mysql:host='.DB_SERVER.';dbname='.DB_NAME, DB_USERNAME, DB_PASSWORD);
$email = 'alexandre@domain.com';
$mot_de_passe = 'Un mot et un chiffre 8?';
$bind= array(":email"=>$email, ":mot_de_passe"=>$mot_de_passe);
$results = $db->select("users", "email=:email AND mot_de_passe=:mot_de_passe", $bind);
但是如果尝试这样做,MySQL会正确地返回行。
$db = new db('mysql:host='.DB_SERVER.';dbname='.DB_NAME, DB_USERNAME, DB_PASSWORD);
$email = 'alexandre@domain.com';
$mot_de_passe = '1234';
$bind= array(":email"=>$email, ":mot_de_passe"=>$mot_de_passe);
$results = $db->select("users", 'email=:email AND mot_de_passe=:mot_de_passe', $bind);
如果$mot_de_passe = 'Pourquoi';
,它也不返回任何值,所以我假设它只接受数字。为什么?Password列的类型为VARCHAR(255)。
更新
我使用这个PDOWrapper类来管理数据库中的事务。
调试信息
使用PDO语法:
$sth = $db->prepare('SELECT * from `users` where email=:email AND mot_de_passe=:mot_de_passe');
$sth->bindValue(':email', $email, PDO::PARAM_STR);
$sth->bindValue(':mot_de_passe', $mot_de_passe, PDO::PARAM_STR);
$sth->execute();
$result = $sth->fetchAll();
$sth->debugDumpParams();
生成以下调试信息:
SQL: [81] SELECT * from `users` where email=:email AND mot_de_passe=:mot_de_passe
Params: 2
Key: Name: [6] :email
paramno=-1
name=[6] ":email"
is_param=1
param_type=2
Key: Name: [13] :mot_de_passe
paramno=-1
name=[13] ":mot_de_passe"
is_param=1
param_type=2
以下是来自mysql的general_log文件的查询:
SELECT * from `users` where email='alexandre@domain.com' AND mot_de_passe='Pourquoi ?'
如果我直接使用这个查询,它会返回预期的结果。如果我通过PDO使用它,它不会找到结果。
为什么要使用urldecode()
函数?它制动特殊符号,与mysql转义无关。
试试这个:
$email = 'alexandre@domain.com';
$mot_de_passe = 'Un mot et un chiffre 8?';
$bind= array(":email"=>$email, ":mot_de_passe"=>$mot_de_passe);
$results = $db->select("users", "email=:email AND mot_de_passe=:mot_de_passe", $bind);
试试PDO风格的这款:
$sth = $db->prepare('SELECT * from `users` where email=:email AND mot_de_passe=:mot_de_passe');
$sth->bindValue(':email', $email, PDO::PARAM_STR);
$sth->bindValue(':mot_de_passe', $mot_de_passe, PDO::PARAM_STR);
$sth->execute();
$result = $sth->fetchAll();
检查一下,这个查询是否返回了什么?
SELECT * from `users` where email='alexandre@domain.com' AND mot_de_passe='Un mot et un chiffre 8?';
要回答标题中的问题,如果字符串包含密码,Mysql选择查询never将失败。
说到您自己的代码没有返回所需的结果,只需调试代码并仔细检查数据即可。