Intereting Posts
Как автоматически обновить таблицу, когда другая таблица обновляется на другом сервере mysql? fb ошибка входа – токен состояния CSRF не соответствует одному предоставленному Персонализация Laravel, связанная с проблемой внешнего ключа случайная ошибка symfony: ContextErrorException: Warning: simplexml_load_file (): предупреждение ввода-вывода: не удалось загрузить внешний объект В PHP после назначения ресурса указателя файла переменной с помощью функции fopen (), как я могу получить имя файла из переменной? как передать значение id в списке выбора в форме, используя сообщение или получить? Doctrine 2 WHERE IN, используя набор объектов Переменная URL GET имеет необходимый символ хэша Какую библиотеку PHP RPC (XML или JSON) вы успешно использовали? WooCommerce: Добавить товар в корзину с переоценкой цены? PHP требует, чтобы файл из верхнего каталога Как превратить этот часто используемый код javascript в плагин? Создание объектов PHP и использование памяти Got Hacked – Кто-нибудь знает, что делает этот PHP-код? Нельзя использовать объект типа __PHP_Incomplete_Class как массив

PHP PDO-MYSQL: как использовать соединение с базой данных в разных классах

Я новичок в PDO с MYSQL, вот мои два файла:

У меня есть класс подключения, который я использую для подключения к базе данных:

class connection{ private $host = 'localhost'; private $dbname = 'devac'; private $username = 'root'; private $password =''; public $con = ''; function __construct(){ $this->connect(); } function connect(){ try{ $this->con = new PDO("mysql:host=$this->host;dbname=$this->dbname",$this->username, $this->password); $this->con->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); }catch(PDOException $e){ echo 'We\'re sorry but there was an error while trying to connect to the database'; file_put_contents('connection.errors.txt', $e->getMessage().PHP_EOL,FILE_APPEND); } } } 

У меня есть класс account_info, который я использую для запроса данных из базы данных:

 class account_info{ function getAccountInfo(){ $acc_info = $this->con->prepare("SELECT * FROM account_info"); $acc_info->execute(); $results = $acc_info->fetchAll(PDO::FETCH_OBJ); foreach ($results as $key) { $results->owner_firstname; } } } конкретные class account_info{ function getAccountInfo(){ $acc_info = $this->con->prepare("SELECT * FROM account_info"); $acc_info->execute(); $results = $acc_info->fetchAll(PDO::FETCH_OBJ); foreach ($results as $key) { $results->owner_firstname; } } } 

Я включаю оба этих файла на странице index.php:

 include_once 'classes/connection.class.php'; include_once 'classes/accountinfo.class.php'; $con = new connection(); $info = new account_info(); $info->getAccountInfo(); 

Я просто не могу заставить его работать, я не получаю никакого вывода, я думаю, что он имеет какое-то отношение к сфере видимости, но я не знаю, правильно ли исправить это, поскольку я новичок в этом деле PDO и OOP. Заранее спасибо.

Решение 1

Заменить class account_info { с помощью class account_info extends connection {

замещать

 $con = new connection(); $info = new account_info(); 

с

 $info = new account_info(); 

и он должен работать.

Решение 2 (предлагается)

Я настоятельно рекомендую вам решить вашу проблему с помощью инъекции зависимостей в этом случае. Просто замените класс своей учетной записи:

 class account_info { private $con; public function __construct(connection $con) { $this->con = $con->con; } public function getAccountInfo(){ $acc_info = $this->con->prepare("SELECT * FROM account_info"); $acc_info->execute(); $results = $acc_info->fetchAll(PDO::FETCH_OBJ); foreach ($results as $key) { $results->owner_firstname; } } } конкретные class account_info { private $con; public function __construct(connection $con) { $this->con = $con->con; } public function getAccountInfo(){ $acc_info = $this->con->prepare("SELECT * FROM account_info"); $acc_info->execute(); $results = $acc_info->fetchAll(PDO::FETCH_OBJ); foreach ($results as $key) { $results->owner_firstname; } } } 

и используйте его в index.php следующим образом:

 include_once 'classes/connection.class.php'; include_once 'classes/accountinfo.class.php'; $con = new connection(); $info = new account_info($con); $info->getAccountInfo(); 

объяснение

В качестве общего правильного правила: всегда указывайте ключевое слово scope для функций (public, protected или private).

Первое решение называется наследованием, и мы в основном сделали расширение класса учетной записи с классом подключения, чтобы наследовать все методы и свойства из класса подключения и легко использовать их. В этом случае вы должны следить за конфликтами именования. Я предлагаю вам взглянуть на наследование класса в руководстве по PHP.

Второе решение называется инъекцией зависимостей, и это дико поощряемый шаблон проектирования, который заставляет ваши классы принимать другие классы в своем конструкторе, чтобы явно определить дерево зависимостей класса (в этом случае учетная запись зависит от соединения и без соединения, которое мы не можем делать учетную запись).

Другое, из тысячи возможных решений, будет тем, что кто-то опубликовал ниже, который представляет собой шаблон дизайна, называемый Singleton. Однако этот patter был недавно оценен как анти-шаблон и не должен использоваться.

Общим методом является использование шаблона singleton в вашем классе базы данных.

Что-то вроде этого:

 class connection { private static $hInstance; public static function getInstance() { if (!(self::$hInstance instanceof self)) { self::$hInstance = new self(); } return self::$hInstance; } /* your code */ } 

Затем вы можете просто использовать

 $database = connection::getInstance(); $database->con->prepare(....) 

и т.д