Я новичок в 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(....)
и т.д