web-dev-qa-db-ja.com

PHPでSQLクエリを読みやすくする方法は?

SQLクエリに長いフィールドがある場合、どのようにして読みやすくしますか?

例えば:

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');
    }
16
I'll-Be-Back

このように連結して、読みやすくすることができます。

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

:クエリを連結するときは、二重引用符の間に新しい行を開始する前にスペースを残すことを忘れないでください。そうしないと、クエリの無効なエラーが発生します。

10
Mr. Alien

私はヒアドキュメント構文を好みますが、Nowdocはあなたの例でも機能します:

ヒアドキュメント:

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

両方の利点は、エスケープしたりフォーマットしたりすることなく、このブロックとの間で直接SQLをコピーして貼り付けることができることです。二重引用符で囲まれた文字列の変数を使用する場合など、解析を含める必要がある場合は、ヒアドキュメントを使用します。 Nowdocは一重引用符のように動作します。

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');
}

ヒアドキュメント:

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');
}
20
philwinkle

私は無料のツールを使用しています@ 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');
}
?>
4

個人的には、sprintfは、一部のSQLサーバーが受け入れるprepared statementと構造が非常に似ているため、これに最適なアプローチだと思います。

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

Heredocアプローチを使用してみましたが、単一の変数だけでなくオブジェクトを使用している場合は複雑になります。

1
Rafael
<?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
endofsource

これは別の方法です。

配列結合は文字列連結よりも高速であることに注意してください。

$sql = join(" \n", Array(
    'SELECT ',
    '    [...fields...]',
    '    [...more fields...]',
    'FROM table',
    'JOIN table2 AS TNS ON TNS.id = table.id',
    'WHERE something = 1',
));
0
jimk
 $sql = "SELECT field1,
                field2,
                field3 as Field3_Something,
                field4,....
         FROM table
         JOIN table2 AS TNS ON TNS.id = table.id
         WHERE something = 1";
0
Jobin Jose