2009-09-24 17 views
7

Ich möchte meine Tabellen Präfix, falls ich die Anwendung auf einen Host mit nur einer Datenbank installieren muss. Ich habe mich gefragt, ob es eine einfache Möglichkeit gibt, mit Tabellen-Präfixen mit der PDO-Klasse zu arbeiten?PDO - Arbeiten mit Tabellenpräfixen

Im Moment muss ich jede Methode in meiner eigenen Datenbank überschreiben, ersetzen Sie% p mit dem Präfix, und rufen Sie die Super-Methode. Es funktioniert, aber es ist nicht schön!

Antwort

9

Die Erweiterung der PDO-Klasse ist wahrscheinlich die beste Option.

class MyPDO extends PDO 
{ 
    protected $_table_prefix; 
    protected $_table_suffix; 

    public function __construct($dsn, $user = null, $password = null, $driver_options = array(), $prefix = null, $suffix = null) 
    { 
     $this->_table_prefix = $prefix; 
     $this->_table_suffix = $suffix; 
     parent::__construct($dsn, $user, $password, $driver_options); 
    } 

    public function exec($statement) 
    { 
     $statement = $this->_tablePrefixSuffix($statement); 
     return parent::exec($statement); 
    } 

    public function prepare($statement, $driver_options = array()) 
    { 
     $statement = $this->_tablePrefixSuffix($statement); 
     return parent::prepare($statement, $driver_options); 
    } 

    public function query($statement) 
    { 
     $statement = $this->_tablePrefixSuffix($statement); 
     $args  = func_get_args(); 

     if (count($args) > 1) { 
      return call_user_func_array(array($this, 'parent::query'), $args); 
     } else { 
      return parent::query($statement); 
     } 
    } 

    protected function _tablePrefixSuffix($statement) 
    { 
     return sprintf($statement, $this->_table_prefix, $this->_table_suffix); 
    } 
} 
+0

hallo ist es nur mir so oder auf der Funktion/Methode '_tablePrefixSuffix' das letzte Bit' $ this_table_suffix' wird angenommen, '$, dies zu sein -> _ table_suffix'? – Val

+0

Nicht sicher, wie dies möglicherweise als funktionierendes Beispiel angesehen wurde, da 'sprintf' Formatzeichenfolge mit speziellen Ankern erwartet, aber das' $ statement' Argument ist nur eine einfache Zeichenkette, die einfach ignoriert und zurückgegeben wird. –

+0

Ok, habe es herausgefunden. Sie geben nur den Tabellennamen mit Ankern an: '$ table ="% 1 \ $ s {$ table}% 2 \ $ s "' –