如果字符串包含空格或仅包含字母字符,则Mysql select查询不返回任何内容

时间:2013-12-16 12:11:33

标签: php mysql

更新

我正在连接错误的数据库。是的,请吐我,我应得的。我很抱歉遇到了麻烦。

如果我试试这个,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';它也没有返回任何内容所以我认为它只接受数字。这是为什么?密码列的类型为VARCHAR(255)。

更新

我正在使用this PDO Wrapper class来管理与数据库的交易。

调查信息

使用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使用它,则无法找到结果。

2 个答案:

答案 0 :(得分:1)

为什么使用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?';

答案 1 :(得分:0)

要回答标题中的问题,如果字符串包含密码,则Mysql选择查询从不会失败。

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