【发布时间】:2014-11-25 12:59:32
【问题描述】:
我对我遇到的这个问题感到非常困惑。我正在尝试从我的数据库中获取信息,但它只是部分有效。我的 user.php 文件中有一个名为 authenticate 的函数,位于扩展 DatabaseObject 的 User 类中。
class User extends DatabaseObject{
protected static $table_name = "sellatext_users";
public $id;
public $email;
public $password;
public $fname;
public $lname;
public static function authenticate($email="", $password="") {
global $database;
$email = $database->escape_value($email);
$password = $database->escape_value($password);
$sql = "SELECT * FROM ".static::$table_name;
$sql .= " WHERE email = '{$email}' ";
$sql .= "AND password = '{$password}' ";
$sql .= "LIMIT 1";
$result_array = static::find_by_sql($sql);
var_dump($result_array);
die;
return !empty($result_array) ? array_shift($result_array) : false;
}
这很好用,如果我 var_dump($result_array) 我得到
array(1) {
[0]=> object(User)#5 (5)
{
["id"]=> string(1) "3"
["email"]=> string(18) "email_address"
["password"]=> string(8) "XXXXXXXX"
["fname"]=> NULL
["lname"]=> NULL
}
}
为安全起见,省略了电子邮件地址和密码,但我不明白为什么我的 fname 和 lname 都为 NULL。表格中有信息(这是我的名字),因为我可以通过 Navicat 访问表格。这两个字段都是 varchar 字段。
谁能指出我正确的方向?
谢谢。
【问题讨论】:
-
在类方法中使用
gloabl是非常糟糕的编码,它完全破坏了类的封装。当您扩展了该 DatabaseObject 类时,您不能使用$this->database->.... -
我的 DatabaseObject 在不同的文件中扩展了一个名为 Database 的类,如果不使用全局(我从中学到的教程以这种方式显示)我应该如何获取数据库信息?
-
如果每个类
extends前一个然后使用$this->a_property将查看$a_property 的当前对象,如果未找到将查找该属性的扩展类层次结构,直到找到它。类是否定义在不同的物理文件中并不重要,只要每个新类扩展即子类,前一个。如果您的教程建议在类结构中使用global,那么请找到更好的教程。 -
所以我应该使用 $database = $this->database;? 而不是全局 $database
-
不,删除全局行。然后在您使用过
$database的地方将其替换为$this->database->xxx,因此对于这一行$database->escape_value($email);将其更改为$this->database->escape_value($email);