2015-11-05 4 views
0

Привет, я использую класс PDO DB для подключения к базе данных. Но я действительно задаюсь вопросом, правильно ли я делаю это или нет. Все соединения выполняется очень хорошо, но i get error when i run a queryPDO-соединение Не работает по мере необходимости

Моя структура каталогов

/root 
/dbops <-- Directory contains `config.php` --> 
    /dbfunctions <-- Directory contains `DBclass.php` & `DBFuncts.php` --> 

Теперь содержимое config.php являются:

define('DB_HOST', 'localhost'); 
define('DB_USERNAME', 'root'); 
define('DB_PASSWORD', ''); 
define('DB_NAME', 'testDB'); 
define('DB_CHAR', 'utf8'); 

function __autoload($class){ 
    $parts = explode('__', $class); 
    $path = implode(DIRECTORY_SEPARATOR,$parts); 
    require_once $path . '.php'; 
} 

DBclass.php содержит:

class dbdunctions__DBclass{ 
    public $instance = null; 
    public function __construct() {} 
    final private function __clone() {} 

    public static function instance() 
    { 
     if (self::$instance === null) 
     { 
      $opt = array(
      PDO::ATTR_ERRMODE   => PDO::ERRMODE_EXCEPTION, 
      PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 
      PDO::ATTR_EMULATE_PREPARES => TRUE, 
      PDO::ATTR_STATEMENT_CLASS => array('myPDOStatement'), 
      ); 
      $dsn = 'mysql:host='.DB_HOST.';dbname='.DB_NAME.'; 
      charset='.DB_CHAR; 
      self::$instance = new PDO($dsn, DB_USERNAME, DB_PASSWORD, 
      $opt); 
     } 
     return self::$instance; 
    } 
    public static function __callStatic($method, $args) { 
    return call_user_func_array(array(self::instance(), $method), $args); 
    } 
} 

class myPDOStatement extends PDOStatement 
{ 
    function execute($data = array()) 
    { 
     parent::execute($data); 
     return $this; 
    } 
} 

DBFuncts.php содержит ниже:

class dbfunctions__DBFuncts 
{ 
    protected $_con; 
    public function __construct() 
    { 
    $db = new dbfunctions__DBclass(); 
    $this->_con = $db->con; 
    } 

    function gotodb(array $data){ 
    $result = 
    $this->_con::instance()->prepare($qry)->execute(array(/*parameters*/)); 
    } 
} 

Теперь, когда запрос отапливают $result тогда я получаю следующее сообщение об ошибке

Ошибка синтаксического анализа: ошибка синтаксиса, неожиданный '::' (T_PAAMAYIM_NEKUDOTAYIM) в dbops/dbfunctions/DBFuncts .php на линии

Пожалуйста, руководство. Я уже потратил 2 часа на эту проблему и искал походы.

+0

Как это может быть дубликат. Моя проблема отличается от других. – Gags

+0

Почему вы размещаете обертку вокруг PDO? – SpacePhoenix

+0

Этот pdo работает, когда я просто включаю этот файл, но когда я пытаюсь пройти через классы, я сталкиваюсь с проблемами. Так что обертка вокруг PDO не вызывала проблем.Если вы знаете о sol, то любезно сообщите мне – Gags

ответ

0

Вместо

$this->_con::instance() 

Вы должны быть в состоянии просто сделать

$this->_con->instance()->prepare($qry)->execute(array(/*parameters*/)); 

Не уверен, если это опечатка, когда вы помещаете код - но я заметил, что в DBclass. php у вас есть класс dbdunctions__DBclass - неужели это должен быть класс dbfunctions__DBclass()?

Кроме того, как представляется, некоторые другие ошибки в вашем примере кода ... Но давайте решать их по одному за раз :)

+0

. Я подумал об этом и изменил это, и теперь ошибка 'Неустранимая ошибка: Позвоните в экземпляр функции-члена() для не-объекта' – Gags

+0

. Какая ошибка? –

+0

$ this -> _ con = $ db-> con; Попробуйте просто установить $ this -> _ con = $ db в DBFuncts.php –

0

Попробуйте изменить этот путь. Я работаю над своим сервером с некоторыми настройками. Примечательно инстанцирование соединения в __construct() из dbdunctions__DBclass() класса и назначение $this->_con к self::$instance (dbdunctions__DBclass::$instance;):

