Массив PDO expeced не возвращает только логическое значение 1 на веб-странице - PullRequest
1 голос
/ 07 марта 2019

Я работаю над созданием класса контента, который будет извлекать весь контент из базы данных через PDO, затем запускать результаты через метод, который преобразует результаты в объекты, и циклически проходить через объекты, и отображать объект в конкретный модуль веб-страницы.

Что ожидается

Когда класс активирован, будет создан экземпляр, созданный через PDO, который будет извлекать необходимые данные из базы данных mysql. Затем эта информация будет отображаться и отображаться на веб-странице.

Что происходит

Я получаю без ошибок и логическое число "1", где должен быть контент. Сначала я подумал, что это ошибка SQL. Я получаю тот же результат "1", если я использую print_r ($ query_result). Смотрите мои тесты ниже.

Мой код класса ниже

    <?php


    class Content {

    // --- START OF ACTIVE RECORD CODE ---

    public $n_id; 
    public $n_name; 
    public $n_text; 
    public $n_photo; 

    // Instantiating a STATIC Database Connection for the class to use
    static protected $dbconnect;

    static public function database($dbconnect) {
      self::$dbconnect = $dbconnect;
    }
    // constructing arguments

    public function __construct($args=[]) {

      $this->n_id = $args['n_id'] ?? '';
      $this->n_name = $args['n_name'] ?? '';
      $this->n_text = $args['n_text'] ?? '';
      $this->n_photo = $args['n_photo'] ?? '';
    }

    // Multi use method to pass in sql that will execute the PDO only two parameters are bound ID and contentText.
    static public function find_by_sql($sql) {

    // -------------BEGIN PDO-----------

    // preparing PDO by loading sql, calling db connection, and storing in variable $stmt

      $stmt = self::$dbconnect->prepare($sql);
      // Binding Parameters for sql
      $stmt->bindParam(':nid', $n_id,  PDO::PARAM_INT);
      $stmt->bindParam(':nall', $n_name,  PDO::PARAM_STR);
      $stmt->bindParam(':ntext', $n_text,  PDO::PARAM_STR);
      $stmt->bindParam(':nphoto', $n_photo,  PDO::PARAM_INT);
      // executing $stmt PDO and storing the result in $stmt
      $query_result = $stmt->execute();
      return $query_result;
      // clearing the PDO after information is stored in $record
      $stmt->closeCursor();


    // ------------END PDO ----------

      // Checking to see if a result exist. If nop result is stored in $stmt, then it will echo "Database query failed."
      if(!$query_result) {
        exit("Query doesn't exist.");
      }
    // -------- BEGIN TURNING RESULTS INTO OBJECTS --------
    $object_array = [];

      // The result $stmt will be stored in the variable $record

      while($record = $query_result->fetchAll()) {

        // Taking $record and passing it to the static method instantiate() - see below. This method will return the $object_array.

        $object_array[] = self::instantiate($record);

    }

        return $object_array;

    // ------------ END TURNING RESULTS INTO OBJECTS --------

    }
    // method to test passing $sql to method find_all_sql();

    static public function find_all(){

      $sql = "SELECT * FROM nmain WHERE nid = :id AND nall = :nall AND ntext = :ntext AND nphoto = :nphoto";
        return self::find_by_sql($sql);

    }

    // --- BEGIN INSTANTIATE METHOD TO CREATE OBJECTS ---

    static protected function instantiate($record) {
      $object = new self;
      // Auto assign values
      foreach($record as $property =>  $value) {
        if(property_exists($object, $property)){
          $object->$property = $value;
        }
      }
      return $object;
      }
    // ----- END INSTANTIATE OF RECORD TO CREATE OBJECTS ---

    // ---END OF ACTIVE RECORD CODE---

    }

    ?>

**On my html webpage:**

        $contents = Content::find_all();
         foreach ((array) $contents as $content) {
       echo $content;
     }

Что я тестировал

Это вывод, который я получаю при запуске var_dump ($ stmt);

object(PDOStatement)#3 (1) { ["queryString"]=> string(119) "SELECT * FROM ndb WHERE id = :id AND nall = :nall AND ntext = :ntext AND nphoto = :nphoto" }

Если я скопирую запрос и вставлю его в myphpadmin, запрос будет выполнен с привязкой параметров.

Это вывод, если я запускаю var_dump ($ query_result):

 bool(true) if I use print_r($query_result) I get "1"

Это проходит мой тест if (! $ Query_result)

Если я запускаю var_dump ($ record) или var_dump ($ query_result), я ничего не получаю. Кажется, что $ query_result, потому что это bool, не имеет массива для передачи в $ record. Поэтому нечего преобразовывать в объект. Я в недоумении. Это моя PDO привязка?

1 Ответ

0 голосов
/ 07 марта 2019

Ваша выборка должна быть в операторе, а не в результате выполнения (то есть просто сказать, что выполнение выполнено или не выполнено), также fetchAll будет пытаться вернуть все записи, что вам, скорее всего, нужно fetch обрабатывать 1 запись за раз. Так что у вас должно быть что-то вроде ...

while($record = $stmt->fetch()) {

Теперь вы можете удалить более раннюю return, которая останавливает дальнейшую обработку.

...