【问题标题】:Why does this 'case' query not return 'true' or 'false' in codeigniter为什么这个“案例”查询在 codeigniter 中不返回“真”或“假”
【发布时间】:2016-03-04 09:43:29
【问题描述】:

我有一个查询来检查表中的行是否存在。它应该返回一个“真”或“假”值,但事实并非如此。

查询和代码如下所示。我应该提到我使用 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-&gt;row(); 传递了一个对象而不是数组/字符串/布尔值。 'FALSE' 结果在那里,但我不知道如何检索它。

【问题讨论】:

  • SELECT CASE WHEN EXISTS ( SELECT * FROM Users WHERE Email=".$this-&gt;db-&gt;escape($email)." AND PassWord=MD5(".$this-&gt;db-&gt;escape($password).") ) THEN 'TRUE' ELSE 'FALSE' END AS my_alias_for_data 然后echo $resulting_array-&gt;my_alias_for_data.... 虽然$resulting_array 用词不当,因为您要为行返回对象,而不是数组
  • 工作就像一个魅力,非常感谢。你会把它作为答案发布,以便我可以将其标记为已解决?

标签: php mysql codeigniter


【解决方案1】:

你可以像这样在你的 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;

【讨论】:

    【解决方案2】:

    MySQL 没有 boolean 类型,因此如果要将响应视为 boolean,则应使用 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 等哈希算法被设计为非常快速和高效。借助现代技术和计算机设备,“蛮力”这些算法的输出以确定原始输入已变得微不足道。

    由于现代计算机可以“逆转”这些散列算法的速度有多快,许多安全专家强烈建议不要将其用于密码散列。

    【讨论】:

    • 别名和从对象中检索数据为我做了这件事。谢谢你。另外,我知道 MD5 和 sha1 是不好的选择,但由于环境原因,它必须是 MD5。谢谢你的警告
    猜你喜欢
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 2015-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多