代码之家  ›  专栏  ›  技术社区  ›  emma

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

  •  0
  • emma  · 技术社区  · 5 年前

    我有一个很小的数据库类 PDO 要连接到我的数据库,但出现以下错误:

    致命错误:未捕获错误:在/var/www/html/app/lib/DB中找不到类“app\lib\PDO”。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(); 
    

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

    try {
        $pdo = new PDO('mysql:host=127.0.0.1;dbname=db', 
    'user', 'password');
    } catch (PDOException $e) {
        exit($e->getMessage());
    }
    
    1 回复  |  直到 5 年前
        1
  •  1
  •   Dharman Aman Gojariya    5 年前

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

    推荐文章