繁体   English   中英

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

[英]How to make SQL query more readable in PHP?

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

我更喜欢 Heredoc 语法,尽管 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 直接复制并粘贴到此块中,而无需对其进行转义或格式化。 如果您需要包含解析,例如处理双引号字符串中的变量,则可以使用 Heredoc。 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');
}

您可以像这样连接它以使其更具可读性:

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

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

我使用免费工具@ 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');
}
?>
 $sql = "SELECT field1,
                field2,
                field3 as Field3_Something,
                field4,....
         FROM table
         JOIN table2 AS TNS ON TNS.id = table.id
         WHERE something = 1";

这只是另一种方式。

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

$sql = join(" \n", Array(
    'SELECT ',
    '    [...fields...]',
    '    [...more fields...]',
    'FROM table',
    'JOIN table2 AS TNS ON TNS.id = table.id',
    'WHERE something = 1',
));
<?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');
}
?>

就个人而言,我认为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方法,但如果您使用对象而不仅仅是单个变量,它会使事情复杂化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM