sanek_os9
@sanek_os9
Работаю с Laravel, Vue, Vuetify, AWS Amazon, Linux

Почему не работает класс PDO?

Есть у меня скрипт который хорошо работал пока я не начал его редактировать) писал я его по принципу MVC, решил наладить в нем пространство имен, прописал везде namespace, начал переделывать вызовы классов и дошел до класса DB
/*
  Класс для подключения к БД
  Можно использовать в любом месте движка
  $db = DB::me();
 */
namespace Core;
abstract class DB
{
    static protected
        $host,
        $user,
        $password,
        $db_name,
        $_instance;


    protected function __construct(){}
    protected function __clone(){}
    /*
     * Получаем данные от БД
     */
    private static function getParametersBd(){
        return include_once(DIR_CONFIG . '/db.php');
    }

    /**
     * @return PDO
     * @throws ExceptionPdoNotExists
     * @throws Exception
     */
    static public function me(){
        if(!class_exists('pdo') || array_search('mysql', PDO::getAvailableDrivers()) === false)
            die("Отсутствует драйвер PDO");

        $args = self::getParametersBd();
        self::$host = $args['host'];
        self::$db_name = $args['db_name'];
        self::$user = $args['user'];
        self::$password = $args['password'];
        
        if(!self::$_instance){
            if(!self::$db_name || !self::$user || !self::$host)
                die('Укажите параметры соединения');
        
            $dsn = 'mysql:host=' . self::$host . ';dbname=' . self::$db_name . ';charset=utf8';
            $opt = [
                PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                PDO::ATTR_EMULATE_PREPARES   => false,
            ];
            self::$_instance = new PDO($dsn, self::$user, self::$password, $opt);
       }
        return self::$_instance;
    }
}

Файлы с классами подключаю так
spl_autoload_register(function ($name) {
    $name = H . '/' . str_replace('\\', '/', $name) . '.php';
    //echo $name . '<br />';
    if (is_file($name)){
        require_once $name;
    }else{
        echo 'Не найден: ' . $name . '<br />';
    }
    /*
    $dirs = ['/Core/', '/Models/', '/More/', '/Controllers/'];
    for($i = 0; $i < count($dirs); $i++){
        $path = H . $dirs[$i] . $name . '.php';
        if(is_file($path)){
            require_once $path;
        }
    }
    */
});

В результате получаю ошибку
Не найден: /var/www/zadanie.loc/Core/PDO.php

Fatal error: Uncaught Error: Class 'Core\PDO' not found in /var/www/zadanie.loc/Core/DB.php:33 Stack trace: #0 /var/www/zadanie.loc/Models/User.php(35): Core\DB::me() #1 /var/www/zadanie.loc/Models/User.php(21): Models\User->getData() #2 /var/www/zadanie.loc/System/inc/start.php(44): Models\User->__construct(0) #3 /var/www/zadanie.loc/Controllers/MainController.php(6): User() #4 [internal function]: Controllers\MainController->actionIndex() #5 /var/www/zadanie.loc/Core/Router.php(50): call_user_func_array(Array, Array) #6 /var/www/zadanie.loc/index.php(8): Core\Router->run() #7 {main} thrown in /var/www/zadanie.loc/Core/DB.php on line 33

Он хочет подключить PDO как \Core\PDO как это поправить?
Хотел создать свой класс в папке Core и унаследовать его от класса PDO) но номер не прокатил и пишет ошибку мол класса PDO нету(
  • Вопрос задан
  • 970 просмотров
Решения вопроса 1
evgeniy2194
@evgeniy2194
PHP, js developer
self::$_instance = new \PDO($dsn, self::$user, self::$password, $opt);

php.net
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@omar-gamzatov
PHP-enjoyer
Возможно кому-нибудь пригодится.
Для того чтобы не вставлять везде "\"
После
namespace Core;
Подключаем PDO
use PDO;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы