致命错误:未捕获错误:未找到类“server\PDO”[重复]

Fatal error: Uncaught Error: Class "server\PDO" not found [duplicate]

提问人:TheIvoryCoder 提问时间:8/13/2022 更新时间:8/14/2022 访问量:507

问:

对于我正在处理的一个项目,我正在尝试使用 PHP 通过 PDO 连接到数据库。为了安全起见,我已将数据存储在文件中,并创建了一个类来获取该数据:.env

.env 域名

DB_SERVER_NAME="localhost",
DB_USER_NAME="root",
DB_PASSWORD="",
DB_NAME="blog"

dbcon.php

<?php

namespace server;

    class env {
        protected $path;

        
        public function __construct(string $path)
        {
            if(!file_exists($path)) {
                throw new \InvalidArgumentException(sprintf('%s does not exist', $path));
            }
            $this->path = $path;
        }

        public function load() :void
        {
            if (!is_readable($this->path)) {
                throw new \RuntimeException(sprintf('%s file is not readable', $this->path));
            }

            $lines = file($this->path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
            foreach ($lines as $line) {

                if (strpos(trim($line), '#') === 0) {
                    continue;
                }

                list($name, $value) = explode('=', $line, 2);
                $name = trim($name);
                $value = trim($value);

                if (!array_key_exists($name, $_SERVER) && !array_key_exists($name, $_ENV)) {
                    putenv(sprintf('%s=%s', $name, $value));
                    $_ENV[$name] = $value;
                    $_SERVER[$name] = $value;
                }
            }
        }
    }

然后我使用该类连接到数据库:

    use server\env;

    (new env(__DIR__ . '/.env'))->load();

    $SERVER_NAME = $_ENV["DB_SERVER_NAME"];
    $USERNAME = $_ENV["DB_USER_NAME"];
    $PASSWORD = $_ENV["DB_PASSWORD"];
    $DBNAME = $_ENV["DB_NAME"];

    try {   
         $data_source = "mysql:host=".$SERVER_NAME.";dbname=".$DBNAME;
         $db = new PDO($data_source, $USERNAME, $PASSWORD);
         print("Connected\n");
     } catch(PDOExeption $ex) {
         die("Could not connect to server");
     }

    $data_source = NULL;

但是现在我收到错误:我假设它正在服务器命名空间中查找 PDO 类,但我对它了解得不够多,无法了解如何解决此问题。我真的可以得到你的帮助。 感谢您的阅读。Fatal error: Uncaught Error: Class "server\PDO" not found

PHP mysqli pdo 致命错误

评论


答:

1赞 Justinas 8/13/2022 #1

除非您实际上重新定义了标准类,否则在使用所有类时必须使用完整的限定名称。PDO

由于 PDO 位于全局命名空间中,因此您必须将其用作:\PDO


namespace server;

...

    $db = new \PDO($data_source, $USERNAME, $PASSWORD);

...

命名空间声明后的任何类用法都假定您尝试从同一命名空间加载它。例外情况是,当您的类具有完全限定的名称或与语句一起使用时:use


namespace server;

use \Foo\Bar;

...

new Far(); // -> \server\Far - looking in same namespace
new Zar\Far(); // -> \server\Zar\Far - looking in sub-namespace `Zar`
new Bar(); // -> \Foo\Bar - used in `use` statement
new \Zar\Bar(); // -> \Zar\Bar - because of leading \ - full name and not under current namespace
new \Exception(); // -> \Exception - global namespace

评论

0赞 TheIvoryCoder 8/13/2022
谢谢!我没有意识到有这么简单的解决方案!很高兴你在这里:)
0赞 TheIvoryCoder 8/13/2022 #2

解决方案是将命名空间放在一个单独的文件中,然后将其包含在文件中dbcon.php

因此,带有 env 类的文件将如下所示:

<?php
    
    namespace server;

    class env {
        protected $path;

        
        public function __construct(string $path)
        {
            if(!file_exists($path)) {
                throw new \InvalidArgumentException(sprintf('%s does not exist', $path));
            }
            $this->path = $path;
        }

        public function load() :void
        {
            if (!is_readable($this->path)) {
                throw new \RuntimeException(sprintf('%s file is not readable', $this->path));
            }

            $lines = file($this->path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
            foreach ($lines as $line) {

                if (strpos(trim($line), '#') === 0) {
                    continue;
                }

                list($name, $value) = explode('=', $line, 2);
                $name = trim($name);
                $value = trim($value);

                if (!array_key_exists($name, $_SERVER) && !array_key_exists($name, $_ENV)) {
                    putenv(sprintf('%s=%s', $name, $value));
                    $_ENV[$name] = $value;
                    $_SERVER[$name] = $value;
                }
            }
        }
    }


    use server\env;

    (new env(__DIR__ . '/.env'))->load();

    $SERVER_NAME = $_ENV["DB_SERVER_NAME"];
    $USERNAME = $_ENV["DB_USER_NAME"];
    $PASSWORD = $_ENV["DB_PASSWORD"];
    $DBNAME = $_ENV["DB_NAME"];
?>

然后像这样包含它:

<?php
    include "fetchenv.php";
    
    try {   
        $data_source = "mysql:host=".$SERVER_NAME.";dbname=".$DBNAME;
        $db = new PDO($data_source, $USERNAME, $PASSWORD);
        print("Connected\n");
    } catch(PDOExeption $ex) {
        die("Could not connect to server");
    }
    
    $data_source = NULL;
?>