如何使SQL查询在PHP中更具可读性?

如何使SQL查询在PHP中更具可读性?,php,mysql,readability,code-readability,Php,Mysql,Readability,Code Readability,当SQL查询中有长字段时,如何使其更具可读性 例如: public function findSomethingByFieldNameId($Id) { $sql = "SELECT field1, field2, field3 as Field3_Something, field4, field5, field6, field7, field8, field9 FROM table JOIN table2

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

您可以像这样将其连接起来,以使其更具可读性:

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

注意:在包含查询时,请确保在双引号之间开始新行之前不要忘记留下空格,否则会出现查询无效错误

我更喜欢Heredoc语法,尽管Nowdoc也适用于您的示例:

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');
    }
 $sql = "SELECT field1,
                field2,
                field3 as Field3_Something,
                field4,....
         FROM table
         JOIN table2 AS TNS ON TNS.id = table.id
         WHERE something = 1";
埃雷多克:

Nowdoc:

两者的优点是,您可以将直接SQL复制和粘贴到此块中,而无需转义或格式化它。如果您需要包含解析,比如您需要使用双引号字符串中的变量,那么您可以使用herdoc。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');
}
公共函数findSomethingByFieldNameId($Id){
$sql=
这只是另一种方式

请注意,数组连接比字符串连接快

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

就我个人而言,我认为
sprintf
是最好的方法,因为它的结构与一些SQL服务器接受的
prepared语句
非常相似

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

我尝试过使用
herdoc
方法,但是如果你使用的是对象而不仅仅是单个变量,那么事情会变得复杂。

你能在这里更具体一些吗?你在这里有一些可靠的建议-为什么不选择一个作为可接受的答案?当然,6个月后答案是有保证的。选择以下建议之一。你可以使用工具对于类似和,FWIW,Sublime Text 2将此语法识别为SQL而不是PHP字符串,并智能地切换语法高亮显示。非常好。我投票支持此语法-在某些方面,这正是herdoc/nowdoc语法的目的,给代码编辑器一个如何应用语法高亮显示的提示是一个不错的奖励。注意您的示例不起作用:结束标识符(SQL)前面不能有任何缩进。回答很好,但如果查询是在某种嵌套的if语句中,那么here doc终止符必须位于换行符的开头。我认为这看起来很奇怪。我喜欢Heredoc语法。注意Heredoc并将参数直接插入SQL语句中。您应该始终将语句和ata因为SQL注入。在PHP中连接SQL可能会导致分号放错位置。这看起来很难看-我更喜欢
sprintf
。在PHP中,可以在多行上连接空格。因此,在一行上打开双引号,在另一行结束它。无需编写$SQL.=多次。这样,它看起来很干净。