[英]Fatal error: Uncaught Error: Class "server\PDO" not found
對於我正在進行的項目,我正在嘗試使用 PHP 連接到使用 PDO 的數據庫。 為了安全起見,我已將數據存儲在.env
文件中,並制作了 class 來獲取該數據:
.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;
}
}
}
}
然后我使用 class 連接到數據庫:
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;
但現在我收到錯誤: Fatal error: Uncaught Error: Class "server\PDO" not found
我認為它正在尋找 PDO class 在服務器名稱空間中如何修復它,但我不知道如何修復它. 我真的可以使用你的幫助。 感謝您的閱讀。
除非您實際上已重新定義標准PDO
class,否則在使用所有類時必須使用完整的限定名稱。
由於 PDO 位於全局命名空間中,因此您必須將其用作\PDO
:
namespace server;
...
$db = new \PDO($data_source, $USERNAME, $PASSWORD);
...
命名空間聲明后的任何 class 使用假定您嘗試從同一命名空間加載它。 例外情況是您的 class 具有完全限定名稱或與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
解決方案是將命名空間放在單獨的文件中,然后將其包含在dbcon.php
文件中
所以帶有 env class 的文件看起來像這樣:
<?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;
?>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.