2012-10-08 5 views
8

Wenn Sie eine lange Felder in SQL-Abfrage haben, wie machen Sie es lesbarer?Wie macht man SQL-Abfragen in PHP lesbarer?

Zum Beispiel:

public function findSomethingByFieldNameId($Id) { 
     $sql = "SELECT field1, field2, field3 as Field3_Something, field4, field5, field6, field7, field8, field9 
         FROM table 
       JOIN table2 AS TNS ON TNS.id = table.id 
         WHERE something = 1"; 
return $this->db->fetchData($sql, null, 'all'); 
    } 
+0

Können Sie genauer hier sein? – AnandPhadke

+0

Sie haben hier einige solide Vorschläge - warum wählen Sie nicht eine als akzeptierte Antwort? –

+0

Sicherlich nach 6 Monaten ist eine Antwort gerechtfertigt. Wählen Sie einen der folgenden Vorschläge. – philwinkle

Antwort

9

Sie können es so verketten, um es besser lesbar:

$sql = "SELECT field1, field2, field3 as Field3_Something,"; 
$sql.= " field4, field5, field6, field7, field8, field9"; 
$sql.= " FROM table JOIN table2 AS TNS ON TNS.id = table.id"; 
$sql.= " WHERE something = 1"; 

Hinweis: Stellen Sie sicher, während die Abfrage concatinating, vergessen Sie nicht zu verlassen Leerzeichen, bevor Sie eine neue Zeile zwischen Ihren Anführungszeichen beginnen, sonst erhalten Sie eine Abfrage ungültiger Fehler

+0

Das Verketten von SQL kann zu unangebrachten Semikola in PHP führen. Es sieht für mich hässlich aus - ich würde lieber "sprintf" darüber sprechen. – philwinkle

+2

In PHP können Sie mit Leerraum über mehrere Zeilen verketten. Also, öffne ein Anführungszeichen in einer Zeile und beende es in einer anderen Zeile. Keine Notwendigkeit, $ sql. = Mehrmals zu schreiben. Auf diese Weise sieht es sauber aus. –

0
$sql = "SELECT field1, 
       field2, 
       field3 as Field3_Something, 
       field4,.... 
     FROM table 
     JOIN table2 AS TNS ON TNS.id = table.id 
     WHERE something = 1"; 
3

Ich benutze ein kostenloses Tool @http://www.sqlinform.com

<?php 
public function findSomethingByFieldNameId($Id) { 
    $sql = "SELECT field1     , 
        field2     , 
        field3 AS Field3_Something, 
        field4     , 
        field5     , 
        field6     , 
        field7     , 
        field8     , 
        field9 
      FROM TABLE 
        JOIN table2 AS TNS 
        ON TNS.id = table.id 
      WHERE something = 1"; 

    return $this->db->fetchData($sql, null, 'all'); 
} 
?> 
13

I Heredoc Syntax bevorzugen, obwohl Nowdoc auch für Ihr Beispiel funktionieren würde:

Heredoc:

http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc

Nowdoc: http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.nowdoc

Der Vorteil bei beiden ist y Sie können gerade SQL in und aus diesem Block kopieren und einfügen, ohne es zu entweichen oder zu formatieren. Wenn Sie das Parsen einbeziehen müssten, wie Sie es mit Variablen aus einer Zeichenfolge in doppelten Anführungszeichen tun würden, würden Sie Heredoc verwenden. Nowdoc verhält sich wie einfache Anführungszeichen.

Nowdoc:

public function findSomethingByFieldNameId($Id) { 
    $sql = <<<'SQL' 
    SELECT field1, field2, field3 as Field3_Something, field4, field5, field6, field7, field8, field9 
    FROM table 
    JOIN table2 AS TNS ON TNS.id = table.id 
    WHERE something = 1 
SQL; 

    return $this->db->fetchData($sql, null, 'all'); 
} 

Heredoc:

public function findSomethingByFieldNameId($Id) { 
    $sql = <<<SQL 
    SELECT field1, field2, field3 as Field3_Something, field4, field5, field6, field7, field8, field9 
    FROM table 
    JOIN table2 AS TNS ON TNS.id = table.id 
    WHERE something = '$Id' 
SQL; 

    $sql = mysql_real_escape_string($sql); 

    return $this->db->fetchData($sql, null, 'all'); 
} 
+3

Und, FWIW, Sublime Text 2 erkennt diese Syntax als SQL anstelle einer PHP-Zeichenfolge und schaltet die Syntaxhervorhebung intelligent um. Sehr schön. – philwinkle

+0

meine Stimme ist für diese eine - in gewisser Hinsicht ist dies genau das, was die Heredoc/Nowdoc-Syntax gemacht wird, und geben Sie Ihrem Code-Editor einen Hinweis, wie Syntax Highlighting anzuwenden ist ein netter Bonus. –

+0

Beachten Sie, dass Ihre Beispiele nicht funktionieren: Die Abschlusskennung (SQL) darf keine Einrückung davor haben. – nullability

0
<?php 
    public function findSomethingByFieldNameId($Id) { 
     $sql = "SELECT 
        field1, 
        field2, 
        field3 as Field3_Something, 
        field4, 
        field5, 
        field6, 
        field7, 
        field8, 
        field9 
       FROM 
        table 
       JOIN table2 AS TNS 
        ON TNS.id = table.id 
       WHERE 
        something = 1"; 
     return $this->db->fetchData($sql, null, 'all'); 
} 
?> 
0

Dies ist nur eine andere Art und Weise.

Beachten Sie, dass Array-Join schneller als String-Verkettung ist.

$sql = join(" \n", Array(
    'SELECT ', 
    ' [...fields...]', 
    ' [...more fields...]', 
    'FROM table', 
    'JOIN table2 AS TNS ON TNS.id = table.id', 
    'WHERE something = 1', 
));