В настоящее время я пытаюсь передать соединение с БД следующим образом:
class Test { public $user; public $db; function __construct() { // connect to database try { $this->db = new PDO('mysql:host='.DB_HOST.';dbname='.DB_DATABASE.'', DB_USERNAME, DB_PASSWORD); $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $err) { die($err->getMessage()); } $this->user = new User($this->db); } } class User { public $db; function __construct($db) { $this->db = $db; } // execute some query $sql = "SELECT * FROM test"; $sth = $this->db->prepare($sql); $sth->execute(); $result = $sth->fetch(); if(!empty($result)) { echo '<pre>'; var_dump($result); echo '</pre>'; } }
Но я получаю: Неустранимая ошибка: вызовите функцию-член prepare () для не-объекта. Что я делаю не так?
У вас есть часть конструктора part-db-to-class.
Но это не допустимое определение класса, как вы его закодировали. Вам нужно поместить эти строки кода (следуя за // execute some query
) в функцию. Строки кода не могут жить там, где они есть, плавающие внутри класса User, но не внутри функции. Это не законный PHP.
Вы также должны проверить статус ошибки после каждого вызова для подготовки () или execute (). Они возвращают FALSE, если есть ошибка, например синтаксическая ошибка SQL, или таблица не существует и т. Д.
class User { public $db; function __construct($db) { if (! $db instanceof PDO) { die("What are you trying to pull anyway?"); } $this->db = $db; } function doSomething() { // execute some query $sql = "SELECT * FROM test"; $sth = $this->db->prepare($sql); if ($sth === false) { die(print_r($this->db->errorInfo(), true)); } $status = $sth->execute(); if ($status === false) { die(print_r($sth->errorInfo(), true)); } $result = $sth->fetch(); if(!empty($result)) { echo '<pre>'; var_dump($result); echo '</pre>'; } } }