2015-05-10 3 views
0

Как работает PDO в этой ситуации? Что я сделал не так? Я предположил, что переменная $ full имела бы выход «John Smith», потому что экземпляр класса является $ user в обеих ситуациях.Невозможно заполнить свойства объекта с помощью PDO :: FETCH_CLASS

Я попытался отладить эту часть программы, я поставил наблюдателя на $ first_name. Когда отладчик входит в сферу действия класса, я вижу вывод «Джон».

Что я должен добавить/изменить этот код, чтобы получить выход "John Smith"?

// user.php file 

    class User 
    { 
     ... 
     private $first_name; 
     private $last_name; 

     public function findById($id = 0) 
     { 
      $sql = "SELECT * FROM " . $this->table . " WHERE id = :id"; 
      $params = [":id" => $id]; 
      $class = get_called_class(); 
      $result = $this->findBySql($sql, $params); 
      return $this->db->fetchObject($result, $class); 
     } 

     public function findBySql($sql, $params = []) 
     { 
      return $this->db->query($sql, $params); 
     } 

     public function fullName() 
     { 
      return $this->first_name . " " . $this->last_name; 
     } 
    } 

    // database.php file 

    class DataBase 
    {  
     ... 

     public function fetchObject($stmt, $className = "stdClass") 
     { 
      $result = $stmt->fetchAll(PDO::FETCH_CLASS, $className); 
      return $result[0]; 
     } 
    } 

    // index.php 

    $user = new User(); 
    $found = $user->findById(1); 
    $full = $user->fullName(); 
    var_dump($full); // output: string ' ' (length=1) -----> supposed: "John Smith" 
    var_dump($found); /* output: object(User)[5] 
     .... 
     private 'first_name' => string 'John' (length=4) 
     private 'last_name' => string 'Smith' (length=5) 
     .... 
    */ 

ответ

1

Проблема заключается в том, что Database::fetchObject возвращает новый экземпляр класса, не изменяя объект, который назвал его. Использование:

public function findById($id = 0) 
{ 
    $sql = "SELECT * FROM " . $this->table . " WHERE id = :id"; 
    $params = [":id" => $id]; 
    $class = get_called_class(); 
    $result = $this->findBySql($sql, $params); 
    $user = $this->db->fetchObject($result, $class); 
    $this->first_name = $user->first_name; 
    $this->last_name = $user->last_name; 
    return $this; 
} 
+0

Это решение не работает, но я понял, что означал! – Killuminati

+0

Я изменил неправильную функцию. Попробуйте это решение. – Barmar

+0

Это решение работает тоже ... Я полагаю, что всякая магия в PDO API, потому что я не могу понять логику кода. – Killuminati

0

$user является пустым объектом, его свойства не установлены в любом месте.

При вызове $user->findById(1), он вызывает $db->fetchObject($result, "User");, который вызывает $stmt->fetchAll(PDO::FETCH_CLASS, $className);, который возвращает новый объект пользователя (на самом деле это массив, содержащий объект), отличается от той, которую вы создали.

Этот объект имеет свои свойства, заполненные и возвращенные всеми функциями, а затем хранятся в переменной $found, которая является другой переменной и имеет другой связанный объект, чем переменная $user.

Вы вызываете метод fullName() в переменной $user, который связан с пустым объектом, поэтому возвращаемое значение представляет собой пробельный символ (результат "" . " " . "").

Вы можете изменить $user->fullName() на $found->fullName(), и все должно работать нормально, поскольку $found содержит данные, которые вы загрузили из своей базы данных.

+0

Вы правы! Но могли бы вы немного объяснить, что происходит? Не могу точно понять, как он работает ... – Killuminati

+0

@ Killuminati: Я добавил больше подробностей, чтобы помочь вам, но вы должны действительно узнать больше о том, как OOP работает в PHP. –

+0

Благодарим вас за ответ, так как я подумал от php.net: «PDO :: FETCH_CLASS: возвращает экземпляры указанного класса, сопоставляя столбцы каждой строки с именованными свойствами в классе». – Killuminati

Смежные вопросы