2010-09-15 2 views
1

из http://www.php.net/manual/en/class.pdo.phpВызов неопределенной базы данных метода :: подготовить()

###### config.ini ###### 
db_driver=mysql 
db_user=root 
db_password=924892xp 

[dsn] 
host=localhost 
port=3306 
dbname=localhost 

[db_options] 
PDO::MYSQL_ATTR_INIT_COMMAND=set names utf8 

[db_attributes] 
ATTR_ERRMODE=ERRMODE_EXCEPTION 
############ 

<?php class Database { 
    private static $link = null ; 

    private static function getLink () { 
     if (self :: $link) { 
      return self :: $link ; 
     } 

     $ini = _BASE_DIR . "config.ini" ; 
     $parse = parse_ini_file ($ini , true) ; 

     $driver = $parse [ "db_driver" ] ; 
     $dsn = "${driver}:" ; 
     $user = $parse [ "db_user" ] ; 
     $password = $parse [ "db_password" ] ; 
     $options = $parse [ "db_options" ] ; 
     $attributes = $parse [ "db_attributes" ] ; 

     foreach ($parse [ "dsn" ] as $k => $v) { 
      $dsn .= "${k}=${v};" ; 
     } 

     self :: $link = new PDO ($dsn, $user, $password, $options) ; 

     foreach ($attributes as $k => $v) { 
      self :: $link -> setAttribute (constant ("PDO::{$k}") 
       , constant ("PDO::{$v}")) ; 
     } 

     return self :: $link ; 
    } 

    public static function __callStatic ($name, $args) { 
     $callback = array (self :: getLink (), $name) ; 
     return call_user_func_array ($callback , $args) ; 
    } 
} ?> 

<?php // examples 
$stmt = Database :: prepare ("SELECT 'something' ;") ; 
$stmt -> execute () ; 
var_dump ($stmt -> fetchAll ()) ; 
$stmt -> closeCursor () ; 
?> 

Что я сделал не так, или был в этом примере код не так? Вызов метода undefined База данных :: prepare() on line 167

+0

Просто любопытно, так как весь код, размещенные здесь берется непосредственно из ссылки вы предоставили, у вас есть ini-файл, и на самом деле у вас есть база данных для подключения? –

+0

Да и да. :) – Johnny

ответ

1

В вашем классе базы данных нет метода prepare. Это принадлежит объекту PDO, который вы храните как $link.

То, что вы, вероятно, ищет это

Database :: $link->prepare(...) 

Update повторно ваш комментарий: Вы правы, не расслышал. __callStatic можно приобрести в PHP >= 5.3.0 only - у вас есть правильная версия?

+0

Не так ли: public static function __callStatic ($ name, $ args) { $ callback = array (self :: getLink(), $ name); return call_user_func_array ($ callback, $ args); } должен делать? – Johnny

+0

@ Джонни, ты прав. Вы используете php 5.3? –

+0

Черт, я не использовал 5.3 – Johnny

0

как говорит сообщение об ошибке: есть Noch общественный статический метод «подготовки» в вас база данных класса ...

+0

См. Мой другой комментарий. – Johnny

Смежные вопросы