PHP无法从对象回显用户的名称

时间:2014-07-30 07:42:34

标签: php mysql object

我尝试使用会话var并通过页面上的对象调用登录的用户详细信息。用户已通过我的登录对象登录。这是我的对象:

class User {
   public $userdata = array();


//instantiate The User Class
   public function User(){  }

public function set($var, $value) {
    $this->userdata[$var] = $value; 
}

public function get($var) {
    if(isset($this->userdata[$var]))
    {
        return $this->userdata[$var];
    }
    return NULL;
}

  function __destruct() {
    if($this->userdata){
       $this->userdata;
    }
  } 
}

class UserService {
private $db;
private $fields;
public $user;
private $session;


    public function __construct() {
        $this->db = new Database();

    }



//  //get current user by ID
    public function getCurrentUser($session) {

            $this->session = $session;

        $query = sprintf("SELECT * FROM User WHERE idUser=%s",
        $this->db->GetSQLValueString($this->session, "int"));
        $result = $this->db->query($query);

         if($result && $this->db->num_rows($result) > 0){

            //create new user
                $user = new User();
                $row = $this->db->fetch_assoc($result);

            //set as object
            foreach($row as $key => $value) {
                $user->set($key, $value);

                break;
            }
            return $user;
            //return $this->user;

        }
        return NULL;    


    }
 }

在我的页面上,我检查了我的会话var有一个值,所以我这样称呼对象。

 $um = new UserService();
 $user = $um->getCurrentUser($_SESSION['MM_Username']);
 echo $user->get('UserSurname');

但是,我在页面上看不到用户姓氏。我已经检查了一个无对象查询,我看到了一个姓氏但是只要它的对象不起作用。

2 个答案:

答案 0 :(得分:2)

我认为问题在于:

foreach($row as $key => $value) {
                $user->set($key, $value);

                break; // you should probably remove it
            }

你应该使用不必要的中断,并且可能在设置例如id之后你停止设置另一个对象属性(UserSurname,Name等)。

此外,在$_SESSION['MM_Username']内部存储idUser而不是UserName

,这很令人困惑

答案 1 :(得分:0)

代码审核

  

Marcin Nabialek已经回答了你的问题。在foreach的那个突破是。好。它在那做什么?

但是,你的代码还有很多东西要破坏了。所以这是代码审查:

Constrcutors

你显然知道构造函数是什么。你在两个类中都使用它。但是,不同。为什么?您User班级有public function User(),但您的UserServicepublic function __construct()。选一个,并坚持下去。如果您可以选择,请选择正确的:__construct()

来自phpdoc

  

从PHP 5.3.3开始,与命名空间类名的最后一个元素同名的方法将不再被视为构造函数。此更改不会影响非命名空间的类。

因此,命名用户类的名称将破坏您的构造函数。这可能不是现在的问题,但它闻起来。只需使用__construct()。这是首选的正确方法。我们今天住,而不是php4-天的过去:)

代码样式

天啊,今天很多小猫都死了!

有时你在一个新行上有一个括号:

if (isset($this->userdata[$var]))
{
    return $this->userdata[$var];
}

有时候你没有

if($this->userdata){
    $this->userdata;
}

再次,选择一些并坚持下去。如果你想保存一些小猫。坚持标准:PSR-1& PSR-2

Public atributes,jeuk

您的User类具有公共var $属性。所以它可以从外部世界访问。但您也提供了getset方法。为什么呢?

一个好的规则是:public $var气味,protected $var应该谨慎使用,private $var是好东西。

你的课程是什么?为什么不使用__constructors?

如果我查看User类,我总是看__constructor。 User类不需要变量。所以我应该可以这样做:

$me = new User();
$me->getName(); //who am I ?

这个当然不起作用。没有名字的用户没有意义。它总是有一个。所以要求它!

class User
{
    public function __construct($name)
    {
        $this->name = $name;
    }
}
$me = new User('jeroen');
$m->getName(); //I am jeroen :)

