我有一个查询,用于检查表中是否存在行。它应该返回一个"true"或"false"值,但事实并非如此。
查询和代码如下所示。我应该提到,我使用CodeIgniter框架,因此使用了对象名称和函数名称。
$query="SELECT CASE WHEN EXISTS
(
SELECT * FROM Users
WHERE Email=".$this->db->escape($email)."
AND PassWord=MD5(".$this->db->escape($password).")
)
THEN 'TRUE'
ELSE 'FALSE'
END";
$result=$this->users_db->query($query);
$resulting_array=$result->row();
echo "<pre>".var_dump($resulting_array)."</pre>";
此代码给出以下结果:
object(stdClass)#22 (1) {
["CASE WHEN EXISTS
(
SELECT * FROM Users
WHERE Email='r.blaauwen@erasmusmc.nl'
AND PassWord=MD5('rrt')
)
THEN 'TRUE'
ELSE 'FALSE'
END"]=>
string(5) "FALSE"
}
$result->row();
似乎传递了一个对象,而不是数组/string/boolean。"FALSE"的结果是存在的,但我不知道如何检索它。
MySQL没有布尔类型,因此如果您想将响应视为布尔类型,则应使用0
或1
。
接下来,CodeIgniter的数据库类将返回一个标准对象,但它不是很容易访问,因为您选择的是未命名的对象。如果您将字段别名,那么您可以更容易地访问它:
$query="SELECT (CASE WHEN EXISTS
(
SELECT * FROM Users
WHERE Email=".$this->db->escape($email)."
AND PassWord=MD5(".$this->db->escape($password).")
)
THEN 1
ELSE 0
END
) AS userExists";
$result=$this->users_db->query($query);
$resulting_array=$result->row();
if ($resulting_array->userExists) {
echo "User Exists!";
} else {
echo "Invalid password/no user";
}
最后,使用MD5对密码进行散列是一个非常糟糕的想法。阅读关于密码的官方PHP文档,了解原因:
为什么常见的哈希函数(如md5()和sha1())不适合用于密码
诸如MD5、SHA1和SHA256之类的哈希算法被设计为非常快速和高效。随着现代技术和计算机设备的发展,为了确定原始输入,对这些算法的输出进行"暴力"已经变得微不足道。
由于现代计算机可以很快"逆转"这些哈希算法,许多安全专业人士强烈建议不要使用它们进行密码哈希。
您可以在sql中创建一个别名,如下所示:
$query="SELECT CASE WHEN EXISTS
(
SELECT * FROM Users
WHERE Email=".$this->db->escape($email)."
AND PassWord=MD5(".$this->db->escape($password).")
)
THEN 'TRUE'
ELSE 'FALSE'
END
AS my_result";
$result=$this->users_db->query($query);
$resulting_array=$result->row();
echo $resulting_array->my_result;
或者你可以这样做:
$resulting_array=$result->row();
//Getting the properties of the given object
$props = get_object_vars($resulting_array);
//Gets the name of the property
$name = array_keys($props)[0];
echo $resulting_array->$name;