В настоящее время я делаю 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. Любая помощь приветствуется