В приложении используется файл config.php, в который вынесено подключение к БД. Файл выглядит так: http://phpfaq.ru/pdo#connect Переписываю код с использованием ООП с установкой подключения к БД в конструкторе по примеру, описанному здесь: http://code.mu/ru/php/book/oop/class/DatabaseShell PHP: class DatabaseShell { private static $link; public function __construct() { if (!self::$link) { self::$link = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME); mysqli_query(self::$link, "SET NAMES 'utf8'"); $dbcnx = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME); $dsn = "mysql:host=DB_HOST;dbname=DB_NAME;charset=UTF8"; $opt = array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ); $pdo = new PDO($dsn, DB_USER, DB_PASS, $opt); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE); } } } В коде реализована автозагрузка: PHP: spl_autoload_register(function($class) { // ... }); которая автоматически пытается подгрузить класс PDO, не находит, потому что он нигде не прописан, и предсказуемо выдает "Fatal error". Прошу подсказать, что именно я делаю неправильно и как это исправить. Прописать отдельно класс PDO? Где-то можно посмотреть на пример? То, что код неправильный и дублирующий, я вижу и понимаю.
Переписывать с использованием ООП применяя процедурный стиль так себе занятие. Класс PDO это уже давно неотъемлемая часть РНР, если кто-то его не находит, это уже не трудности - это проблема. Какая версия РНР ?
В конфигурационном файле РНР интерпретатора модуль pdo подключен? Кстати откуда ты взял этот класс? Скачал с инета и сунул туда строчки про pdo в надежде, что всё заработает?
Да, подключен. В виде подгружаемого файла в процедурном стиле всё работает. Тут проблема в другом даже: автозагрузка ищет класс PDO, которого нет. Я на этом остановился.
Нашел. Как это решит озвученную проблему автоматического старта загрузки класса, которого не существует?
@118_64, нет такой проблемы, класс PDO встроен в РНР он есть всегда. Автолоад срабатывает только тогда когда РНР не видит объявленный клас в своих "списках". Другое дело ты не в курсе, что такое области видимости. Твой пдо не видно за пределами конструктора класса, не говоря уж о приложении в целом. В чём проблема скопипастить найденный класс и посмотреть как правильно его использовать?
Взял реализацию синглтон отсюда. Вот мой код: PHP: <?php namespace Models; class DB { private static $_instance = null; // для безопасности настройки лучше хранить в файле с конфигом private static $mysqlhost = "localhost"; private static $dbname = "shop"; private static $dbuser = "root"; private static $dbpasswd = "1234"; public function __construct () { //private function __construct () { $this->_instance = new PDO( 'mysql:host=' . self::$mysqlhost . ';dbname=' . self::$dbname, self::$dbuser, self::$dbpasswd, [PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"] ); } private function __clone () {} private function __wakeup () {} public static function getInstance() { if (self::$_instance != null) { return self::$_instance; } return new self; } } Использование: $db = DB::getInstance(); Получаю ту же ошибку: Fatal error: Uncaught Exception: Для класса Models\PDO не найден файл E:/data\models\PDO.php. Проверьте наличие файла по указанному пути. Убедитесь, что пространство имен вашего класса совпадает с тем, которое пытается найти фреймворк для данного класса. Например, вы создаете класса модели, но забыли заюзать ее через use. В этом случае вы пытаетесь вызвать класс модели в пространстве имен контроллера, а такого файла нет. in E:\data\index.php:31 Stack trace: #0 [internal function]: {closure}() #1 E:\data\models\DB.php(18): spl_autoload_call() #2 E:\data\models\DB.php(36): Models\DB->__construct() #3 E:\data\config\router.php(18): Models\DB::getInstance() #4 E:\data\index.php(35): require('E:\\data\\config\\...') #5 {main} thrown in E:\data\index.php on line 31 "Невидимость" $pdo обсуждается, например, здесь. В качестве решения предлагается передавать $pdo в качестве параметра в конструктор. ОК. Но почему не работает синглтон, в котором предполагается создание объекта PDO внутри конструктора? В чём проблема и как её исправить?
PDO в глобальном namespace, нужно либо use PDO поставить вверх, либо писать \PDO --- Добавлено --- Читаем про namespace внимательно.