php
  • mysql
  • 2016-09-08 3 views 0 likes 
    0

    Ich habe ein altes Projekt bekam die Daten, die diese dumme Art und Weise holen:PHP SQL Query Builder ohne DB-Verbindung

    $db = new Database($server, $name, $pass); 
    $where = 'country = "UK"'; 
    if ($_GET['gender']) { $where .= ' AND gender = "' . $_GET['gender'] . '"'; } 
    $sql = "SELECT * FROM users WHERE $where ORDER BY name"; 
    $users = $db->fetchAll($sql); 
    

    Ich möchte es mit einem SQL-Builder verbessern (bei anderen Projekten verwende ich DB-Tabellen Zend), aber das Problem ist, ich muss die Database Klasse behalten, weil es fetch*() Methoden mehr als nur das Laden von Daten (zB Debugging, Leistung, Statistiken, etc.) ist.

    Ich habe bei Zend_Db_Table sehe und this post aber all diese Abfrage Bauherren an einen DB-Stecker angebracht mit eigenen fetch() oder execute() Methoden. Aber ich würde einen Builder benötigen, die nur SQL-Abfrage erstellt, die in den bestehenden Verfahren verwendet werden können:

    $query = new MySqlQuery(); 
    $query 
        ->select('*') 
        ->from('users') 
        ->orderBy('name') 
        ->where('country', 'UK'); 
    if ($_GET['gender']) { 
        $query->where('gender', $_GET['gender']); 
    } 
    $sql = $query->toString(); 
    
    $db = new Database($server, $name, $pass); 
    $users = $db->fetchAll($sql); 
    

    ich einfach dachte, die Zend Klassen stehlen und Umschreiben sie, damit sie die DB-Verbindung nicht benötigen, aber ich würde gerne sehen, ob das schon etwas erledigt ist.

    +0

    Konnte nicht Ihre 'Database' Klasse die Zend_Db_Table Klasse erben, die Methode für' fetchAll' überschreiben, aber immer noch den übergeordneten 'fetch' aufrufen (in diesem Fall' Zend_Db_Table :: fetch'), um die Daten zu erhalten? __NB__ - Ich benutze ZendFrameworks nicht, also ist das reine Spekulation. Raten Arbeit und "Finger in der Luft" Glück – DaveyBoy

    +0

    @DaveyBoy Leider Teile des Projekts sind nicht-OOP (die SQL-Abfrage), während andere OOP so übermäßig sind, so ist der Vererbungsbaum der 'Datenbank'' Database' <- 'BaseDatabase '<-' CustomDb' <- 'BaseDb' <-' AbstractDb' <- 'BaseObject' <-' AbstractObject' und es wäre sehr schwer von etwas anderem zu erben. Also muss die 'Database' _as is_ bleiben, weil ich keine Zeit habe sie komplett neu zu schreiben. –

    Antwort

    0

    Ich habe geändert Zend_Db_Select erstellt, die keine aktive Verbindung mit der Datenbank erfordert.

    require_once 'Zend/Db/Query/Mysql.php'; 
    
    $query = new Zend_Db_Query_Mysql(); 
    
    $query 
        ->from(array('a' => 'articles')) 
        ->columns(array('id', 'text' => 'content_text')) 
        ->joinLeft('authors', 
         $query->column('author', 'articles', new Zend_Db_Expr('authors.id')) 
        ) 
        ->where($query->column('archived', 'articles', 0)) 
        ->order(new Zend_Db_Expr($query->column('release_time', 'articles') . ' DESC')) 
    ; 
    
    $sql = $query->assemble(); 
    

    Als Bonus habe ich hinzugefügt, um die column() Methode, die Namen Spalten und Tabellen, um ihre Aliase übersetzt.


    Erhältlich als Zend extension oder standalone library.

    Verwandte Themen