若字符串包含空格或仅包含字母字符,则Mysql选择查询不返回任何结果


Mysql select query returns nothing if string contains spaces or just alphabetical characters

更新

我连接到错误的数据库。是的,请向我吐口水,这是我应得的。我很抱歉给你带来麻烦。

如果我尝试这样做,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将失败。

说到您自己的代码没有返回所需的结果,只需调试代码并仔细检查数据即可。