2010-05-29 81 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