Проблема с подключением к PDO - PullRequest
4 голосов
/ 19 января 2011

Я впервые использую PDO только для тестирования.Но произошла странная ошибка, и поиск в Google, кажется, странным.

Вот мой класс тестирования базы данных

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 ]

5 голосов
/ 19 января 2011

Ваш код - беспорядок, возможно, потому что вы такой возбужденный ...

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);
2 голосов
/ 19 января 2011

Я не совсем уверен, что это ваш ответ, так как он не связан с сообщением об ошибке, но я не думаю, что вы можете передать имя таблицы как связанный параметр. Что произойдет, если вы поместите жестко закодированное имя таблицы вместо :table?

1 голос
/ 19 января 2011

Ваш шаблон синглтона все неправильно . Ваш конструктор должен быть private, и вы должны использовать статические экземпляры $db. См. Этот пример singleton .

1 голос
/ 19 января 2011

У вас есть статический конструктор 'connect', который превращает объект db в (статический) и возвращает его.Но вы также создаете новый db () самостоятельно.

Оператор prepare использует self::$db, поэтому пытается вызвать статическую переменную made.Я не совсем уверен, как ваш код должен работать, комбинируя какую-то одноэлементную / статическую форму с формой объекта.

Но, похоже, проблема

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...