【问题标题】:retrieve information from a mysql from database using PHP OOP使用 PHP OOP 从数据库中检索 mysql 信息
【发布时间】: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);

标签: php mysql oop


【解决方案1】:

改变

$sql  = "SELECT * FROM ".static::$table_name;

$sql  = "SELECT * FROM ".self::$table_name;

还有,

$result_array = static::find_by_sql($sql);

$result_array = self::find_by_sql($sql);

您需要使用单词self 而不是static

【讨论】:

  • 当我从查询中获取结果时,静态工作,那么为什么我需要将它们从静态更改为自我?这会让我得到我缺少的最后一个字段吗?
  • @Jim 阅读此内容,这将清除有关 self 和 static 的内容。 stackoverflow.com/questions/4718808/php-can-static-replace-self
  • 我进行了更改,但 fname 和 lname 仍然为 NULL,所以我认为这没有区别
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-24
  • 2017-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-07
  • 1970-01-01
相关资源
最近更新 更多