连接PDO时出现问题

时间:2011-01-19 17:21:26

标签: php mysql pdo

这是我第一次将PDO用于测试目的。 但是发生了一个奇怪的错误,谷歌搜索它,似乎很奇怪。

这是我的数据库测试类

class db extends PDO
{
    # Our instance.
    private static $db = NULL;

    # Calling the connector.
    public static function connect()
    {
        if (self::$db === NULL)
        {
            $class = __CLASS__;
            self::$db = new $class();
        }
        return self::$db;
    }

    # Connector.
    public function __construct() 
    { 
        $dns = 'mysql:dbname='.reg::get('db-name').';host='.reg::get('db-host');
        self::$db = new PDO($dns, reg::get('db-username'), reg::get('db-password'));
        reg::delete('db-password');
    }

    # Quick reporting
    public function reportError($array)
    {
        if ($this->db != NULL) { echo 'Myself getting horny'; } // Just for testing, i'm not getting horny because of a mysql database connection!
    }

}

然后执行以下代码:

$db = new db();
$row = $db->prepare('SELECT * FROM test WHERE id = :id')->execute(array('id' => 1));
echo $row['value'];

它显示以下错误:

Warning: PDO::prepare() [pdo.prepare]: SQLSTATE[00000]: No error: PDO constructor was not called in myfile.php on line 39

将第39行视为

$row = $db->prepare('SELECT * FROM test WHERE id = :id')->execute(array('id' => 1));

4 个答案:

答案 0 :(得分:5)

你的代码很乱,可能是因为你是如此的角质......

connect()方法 - 为什么会出现?:

if ($db === NULL)

应该是:

if (self::$db === NULL)

self::$db = new $class();

所以,如果$class == __CLASS__ == db,你正在做self::$db = new db();,那似乎不对。


您无法使用PDO准备标识符,例如表格或列。

$db->prepare('SELECT * FROM :table WHERE id = :id')->execute(array('table' => 'test', 'id' => 1));

应该是:

$db->prepare('SELECT * FROM `test` WHERE id = :id')->execute(array('id' => 1));

试试这个:

class db extends PDO
{
    private static $db = null;

    public static function singleton()
    {
        if (is_null(self::$db) === true)
        {
            self::$db = new PDO('mysql:dbname='.reg::get('db-name').';host='.reg::get('db-host'), reg::get('db-username'), reg::get('db-password'));
        }

        return self::$db;
    }
}

像这样:

$result = db::singleton()->prepare('SELECT * FROM `test` WHERE id = :id')->execute(array('id' => 1));

var_dump($result);

答案 1 :(得分:2)

我不完全确定这是否是您的答案,因为它似乎与错误消息无关,但我认为您不能将表名作为绑定参数传递。如果您将硬编码的表名放在:table

的位置会发生什么

答案 2 :(得分:1)

你有一个静态的'connect'构造函数,它在(静态)中创建一个db-object,并返回它。但你也自己创建一个新的db()。

prepare语句使用self::$db,因此尝试调用静态变量。我不确定你的代码应该如何工作,将某种单例/静态形式与对象形式结合起来。

但这似乎是麻烦

答案 3 :(得分:1)

您的单身人士模式全部错误。您的构造函数应为private,您应该使用$db的静态实例。请参阅此singleton example