Страницы

Поиск по вопросам

четверг, 13 февраля 2020 г.

Проблема с ПДО и ООП

#php #ооп #pdo


При наборе кода:

$d = new publications($title, $content, $id_cat, $tags, $id_user);
$d->addPub();


выводит ошибку: 


  Call to a member function prepare() on a non-object in 53


Вот эта самая 53 строка:

$zapros = $this->db->prepare("INSERT INTO `publications`(`title`, `content`, `id_cat`,
`date`, `tags`, `id_user`) VALUES (:title, :content, :id_cat, :date,  :tags, :id_user)");


Вот сам класс

class publications{
 private $title; 
 private $content; 
 private $id_cat; 
 private $tags; 
 private $id_user; 

 protected $host = '127.0.0.1';
 protected $login = 'root';
 protected $pas = '';
 protected $nameDB = 'DBALI';   
 private $db;

public function __construct($title, $content, $id_cat, $tags, $id_user){
    $this->title = $title;
    $this->content = $content;
    $this->id_cat = $id_cat;
    $this->tags = $tags;
    $this->id_user = $id_user;

}

public function connect(){
    $this->db = new PDO("mysql:host=$host; dbname=$nameDB", $login, $pass);
}

public function getTitle(){     return $this->title;    }   
public function getContent(){   return $this->content;      }   
public function getCat(){   return $this->id_cat;   }
public function getDate(){  return date('Y-m-d');   }
public function getTags(){  return $this->tags; }
public function getUser(){  return $this->id_user;  }

public function addPub(){
    $info = array('title'=> 'getTitle()', 'content'=> 'getContent()', 'id_cat'=>
'getCat()', 'date'=> 'getDate()', 'tags'=> 'getTags()', 'id_user'=> 'getUser()');
    $zapros = $this->db->prepare("INSERT INTO `publications`(`title`, `content`,
`id_cat`, `date`, `tags`, `id_user`) VALUES (:title, :content, :id_cat, :date,  :tags,
:id_user)");
    $zapros->execute($info);
}
}

    


Ответы

Ответ 1



В этом коде неправильно ВСЁ. Я бы рекомендовал отложить на время изучение ООП. И покрепче освоить сначала базовый синтаксис PHP, чтобы хотя бы не путать функции с переменными. Учиться надо постепенно, изучая темы одна за одной. Учить несколько вещей за раз невозможно - в ситуациях как эта, когда ошибки вызваны незнанием в самых разных областях, понять в чем проблема, и исправить её будет невозможно. Для начала перечислю несколько проблем. функция connect() нигде не вызывается при этом в классе, работающим с публикациями, такой функции не должно быть в принципе. Эта функция относится к работе с БД, а не к публикациям. реализация "геттеров" очень кустарная. прочитать про метод __get() делать геттеры только потому что "что-то где-то слышал" ни в коем случае нельзя. обращение к методам класса как к функциям не несет ни малейшего смысла. помещение обращения к функции внутри строки не имеет ни малейшего смысла. обращение к переменной в "ковычках" (пишется через "а") ни малейшего смысла так же не имеет. обращение к приватной переменной не имеет ни малейшего отношения к "безопасности" В общем, чтобы сделать этот класс минимально приемлемым, надо избавиться от бессмысленных "геттеров" убрать из него весь код, связанный с соединением с БД переменную $this->db здавать в конструкторе, в который передавать инстанс PDO. код для соединения с PDO вынести отдельно, при этом задавая правильный режим работы с ошибками. данные для записи лучше передавать не в конструктор, а прямо в addPub(). Ведь Объект публикации может создаваться не только для ее сохранения, но и для чтения из базы. И зачем тогда будет весь этот набор переменных? В конструктор передавать только соединение с БД, а сами данные - в методы. Например, id публикации в метод find(), который будет заполнять переменные класса из базы.

Ответ 2



Судя по всему, у Вас в переменной db нет объекта. Вы должны его проинициализировать изначально. Если не лезть в детали и предполагать, что метод connect() работает верно, то должно быть так: $d = new publications($title, $content, $id_cat, $tags, $id_user); $d->connect(); $d->addPub();

Комментариев нет:

Отправить комментарий