为什么这个'case'查询在codeigniter中没有返回'true'或'false'

时间:2015-11-30 17:03:01

标签: php mysql 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'结果存在,但我不知道如何检索它。

2 个答案:

答案 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没有布尔类型,因此如果您想将响应视为布尔值,则应使用01

接下来,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)的设计非常快速有效。利用现代技术和计算机设备,为了确定原始输入,“蛮力”输出这些算法变得微不足道。

     

由于现代计算机能够“反转”这些散列算法的速度有多快,许多安全专业人员强烈建议不要使用它们进行密码散列。