如果你需要什么东西要求它;) 所以:

public function __construct(Database $db)

是滚动的方式!

不要让我读数据库

现在,您的get / set方法与数据库紧密结合。如果更改数据库中列的名称。您可以将整个代码折射为get('new_column_name');。听起来很有趣!

此外,该方法对我说了什么?没什么,写得容易吗?无

getName说它做了什么,它让我得名。

get告诉我,我得到了什么。但是什么?

其他问题上升:get('name') =?= get('Name')

User对象可以知道它有什么。

摘要

好的,我在你的代码中概述了一些错误。您应该研究的一些概念:

  • SOLID
  • PSR标准
  • 工厂模式(这将帮助您使用UserService
  • 控制倒置

所以,为了这篇文章,这里是你的代码改版。请注意,我直接将其写入此评论框中,因此我可能错过了一些内容并犯了一些错误。

变更列表:

  • 我清理了造型
  • 我添加了一些评论
  • 删除了_destruct()(它没有做任何事情)
  • 使用PDO而不是Databse类(不知道你在使用什么,但看起来像一个PDO包装器)
  • 更改了一些表名和select查询(从不在selct查询中使用* .Onyl要求你提供所需的内容)
  • 使用预备陈述
  • 更多灵活性
  • 例外而不是返回null;
  • 您的$ DBH可以放入单件/工厂以简化您的$ dbh创建:Database :: getInstance();或DatabaseFactory :: getInstance() - > createPDO();或者。很久以来我写了这样的东西

用法:

$DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);

$userRepository = new UserRepository($DBH);

$id = $_SESSION['MM_Username'];

try
{
    $me = $userRepository->find($id);
}
catch( UserNotFoundException $e )
{
    //user not found
}

print $me->getSurName();

用户类:

class User
{

    /**
     * If the User persists in the DataBase
     * $id holds it's db id
     * @var int
     */
    private $id;

    /**
     * @var String
     */
    private $surName;

    /**
     * @var String
     */
    private $firstName;

    /**
     * @param String $firstName
     * @param String $surName  
     * @param int    $dbId        
     */
    public function __construct($firstName, $surName, $dbId=null)
    {
        $this->id = $dbId;
        $this->firstName = $surName;
        $this->surName = $surName;
    }

    /**
     * Does the user ecist in the DB?
     * @return boolean
     */
    public function hasId()
    {
        return $this->id !== null;
    }

    /**
     * @return int
     * @return null   user doesn't persist in DB
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Return the users full name
     *  The fullname consists of his FirstName and SurNAme
     * @return String
     */
    public function getName()
    {
        return $this->firstName . ' ' . $this->surName;
    }

    /**
     * @return String
     */
    public function getSurName()
    {
        return $this->surName;
    }

    /**
     * @return String
     */
    public function getFirstName()
    {
        return $this->firstName;
    }

    /**
     * Setters: we return $this to allow chaning
     */
    public function setId($id) 
    {
        $this->id = $id;
        return $this;
    }

    // ... other methods here. You can add extra swet stuff.
    // for instance check or it is a valid firstName, or email or ...

    //I removed your __destrouct, because wtf? it isn't doing anything at all
}

和您的UserRepository:

/**
 * The UserRepository queries the database and get's you your users
 */
class UserRepository
{

    private $db;

    public function __construct(PDO $db)
    {
        $this->db = $db;
    }

    public function find($id)
    {
        $statement = $this->db->prepare('SELECT id,first_name,sur_name FROM users WHERE id = :id');
        $statement->execute(array(
            'id' => $id
        ));

        if ( null === ($user = $statement->fetch(PDO::FETCH_ASSOC)) )
        {
            throw new UserNotFoundException();
        }

        return new User(
            $user['first_name'],
            $user['sur_name'],
            $user['id']
        );
    }

}

和例外:

class UserNotFoundException extends Exception();