Php 为什么这个“case”查询在codeigniter中不返回“true”或“false”

Php 为什么这个“case”查询在codeigniter中不返回“true”或“false”,php,mysql,codeigniter,Php,Mysql,Codeigniter,我有一个查询,检查表中是否存在一行。它应该返回“true”或“false”值,但事实并非如此 查询和代码如下所示。我应该提到,我使用了CodeIgniter框架,因此使用了对象名和函数名 $query="SELECT CASE WHEN EXISTS ( SELECT * FROM Users WHERE Email=".$this->db->escape($email)."

我有一个查询,检查表中是否存在一行。它应该返回“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>";

似乎$result->row;传递了一个对象,而不是数组/字符串/布尔值。“FALSE”结果在那里,但我不知道如何检索它。

您可以在sql中创建一个别名,如下所示:

$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;
或者您可以这样做:

$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";
}

MySQL没有布尔类型,因此如果要将响应视为布尔类型,则应使用0或1

接下来,CodeIgniter的数据库类将返回一个标准对象,但它不是很容易访问,因为您正在选择一些未命名的对象。如果为该字段添加别名,则可以更轻松地访问该字段:

最后,使用MD5散列密码是一个非常糟糕的主意。阅读以下内容以了解原因:

为什么md5和sha1等常见哈希函数不适合用于密码

散列算法(如MD5、SHA1和SHA256)设计得非常快速高效。随着现代技术和计算机设备的发展,为了确定原始输入,对这些算法的输出进行暴力处理变得非常简单

由于现代计算机能够以多快的速度逆转这些散列算法,许多安全专家强烈建议不要使用它们进行密码散列


选择存在时的案例从电子邮件=.$this->db->escape$Email的用户中选择*。密码=MD5.$this->db->escape$PassWord。然后“TRUE”或“FALSE”结束为\u数据的我的\u别名\u,然后回显$resulted\u array->my\u alias\u for \u data。。。。虽然$U数组用词不当,因为您要为行取回一个对象,而不是像符咒一样加工的数组,非常感谢。你能把它作为一个答案发布,这样我就可以把它标记为已解决了吗?别名和从对象中检索数据为我做到了这一点。非常感谢。另外,我知道MD5和sha1是不好的选择,但由于环境的原因,它必须是MD5。谢谢你的警告
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"
}
$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";
}