#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();
Комментариев нет:
Отправить комментарий