2016-12-02 3 views
1

Я пытаюсь расширить функцию this tutorial on youtube, и у меня возникли некоторые проблемы. Вот конкретный фрагмент кода я в настоящее время борется с:Почему мой цикл foreach не отображает мои данные mysql?

public function listProjects() { 
    $projects = DB::getInstance()->get('projects', array('projectStatus', '=', 'active')); 
    if($projects->count()) { 
     echo 'This query senses rows, but returns data it does not'; 
     foreach($projects as $project) { 
      echo $project->projectName; 
     } 
    } 
} 

Это метод моего класса «Проект», и он использует методы из класса DB, с соответствующим кодом здесь:

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->_results = $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 $this; 

} 


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

} 

Так что в моем index.php, я пишу этот код:

$projectList = new Project; 
$projectList->listProjects(); 

Чтобы попытаться получить все из моих «проектов», хранящихся в базе данных. Я помещаю «Этот запрос воспринимает строки, но возвращает данные, которые он не выполняет», чтобы определить, были ли подсчитаны строки, каковы они, потому что этот оператор эхом, но мой оператор foreach работает неправильно. Поле в таблице проектов, к которому я пытаюсь получить доступ, - имя_проекта. В конечном итоге мне захочется отобразить всю соответствующую информацию о проекте, но я уверен, что смогу понять это, как только я получу ее, чтобы отобразить что-либо из базы данных.

+0

Распространяется ли ваш класс PDO? Должно. Кроме того, вы возвращаете '$ this' из' action', который возвращается из 'get' ..., поэтому вы пытаетесь зацикливать объект в своем' foreach' вместо результата массива. Попробуйте 'var_dump()' 'в var' $ projects' var после вашего выражения echo. –

+0

Я не уверен, что вы подразумеваете под первой частью. Часть цели учебника заключалась в абстрактных функциях DB/PDO, чтобы их можно было повторно использовать в других частях кода или других приложений. Нет, я не думаю, что технически это расширяет PDO. Есть ли способ, которым я могу зацикливать объект, потому что в итоге это то, что я хотел бы вернуть вместо массива. – hoolakoola

+0

Попробуйте 'var_dump' var' $ projects' и посмотрите, что это такое;) Вероятно, это будут объекты/свойства класса объектов по сравнению с любыми фактическими данными. Если вы расширили свой класс от PDO, вы могли бы сделать 'while ($ row = $ projects-> fetch (PDO :: FETCH_OBJ)) {/ ** иметь дело с $ row ** /}', в противном случае вам понадобится для доступа к базовому объекту PDO - например, '$ projects -> _ pdo-> fetch()' - если он общедоступен. –

ответ

-2

Это:

foreach($projects as $project) { 
      echo $project->projectName; 
     } 

должно быть:

foreach($projects as $project) { 
       echo $projects->projectName; 
      } 
+0

Но разве цикл foreach не возвращает вторую переменную ($ project) в качестве заполнителя для каждого экземпляра $ проектов? – hoolakoola

+0

Извиняюсь, я очень устал, когда посмотрел на это, ты прав. – dave

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