2015-03-19 40 views
-1

我正在關注PHP Academy OOP登錄/註冊教程當前在16th part如何從php中的對象訪問變量?

我用這段代碼在$ data中創建對象。

$data = $this->_db->get('users', array($field, '=', $user)); 

然後這段代碼從該對象中添加值。

$this->_data = $data; 

,並試圖通過

public function data(){ 
    return $this->_data; 
} 

$this->data()->password 

最後的代碼拋出的錯誤訪問的變量。我試圖調試使用此代碼

$vars = get_object_vars ($this->_data); 
print_r($vars); 

正在打印此行

Array ([error] => [_requests] => Array ([0] => stdClass Object ([uid] => 16 [username] => admin [password] => 46651b6f1d743345d82d32da2cda7f891016ebe9f8b4416314b127e35b72fc30 [salt] => ²ê$ÓÕBF49ð®}€Æ¥A];ÛAc«íÊùÍ„s [name] => admin [joined] => 2015-03-17 22:53:52 [groups] => 1))) 

這是什麼意思?我如何訪問這些字段?

這裏是全碼: db.php中

<?php 
/** 
* Connect to database. 
* 
*/ 
class DB{ 
    private static $_instance = null; 
    private $_pdo, 
      $_query, 
      $_error = false, 
      $_results, 
      $_count = 0; 

    private function __construct() 
    { 
     try 
     { 
     $this->_pdo = new PDO('mysql:host='.Config::get('mysql/host').';'. 
           'dbname='.Config::get('mysql/db'), 
           Config::get('mysql/username'), 
           Config::get('mysql/password') 
      ); 
     } 
     catch(PDOException $e) 
     { 
      die($e->getMessage()); 
     } 
    } 

    public static function getInstance() 
    { 
     if(!isset(self::$_instance)) 
     { 
      self::$_instance = new DB(); 
     } 
     return self::$_instance; 
    } 

    public function query($sql, $params = array()) 
    { 
     $this->error = false; 
     if($this->_query = $this->_pdo->prepare($sql)) 
     { 
      $x = 1; 
      if(count($params)) 
      { 
       foreach ($params as $param) 
       { 
        $this->_query->bindvalue($x, $param); 
        $x++; 
       } 
      } 

      if($this->_query->execute()) 
      { 
       $this->_requests = $this->_query->fetchAll(PDO::FETCH_OBJ); 
       $this->_count  = $this->_query->rowCount(); 
      } 
      else 
      { 
       $this->_error = true; 
      } 
     } 

     return $this; 
    } 

    public function action($action, $table, $where = array()) 
    { 
     if(count($where) === 3) 
     { 
      $operators = array('=', '>', '<', '>=', '<='); 

      $field  = $where[0]; 
      $operator = $where[1]; 
      $value  = $where[2]; 

      if(in_array($operator, $operators)) 
      { 
       $sql = "{$action} FROM {$table} WHERE {$field} {$operator} ?"; 
       if(!$this->query($sql, array($value))->error()) 
       { 
        return $this; 
       } 
      } 
     } 
     return false; 
    } 

    public function get($table, $where) 
    { 
     return $this->action('SELECT *', $table, $where); 
    } 

    public function delete($table, $where) 
    { 
     return $this->action('DELETE', $table, $where); 
    } 

    public function insert($table, $fields = array()) 
    { 
     if(count($fields)) 
     { 
      $keys = array_keys($fields); 
      $values = ''; 
      $x  = 1; 

      foreach ($fields as $field) { 
       $values .= '?'; 
       if($x < count($fields)) 
       { 
        $values .= ', '; 
       } 
       $x++; 
      } 

      // die($values); 

      $sql = "INSERT INTO {$table} (`".implode('`, `', $keys)."`) VALUES ({$values})"; 

      echo $sql; 

      if(!$this->query($sql, $fields)->error()) 
      { 
       return true; 
      } 
     } 
     return false; 
    } 

