2012-10-08 4 views
8

Lorsque vous avez de longs champs dans une requête SQL, comment le rendre plus lisible?Comment rendre la requête SQL plus lisible en PHP?

Par exemple:

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

pouvez-vous être plus précis ici? – AnandPhadke

+0

vous avez des suggestions solides ici - pourquoi ne pas en choisir une comme réponse acceptée? –

+0

Sûrement après 6 mois une réponse est justifiée. Sélectionnez l'une des suggestions ci-dessous. – philwinkle

Répondre

9

Vous pouvez concaténer comme ça pour le rendre plus lisible:

$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"; 

Remarque: Assurez-vous que tout concatinating votre requête, ne pas oublier de laisser espaces avant de commencer une nouvelle ligne entre vos guillemets, sinon vous obtiendrez une erreur d'erreur de requête

+0

La concaténation de SQL peut conduire à des points-virgules mal placés dans PHP. Cela me semble moche - je préférerais "sprintf" à cela. – philwinkle

+2

En PHP, vous pouvez concaténer avec des espaces blancs sur plusieurs lignes. Alors, ouvrez une double citation sur une ligne et terminez-la dans une autre ligne. Pas besoin d'écrire $ sql. = Plusieurs fois. De cette façon, ça a l'air propre. –

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

-je utiliser un outil gratuit @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

Je préfère la syntaxe Heredoc, mais Nowdoc fonctionnerait aussi pour votre exemple:

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

L'avantage avec les deux est y Vous pouvez copier et coller directement du SQL vers et depuis ce bloc sans devoir vous échapper ou le formater. Si vous deviez inclure l'analyse, comme vous le feriez avec des variables d'une chaîne entre guillemets, vous utiliseriez Heredoc. Nowdoc se comporte comme des guillemets simples.

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

Et, FWIW, Sublime Text 2 reconnaît cette syntaxe comme SQL au lieu d'une chaîne PHP et active la syntaxe de mise en évidence intelligemment. Pas mal. – philwinkle

+0

mon vote est pour celui-ci - à certains égards, c'est exactement ce que la syntaxe heredoc/nowdoc est faite, et donner à votre éditeur de code un signal pour savoir comment appliquer la coloration syntaxique est un bon bonus. –

+0

Notez que vos exemples ne fonctionneront pas: l'identificateur de fermeture (SQL) ne peut pas avoir d'indentation devant lui. – 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

Ceci est juste une autre façon.

Notez que la jointure de tableau est plus rapide que la concaténation de chaîne.

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