gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:55:37 25 4
gpt4 key购买 nike

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

Fatal error: Uncaught Error: Class 'app\lib\PDO' not found in /var/www/html/app/lib/DB.php:11



我检查了是否 PDO使用以下代码启用:
if ( extension_loaded('pdo_mysql') ) {
exit('yes');
}

并且输出是"is"。

我还检查了我的 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());
}

最佳答案

Pdo works if i don't use namespaces



这是您解决方案的关键。 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 .要么让异常冒泡,要么正确处理它们。手动向用户显示错误消息是一个潜在的安全问题。

关于php - 即使在 php.ini 中安装并启用了 PDO 也未找到错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59448843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com