    public function update($table, $id, $fields) 
    { 
     $set = ''; 
     $x  = 1; 

     foreach ($fields as $name => $value) { 
      $set .= "{$name} = ?"; 
      if($x < count($fields)) 
      { 
       $set .= ', '; 
      } 
      $x++; 
     } 

     $sql = "UPDATE {$table} SET {$set} WHERE uid = {$id}"; 

     if(!$this->query($sql, $fields)->error()) 
     { 
      return true; 
     } 
     return false; 
    } 

    public function results() 
    { 
     return $this->_results; 
    } 

    public function first() 
    { 
     return $this->results()[0]; 
    } 

    public function error() 
    { 
     return $this->_error; 
    } 

    public function count() 
    { 
     return $this->_count; 
    } 
} 

user.php的

<?php 

class User{ 
    private $_db, 
      $_data; 

    public function __construct($user = null) 
    { 
     $this->_db = DB::getInstance(); 
    } 

    public function create($fields = array()) 
    { 
     if(!$this->_db->insert('users', $fields)) 
     { 
      throw new Exception("Problem Creating User Account"); 

     } 
    } 

    public function find($user = null) 
    { 
     if($user) 
     { 
      $field = (is_numeric($user)) ? 'uid' : 'username'; 

      $data = $this->_db->get('users', array($field, '=', $user)); 

      if($data->count()) 
      { 
       $this->_data = $data; 

       $vars = get_object_vars ($this->_data); 
       print_r($vars); 

       return true; 
      } 
     } 
    } 

    public function login($username = null, $password = null) 
    { 
     $user = $this->find($username); 

     if($user) 
     { 
      if($this->data()->password === Hash::make($password, $this->_data->salt)) 
      { 
       echo "ok"; 
      } 
     } 
     return false; 
    } 

    public function data() 
    { 
     return $this->_data; 
    } 
} 

的login.php

<?php 
    require_once 'core/init.php'; 

    if(Input::exists()) 
    { 
     if(Token::check(Input::get('token'))) 
     { 
      $validate = new Validation(); 
      $validation = $validate->check($_POST, array(
       'username' => array(
        'required' => true 
        ), 
       'password' => array(
        'required' => true 
        ), 
      )); 

      if($validation->passed()) 
      { 
       $user = new User(); 

       $login = $user->login(Input::get('username'), Input::get('password')); 
       if($login) 
       { 
        echo "Success"; 
       } 
       else{ 
        echo "sorry! Failed"; 
       } 
      } 
      else{ 
       foreach ($validation->errors() as $error) { 

        echo $error, '<br />'; 
       } 
      } 
     } 
    } 
?> 
<form action="" method="post"> 
    <div class="field"> 
     <label for="username">Username</label> 
     <input type="text" name="username" id="username" autocomplete="off"> 
    </div> 
    <div class="field"> 
     <label for="password">Password</label> 
     <input type="password" name="password" id="password" autocomplete="off"> 
    </div> 

    <input type="hidden" name="token" value="<?php echo Token::generate(); ?>"> 
    <input type="submit" value="Log In"> 
</form> 

回答

0

的可變回報陣列輸出。因此,您需要獲得像$ this - > _ data [0] - >密碼,$ this - > _ data [0] - >用戶名的值。或者當您將值存儲到$ this - > _ data時,可以存儲數組的第一個子項。的

代替

$this->_data = $data; 

您可以使用

$this->_data = $data->first(); 

所以現在你可以得到這樣的字段$此 - > _數據 - >用戶名,$此 - > _數據 - >密碼

+0

我試着改變你給出的代碼,但是返回這個錯誤。 注意:嘗試獲取第47行的C:\ xampp \ htdocs \ oop \ classes \ user.php中的非對象屬性 行號:47 if($ this-> data() - > password === Hash :: make($ password,$ this-> data() - > salt)) – RajeebTheGreat 2015-03-19 06:49:42

+0

你試過了哪種情況?第一還是第二? – Karthikeyani 2015-03-19 06:52:13

+0

恢復您所做的更改並替換$ data = $ this - > _ db-> get('users',array($ field,'=',$ user));'用'$ data = $ this - > _ db - > get('users',array($ field,'=',$ user)); if($ data-> count()> 0){$ this - > _ data = $ data-> first(); }'並檢查 – Karthikeyani 2015-03-19 06:58:38