Ошибка PDO не найдена, даже если она установлена ​​и включена в php.ini - PullRequest
0 голосов
/ 23 декабря 2019

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

Неустранимая ошибка: Uncaught Error: Class 'app\ lib \ PDO 'не найден в /var/www/html/app/lib/DB.php:11

Я проверил, включен ли PDO с использованием этого кода:

if ( extension_loaded('pdo_mysql') ) {
    exit('yes');
}

И вывод "да".

Я также проверил мой php.ini, и у меня есть эта строка (без полуколонны):

extension=pdo_mysql

Этомой DB.php код:

namespace app\lib;

class DB{

    private static $instance = null;
    public $pdo;

    private function __construct(){
        try {
            $this->pdo = new PDO('mysql:host=127.0.0.1;dbname=db', 'user', 'password');
        } catch (PDOException $e) {
            exit($e->getMessage());
        }
    }

    public static function instance(){

        if(!isset(self::$instance)){
            self::$instance = new self();
        }
        return self::$instance;
    }
}

А это мой файл автозагрузчика (init.php):

define('DS', DIRECTORY_SEPARATOR);

spl_autoload_register(function($namespace){
    $path = dirname(__FILE__) . DS . str_replace('\\', DS, $namespace . '.php');

    if(file_exists($path)){
        require_once $path;
    }
});

Вот как я пытаюсь установить новый DBсоединение:

require_once 'init.php';

$db = app\lib\DB::instance(); 

PS: Pdo работает, если я не использую пространства имен и использую процедурный код:

try {
    $pdo = new PDO('mysql:host=127.0.0.1;dbname=db', 
'user', 'password');
} catch (PDOException $e) {
    exit($e->getMessage());
}

1 Ответ

1 голос
/ 23 декабря 2019

Pdo работает, если я не использую пространства имен

Это ключ к вашему решению. PDO - это класс в PHP. Все имена классов должны быть полностью определены, в противном случае PHP будет искать определение этого класса только в текущем пространстве имен. Чтобы использовать PDO в любом другом пространстве имен, кроме глобального, вам потребуется указать глобальное пространство имен с помощью одного \

$this->pdo = new \PDO('mysql:host=127.0.0.1;dbname=db', 'user', 'password');

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

$this->pdo = new \PDO('mysql:host=127.0.0.1;dbname=db;charset=utf8mb4', 'user', 'password', [
    \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
    \PDO::ATTR_EMULATE_PREPARES => false,
]);

Никогда не отлавливайте исключения, только до die/exit. Либо пусть исключения всплывают, либо обрабатываются правильно. Отображение сообщения об ошибке пользователю вручную является потенциальной проблемой безопасности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...