【问题标题】:PDO not found error even tho it is installed and enabled in php.ini即使在 php.ini 中安装和启用 PDO 也未找到错误
【发布时间】:2020-04-14 08:38:27
【问题描述】:

我有一个小型数据库类,我正在尝试使用 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】:

    如果我不使用命名空间,Pdo 可以工作

    这是解决问题的关键。 PDO 是 PHP 中的一个类。所有类名都应该是完全限定的,否则 PHP 将仅在当前命名空间中查找该类的定义。要在除 global 之外的任何其他命名空间中使用 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。要么让异常冒泡,要么正确处理它们。手动向用户显示错误消息是一个潜在的安全问题。

    【讨论】:

    • 谢谢!它起作用了:哦!题外话你能给我指出一篇关于正确错误处理的好文章吗?谢谢!
    • 谢谢! :D 现在我对 pdo 有另一个问题,但这次当我运行命令时(即使 pdo_mysql 在 cli ini 中启用,就像在 apache2 ini 中一样)我收到此错误:PHP Warning: PHP Startup: Unable to load dynamic library 'pdo_mysql' 。我应该发布另一个问题吗?
    • @emma 请先用谷歌搜索该错误消息。对此有很多答案。如果您仍然无法在网络上找到它,请再问一个问题。
    • 解决了! :D 非常感谢您抽出时间来回答我的问题!
    猜你喜欢
    • 2019-12-20
    • 1970-01-01
    • 2021-04-16
    • 2021-05-12
    • 1970-01-01
    • 2021-03-23
    • 2017-08-25
    • 2015-08-02
    • 2020-12-29
    相关资源
    最近更新 更多