未找到 PDO 名称空间,但正确执行
PDO namespace not found, while doing it correctly
所以命名空间和 PDO,根据我现在的经验,我认为它很糟糕。
Warning: include_once(C:/xampp2/htdocs\application\classes\class.pdo.php): failed to open stream: No such file or directory in C:\xampp2\htdocs\application\bootstrap.php on line 18
Warning: include_once(): Failed opening 'C:/xampp2/htdocs\application\classes\class.pdo.php' for inclusion (include_path='.;C:\xampp2\php\PEAR') in C:\xampp2\htdocs\application\bootstrap.php on line 18
Fatal error: Class 'C_Red\Storage\PDO' not found in C:\xampp2\htdocs\application\classes\class.database.php on line 13
如果我这样连接,这是怎么回事:
public static function init()
{
global $_CONFIG;
try
{
self::$conn = new \PDO('mysql:hostname=127.0.0.1;dbname=c_red,root,123',array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
}
catch(PDOException $e)
{
throw new PDOException ($e->getMessage);
}
date_default_timezone_set('Europe/Amsterdam');
}
PDO 前面的 \
的工作不是设置它不在我正在工作的命名空间中吗?
怎么会出现这个错误?
谢谢。
不仅 new \PDO()
构造函数必须命名空间,还包括对其常量和异常的引用。稍后在构造函数中声明 PDO 属性,但不要使用反斜杠命名它们:
// First fix the namespacing...
self::$conn = new \PDO('mysql:hostname=127.0.0.1;dbname=c_red,root,123',array(\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION));
//--------------------------------------------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
所以错误消息导致您查看 new PDO()
但 PHP 实际上是在同一行中抱怨 PDO::ATTR_ERRMODE
。
catch
块也是如此:
catch(\PDOException $e)
{
throw new \PDOException ($e->getMessage);
}
其次:您在用户名和密码之前缺少 DSN 字符串的结束引号。构造函数应该看起来完全像:
// user, password are 2nd, 3rd arguments to constructor!
self::$conn = new \PDO('mysql:hostname=127.0.0.1;dbname=c_red', 'root', '123', array(\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION));
... 其中 'root'
和 '123'
是构造函数的单独参数, 不是 DSN 字符串的 部分。
评论后使用the use
keyword的注意事项:
您可以使用
将 PDO 导入您的命名空间
use \PDO;
这将允许您使用 PDO
及其常量,而无需在它们前面加上反斜杠。但是,您 也 必须 use \PDOException
因为异常不在 PDO
名称空间内(没有这样的名称空间)。两者都存在于全局命名空间中,因此使用 use
导入它们可能不会有太大好处。我的 意见 和偏好是继续将它们作为前缀 \PDO
和 \PDOException
.
所以命名空间和 PDO,根据我现在的经验,我认为它很糟糕。
Warning: include_once(C:/xampp2/htdocs\application\classes\class.pdo.php): failed to open stream: No such file or directory in C:\xampp2\htdocs\application\bootstrap.php on line 18
Warning: include_once(): Failed opening 'C:/xampp2/htdocs\application\classes\class.pdo.php' for inclusion (include_path='.;C:\xampp2\php\PEAR') in C:\xampp2\htdocs\application\bootstrap.php on line 18
Fatal error: Class 'C_Red\Storage\PDO' not found in C:\xampp2\htdocs\application\classes\class.database.php on line 13
如果我这样连接,这是怎么回事:
public static function init()
{
global $_CONFIG;
try
{
self::$conn = new \PDO('mysql:hostname=127.0.0.1;dbname=c_red,root,123',array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
}
catch(PDOException $e)
{
throw new PDOException ($e->getMessage);
}
date_default_timezone_set('Europe/Amsterdam');
}
PDO 前面的 \
的工作不是设置它不在我正在工作的命名空间中吗?
怎么会出现这个错误?
谢谢。
不仅 new \PDO()
构造函数必须命名空间,还包括对其常量和异常的引用。稍后在构造函数中声明 PDO 属性,但不要使用反斜杠命名它们:
// First fix the namespacing...
self::$conn = new \PDO('mysql:hostname=127.0.0.1;dbname=c_red,root,123',array(\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION));
//--------------------------------------------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
所以错误消息导致您查看 new PDO()
但 PHP 实际上是在同一行中抱怨 PDO::ATTR_ERRMODE
。
catch
块也是如此:
catch(\PDOException $e)
{
throw new \PDOException ($e->getMessage);
}
其次:您在用户名和密码之前缺少 DSN 字符串的结束引号。构造函数应该看起来完全像:
// user, password are 2nd, 3rd arguments to constructor!
self::$conn = new \PDO('mysql:hostname=127.0.0.1;dbname=c_red', 'root', '123', array(\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION));
... 其中 'root'
和 '123'
是构造函数的单独参数, 不是 DSN 字符串的 部分。
评论后使用the use
keyword的注意事项:
您可以使用
将 PDO 导入您的命名空间use \PDO;
这将允许您使用 PDO
及其常量,而无需在它们前面加上反斜杠。但是,您 也 必须 use \PDOException
因为异常不在 PDO
名称空间内(没有这样的名称空间)。两者都存在于全局命名空间中,因此使用 use
导入它们可能不会有太大好处。我的 意见 和偏好是继续将它们作为前缀 \PDO
和 \PDOException
.