class dbdunctions__DBclass 
    { 
     // Make the instance static 
     public static $instance = null; 

     public function __construct() 
      { 
       // Create the static connection in the construct 
       $this->init(); 
      } 

     private function init() 
      { 
       if (self::$instance === null) { 
        $opt = array(
           PDO::ATTR_ERRMODE   => PDO::ERRMODE_EXCEPTION, 
           PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 
           PDO::ATTR_EMULATE_PREPARES => TRUE, 
           PDO::ATTR_STATEMENT_CLASS => array('myPDOStatement'), 
           ); 

        self::$instance = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.'; charset='.DB_CHAR, DB_USERNAME, DB_PASSWORD, $opt); 
       } 
      } 

     final private function __clone() 
      { 
      } 

     public static function __callStatic($method, $args) 
      { 
       return call_user_func_array(array(self::instance(), $method), $args); 
      } 
    } 

class myPDOStatement extends PDOStatement 
    { 
     public function execute($data = array()) 
      { 
       parent::execute($data); 
       return $this; 
      } 
    } 

class dbfunctions__DBFuncts 
    { 
     protected $_con; 

     public function __construct() 
      { 
       // Create instance of database 
       $database = new dbdunctions__DBclass(); 
       // Assign the connection to the $this->_con 
       $this->_con = dbdunctions__DBclass::$instance; 
      } 

     public function gotodb($statement = false,$bind = false) 
      { 
       // Incase the statement or bind is empty, return 0 
       if(empty($statement) || empty($bind)) 
        return 0; 
       // Create the query with method chain 
       $query = $this ->_con->prepare($statement) 
            ->execute($bind); 
       // Fetch results 
       while($row = $query->fetch()) 
        $result[] = $row; 
       // If results return array else return 0 for consistency 
       return (!empty($result))? $result : 0; 
      } 
    } 

// Instantiate 
$dbFunc = new dbfunctions__DBFuncts(); 
// Use whatever you use to return a result here. This statement happens 
// to work for my database...but likely not yours 
print_r($dbFunc->gotodb("select * from `users` where `ID` = :ID",array(":ID"=>"29"))); 
+0

Но этот подход не удастся, если у меня есть запрос на вставку ... – Gags

+0

Почему это? Что не получится? – Rasclatt

+0

Я думаю, что 2 функции сделают работу .. один для вставки и другие, чтобы выбрать – Gags

0
class dbfunctions__DBFuncts 
{ 
    protected $_con; 
    public function __construct() 
    { 
    $db = new dbfunctions__DBclass(); 
    $this->db = $db; 
    } 

    function gotodb(array $data){ 
    $result = 
    $stmt = $this->db->prepare($qry); 
$stmt->execute(array(/*parameters*/)); 
    } 

объект PDO получает созданный затем превращен в «объект члена». Объект gotodb использует экземпляр PDO-объекта-члена. Ниже приведен пример кода с сайта, я работаю на который должен помочь объяснить это лучше:

try { 
       $sql=" 
        SELECT 
          id 
         , name 
         , description 
        FROM  
         ue_bug_project     
       "; 
// $stmt objected created by preparing the SQL query for execution, using the PDO object, which in this case is $this->db 
       $stmt = $this->db->prepare($sql); 
// The execute method of the $stmt object is run executing the query, in this case no query data is bound as there is no user submitted data being used 
       $stmt->execute(); 
// The result set is grabbed in one hit and placed into the projects array (I really should have set up the $projects variable as an empty array beforehand) 
       $projects = $stmt->fetchAll(PDO::FETCH_ASSOC); 
       return $projects; 
      } 
// If the query fails with an error, the catch block is run, in this case i log the error. 
      catch (PDOException $e) { 
       error_log('Error when getting the list of projects!'); 
       error_log(' Query with error: '.$sql); 
       error_log(' Reason given:'.$e->getMessage()."\n"); 
       return false; 
      } 

} 

От взглядов коды там, наверное, нет реальной необходимости разместить свои собственные обертки вокруг класса PDO

+0

Это дает ошибку Call to undefined method dbfunctions__DBclass :: prepare() – Gags

+0

@Cristian Bitoi ... можно увидеть эту ошибку – Gags

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