PHP 7.4 Параметр ошибки должен быть массивом или объектом, реализующим счетное - PullRequest
0 голосов
/ 26 апреля 2020

В настоящее время я делаю PHP MVC Framework, используя PHP 7.4.4, XAMPP и Atom, следуя курсу PHP на YouTube: https://www.youtube.com/playlist?list=PLFPkAJFH7I0keB1qpWk5qVVUYdNLTEUs3 (в настоящее время на видео 25: DB Wrapper, часть 6). Прямо сейчас я программирую свою среду для сбора и возврата данных из базы данных (My php admin). Все шло довольно гладко, до сих пор. Я тестировал мой PHP фреймворк на наличие ошибок после программирования моей фреймворк для сбора и возврата данных из базы данных, когда возникла ошибка:

Внимание: count (): Параметр должен быть массив или объект, который реализует Countable в /opt/lampp/htdocs/phigru/core/DB.php в строке 83

Я пробовал несколько разных решений, чтобы исправить ошибку, но в конце ошибка все еще застряла.

Вот моя БД. php:

<?php

  class DB {
    private static $_instance = null;
    private $_pdo, $_query, $_error = false, $_result, $_count = 0, $_lastInsertID = null;

    private function __construct(){
      try {
        $this->_pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_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 = []){
      $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->_result = $this->_query->fetchALL(PDO::FETCH_OBJ);
          $this->_count = $this->_query->rowCount();
          $this->_lastInsertID = $this->_pdo->lastInsertID();
        }else{
          $this->_error = true;
        }
      }
      return $this;
    }

    protected function _read($table, $params = []){
      $conditionString = '';
      $bind = [];
      $order = '';
      $limit = '';

      //$conditions
      if(isset($params['conditions'])) {
        if(is_array($params['conditions'])) {
          foreach($params['conditions'] as $condition) {
            $conditionString .= ' ' . $condition . ' AND';
          }
          $conditionString = trim($conditionString);
          $conditionString = rtrim($conditionString, ' AND');
        }else{
          $conditionString = $params['conditions'];
        }
        if ($conditionString != ''){
          $conditionString = ' Where ' . $conditionString;
        }
      }

      //bind
      if(array_key_exists('bind', $params)){
        $bind = $params['bind'];
      }

      //order
      if(array_key_exists('order', $params)){
        $order = 'ORDER BY ' . $params['order'];
      }

      //limit
      if(array_key_exists('limit', $params)){
        $limit = 'LIMIT BY ' . $params['limit'];
      }

      $sql = "SELECT * FROM {$table}{$conditionString}{$order}{$limit}";
      if($this->query($sql, $bind)) { 
        if(!count($this->_result)) return false;                         //error line
        return true;
      }
      return false;
    }

    public function find($table, $params = []){
      if($this->_read($table, $params)) {
        return $this->results();
      }
      return false;
    }

    public function findFirst($table, $params = []){
      if($this->_read($table, $params)) {
        return $this->first();
      }
      return false;
    }


    public function insert($table, $fields = []) {
      $fieldString = '';
      $valueString = '';
      $values = [];

      foreach ($fields as $field => $value) {
        $fieldString .= '`' . $field . '`,';
        $valueString .= '?,';
        $values[] = $value;
      }
      $fieldString = rtrim($fieldString, ',');
      $valueString = rtrim($valueString, ',');
      $sql = "INSERT INTO {$table} ({$fieldString}) VALUES ({$valueString})";
      if(!$this->query($sql, $values)->error()){
        return true;
      }
      return false;
    }

    public function update($table, $id, $fields = [ ]) {
        $fieldString = '';
        $values = [ ];
        foreach ($fields as $field => $value) {
            $fieldString .= ' ' . $field . ' = ?,';
            $values[ ] = $value;
        }
        $fieldString = trim($fieldString);
        $fieldString = rtrim($fieldString, ',');
        $sql = "UPDATE {$table} SET {$fieldString} WHERE id = {$id}";
        if (!$this->query($sql, $values)->error()) {
           return true;
        }
        return false;
    }

    public function delete($table, $id){
      $sql = "DELETE FROM {$table} WHERE id = {$id}";
      if(!$this->query($sql)->error()) {
        return true;
      }
      return false;
    }

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

    public function first(){
      return (!empty($this->_result))? $this->_result[0] : [];
    }

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

    public function get_colnums($table){
      return $this->query("SHOW COLUMNS FROM {$table}")->results();
    }

    public function lastID($table){
      return $this->_lastInsertID;
    }

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

А вот мой Дом. php:

<?php

  class Home extends Controller {

    public function __construct($controller, $action){
      parent::__construct($controller, $action);
    }

    public function indexAction(){
      $db = DB::getInstance();
      $contacts = $db->find('contacts', [
        'conditions' => "lname = ?",
        'bind' => ['Kirk'],
        'order' => "lname, fname",
        'limit' => 5
      ]);
      dnd($contacts);
      $this->view->render('home/index');
    }
  }

Я пытался чтобы исправить это предупреждение при нескольких попытках, в том числе путем замены строки ошибки с

        if(!count($this->_result)) return false;                         //error line

на

        if($this->_result && !count($this->_result)) return false;         //error line

Но моя ошибка все равно не исчезнет go. Любая помощь приветствуется

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...