Вот мой класс 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