如何解决这个PHP类错误

时间:2014-06-02 05:06:41

标签: php database pdo

这是我的代码

<?php
class db extends PDO {
    private $error; private $sql; private $bind; private $errorCallbackFunction; private $errorMsgFormat;

    public function __construct($dsn, $user="", $passwd="") {
        $options = array(
            PDO::ATTR_PERSISTENT => true, 
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        );

        try {
            parent::__construct($dsn, $user, $passwd, $options);
        } catch (PDOException $e) {
            $this->error = $e->getMessage();
        }
    }

但该行$this->error = $e->getMessage();显示的错误如此

  

警告:在C:\ Program Files中从空值创建默认对象   第14行的(x86)\ Ampps \ www \ blog \ library \ class-database.php

我已经创建了这样的代码

$db = new db("mysql:host=localhost;port=3306;dbname=".$dbname, $dbusername, $dbpassword);

并且测试其他值是正确的,除了$ dbname,因为我想向用户显示他们插入了错误的数据库详细信息。

1 个答案:

答案 0 :(得分:-1)

我正在尝试为此找到文档,但基本上似乎在对$引用中抛出异常之后,将其设置为null。例如,如果你在$ this-&gt;错误之前print_r($ this),你就什么也得不到。

我能想出的最好的解释方法是source code for the PDO extension,如果出现错误,似乎设置了对象to null

无论如何 - 在构造函数中隐藏(捕获)可能导致无效状态的异常是不好的做法。我建议只需从构造函数中删除try catch并将其放在实例化对象的任何地方(应该只在应用程序中使用一次)。然后你可以适当地处理这个异常(最有可能退出应用程序)。

或者,您可以封装PDO类而不是扩展它。

此外,这个特定的代码剪切并不会激发您对正在使用的包装器的极大信心。您可能希望了解完全成熟的ORM,例如doctrinepropel