2010-05-29 79 views
0

我正在嘗試爲我正在處理的項目製作OO登錄系統,並且無法將變量插入查詢字符串。在下面的代碼中,如果將「$ TBL_NAME」替換爲它的實際表名稱。爲什麼$ TBL_NAME沒有轉化爲$ TBL_NAME的價值?PHP mySQL查詢和PHP變量

class UserDB { 

    private $TBL_NAME = "users"; 

    public static function CheckLogin($username, $password) { 

    Database::Connect(); 

    $username = stripslashes($username); 
    $password = stripslashes($password); 
    $username = mysql_real_escape_string($username); 
    $password = mysql_real_escape_string($password); 

    $sql="SELECT uid FROM $TBL_NAME WHERE username='$username' AND password='$password' "; 
    $result =mysql_query($sql); 
    $count=mysql_num_rows($result); 
    if ($count==1) 
     return true; 
    else 
     return false; 
    } 

查詢返回false。

+0

你總是可以做「echo $ sql;」看看你在建什麼。 :)但你知道這一點。 – 2010-05-29 19:28:48

+0

甚至沒有想到這一點,謝謝,我覺得自己像一個白癡:) – user48202 2010-05-29 20:32:31

+0

你花了一個錯誤的地方調用Database :: Connect();和stripslashes – 2010-05-30 09:10:26

回答

-1

聲明$TBL_NAMEprivate static,而不僅僅是private,並使用self::$TBL_NAME。不確定字符串中的語法 - 我只是使用連接運算符來代替(即,"SELECT uid FROM " . self::$TBL_NAME . " WHERE …"

+0

此外,如果'get_magic_quotes_gpc()'爲'true',並且該值來自'$ _GET','$ _POST','$ _COOKIE'或'$ _REQUEST',那麼您應該只使用'stripslashes' - 這樣做在你的數據庫類中是可怕的泄漏抽象。 – 2010-05-29 19:13:06

+0

還要注意,如果'$ result'不是有效的結果資源,'mysql_num_rows()'會發出警告。另外,你永遠不應該以明文存儲密碼!檢索行,並使用存儲的密碼作爲提供散列函數的哈希函數(將散列操作的結果與存儲的密碼進行比較,如果匹配,則返回'true'),請參閱'crypt()') – 2010-05-29 19:14:35

2

更多關於您的代碼不起作用的原因:Php的OO語法要求您使用如果你的CheckLogin方法不是靜態的,變量$TBL_NAME仍然不會被設置在函數內部。如果你的CheckLogin方法不是靜態的,變量$TBL_NAME仍然不會被設置在函數內部。要獲得實例變量,您必須使用$this->TBL_NAME

由於您的方法靜態,它有s訪問靜態變量而不是實例變量,所以你必須使變量靜態。一旦你這樣做了,你可以用self::來訪問它,就像Mo的回答一樣。

+0

awesome,I欣賞更多信息。看起來我在其他課上也有一些工作要做。如果我省略了$ this->例如變量,它是否會在當前範圍內創建新變量? – user48202 2010-05-29 20:20:20

+0

是的..內部函數變量 – novato 2010-05-29 20:38:52