我有一个查询,检查表中是否存在行。它应该返回'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();
传递了一个对象而不是数组/字符串/布尔值。 'FALSE'结果存在,但我不知道如何检索它。
答案 0 :(得分:2)
你可以在你的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;
答案 1 :(得分:2)
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哈希密码是非常糟糕的主意。阅读official PHP documentation about passwords以了解原因:
为什么常见的散列函数(如md5()和sha1()不适用于密码?
哈希算法(如MD5,SHA1和SHA256)的设计非常快速有效。利用现代技术和计算机设备,为了确定原始输入,“蛮力”输出这些算法变得微不足道。
由于现代计算机能够“反转”这些散列算法的速度有多快,许多安全专业人员强烈建议不要使用它们进行密码散列。