Доступ к экземпляру PDO из другого класса

Вот мой класс db для подключения к базе данных с помощью pdo ext.

class db { private $host; private $dbname; private $username; private $password; public function __construct($host,$db,$name,$pass) { $this->host=$host; $this->dbname=$db; $this->username=$name; $this->password=$pass; $dsn = 'mysql:'.$this->dbname.';'.$this->host; try { $conn = new PDO($dsn, $this->username, $this->password); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $e) { echo 'ERROR: ' . $e->getMessage(); } } } 

Я называю класс db в классе входа, как это …

 $host='localhost'; $db='techy_issue_tracker'; $name='root'; $pass=''; $base= new db($host,$db,$name,$pass); 

Вот проблема, чтобы сделать запрос pdo внутри класса входа (расширение класса db), если я использую строку this …

 $stmnt = $conn->prepare('SELECT id FROM users WHERE name :name OR email = :email'); 

Он генерирует две ошибки, говорящие … Примечание: Неопределенная переменная: conn … и Fatal error: вызов функции-члена prepare () для не-объекта …

Я могу исправить это, просто поместив все элементы pdo в класс входа в систему, но все же мне просто интересно … как вы, ребята, называете объект (который является экземпляром класса pdo?) Из другого класса.

Пользовательская система на основе класса PHP с PDO – вызов функции-члена prepare () для не-объекта Этот вопрос интересен, но не очень-то понял: /

Не очень практиковал ООП, поэтому было бы полезно оценить какое-то хорошее объяснение! Благодарю.

Вам нужно сделать intialize $conn conn как общедоступную собственность вашего класса db .

После приватных свойств в вашем классе db добавьте следующее:

 public $conn; 

Затем, внутри вашего try catch, измените $conn на $this->conn :

 $this->conn = new PDO($dsn, $this->username, $this->password); $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

Затем, предполагая, что вы правильно расширили класс db , вы можете получить доступ к этому соединению следующим образом:

$stmt = $db->conn->prepare('SELECT id FROM users WHERE name :name OR email = :email');

Почему бы вам просто не добавить метод к классу db, который принимает строку sql и возвращает массив объекта. Просто сделайте все заявление в этом методе. Тогда класс login может просто вызвать этот метод для выполнения любого запроса. Ему не нужно знать, как осуществляется соединение с базой данных. Таким образом, если вы хотите изменить базовую реализацию в будущем. Это влияет только на класс db. Не так много изменений в классе входа, так как все обращения к базе данных проходят через класс db.

В вашем предложении WHERE есть ошибка:

 WHERE name :name 

У вас отсутствует знак равенства:

 WHERE name = :name