我尝试使用会话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');
但是,我在页面上看不到用户姓氏。我已经检查了一个无对象查询,我看到了一个姓氏但是只要它的对象不起作用。
答案 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的那个突破是。好。它在那做什么?
但是,你的代码还有很多东西要破坏了。所以这是代码审查:
你显然知道构造函数是什么。你在两个类中都使用它。但是,不同。为什么?您User
班级有public function User()
,但您的UserService
有public 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
您的User
类具有公共var $属性。所以它可以从外部世界访问。但您也提供了get
和set
方法。为什么呢?
一个好的规则是:public $var
气味,protected $var
应该谨慎使用,private $var
是好东西。
如果我查看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对象可以知道它有什么。
好的,我在你的代码中概述了一些错误。您应该研究的一些概念:
所以,为了这篇文章,这里是你的代码改版。请注意,我直接将其写入此评论框中,因此我可能错过了一些内容并犯了一些错误。
变更列表:
用法:
$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();