找不到PDO错误,即使已在php.ini中安装并启用了PDO

问题描述 投票:0回答:1

我有一个小的数据库类,我正在尝试使用PDO连接到我的数据库,但出现此错误:

致命错误:未捕获的错误:在/var/www/html/app/lib/DB.php:11中找不到类'app \ lib \ PDO'

我已使用此代码检查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(); 

P.S:如果我不使用名称空间并使用过程代码,则Pdo可以工作:

try {
    $pdo = new PDO('mysql:host=127.0.0.1;dbname=db', 
'user', 'password');
} catch (PDOException $e) {
    exit($e->getMessage());
}
php pdo namespaces
1个回答
0
投票

如果我不使用名称空间,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。让异常冒出来,或者正确处理它们。手动向用户显示错误消息是潜在的安全问题。

© www.soinside.com 2019 - 2024. All rights reserved.