簡體   English   中英

為什么這個'case'查詢在codeigniter中不返回'true'或'false'

[英]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沒有布爾類型,因此如果要將響應視為布爾值,則應使用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哈希密碼是一個非常糟糕的主意 閱讀有關密碼官方PHP文檔,以了解原因:

為什么常見的哈希函數(例如md5()和sha1())不適合密碼?

諸如MD5,SHA1和SHA256之類的哈希算法被設計為非常快速和高效。 隨着現代技術和計算機設備的出現,“蠻力”將這些算法的輸出確定原始輸入變得微不足道了。

由於現代計算機能夠快速“逆向”這些哈希算法,因此許多安全專業人員強烈建議不要將其用於密碼哈希。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM