![](/img/trans.png)
[英]Why does my `if(result !== "false")` return true?
[英]Why does this 'case' query not return 'true' or 'false' in codeigniter
我有一个查询,用于检查表中是否存在行。 它应返回“ 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”结果在那里,但是我不知道如何检索它。
您可以像这样在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;
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之类的哈希算法被设计为非常快速和高效。 随着现代技术和计算机设备的出现,“蛮力”将这些算法的输出确定原始输入变得微不足道了。
由于现代计算机能够快速“逆向”这些哈希算法,因此许多安全专业人员强烈建议不要将其用于密码哈希。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.