在php中编写sql语句的最佳实践

时间:2010-06-15 20:56:58

标签: php mysql

有人可以指向我的资源,或者向我展示一个在php中编写sql语句的好方法的例子。

大多数陈述看起来都很丑陋且不可读。

9 个答案:

答案 0 :(得分:6)

  1. 使用prepared statements
  2. 随意格式化您的代码
  3. 代码示例:

    $stmt = $pdo->prepare('
        SELECT ...
        FROM   ...
        JOIN   ...
        JOIN   ...
        WHERE  ... AND abc = :abc AND def = :def
    ');
    
    $stmt->execute(array(
        'abc' => 'abc value',
        'def' => 'def value'
    ));
    

答案 1 :(得分:1)

避免使用SELECT *

使用ENUM而不是VARCHAR

准备好的陈述(PHP的PDO http://www.php.net/manual/en/intro.pdo.php

答案 2 :(得分:1)

http://en.wikibooks.org/wiki/Programming:PHP:SQL_Injection

请参阅底部的参数化语句部分。

答案 3 :(得分:1)

考虑prepared statements

$stmt = $db->prepare("SELECT col1, col2, col3 FROM tbl WHERE col1 = ? AND col2 = ?");
$stmt->bindParam(1, $col1);
$stmt->bindParam(2, $col2);

或使用sprintf()

$sql = sprintf("SELECT col1, col2, col3 FROM tbl WHERE col1='%s' AND col2='%s'",
    mysql_real_escape_string($col1),
    mysql_real_escape_string($col2)
);

无论哪种方式,你最终会得到一个更加可读的大型非连接SQL字符串。

答案 4 :(得分:1)

我使用MySQL客户端来处理我的查询(SQLWave)。非常方便的工具,它允许您进行查询并将它们保存为SQL,它将输出如下文件:

/*
get-all-tags.sql

get all tags from t.tags, combine info with t.taglink to 
2012-12-18: updated blabla

*/
select tags.*,group_concat(subid) as subs from t.tags

    join t.taglink on taglink.id=tags.id

group by id
order by category,tag,subid

这是我喜欢的布局,但您当然可以使用自己的偏好。然后可以在您的代码中插入查询,如下所示:

mysql_query(file_get_contents("sql/get-all-tags.sql"));

等。您还可以通过使用您可能需要的值替换字符串来动态更改文件'get-all-tags'的内容。

注意!! 我不是说这很快。这是很多不必要的开销。但是如果你想要保持你的PHP代码清洁和清晰的唯一目的,这是一个非常好的选择。

为了获得更好的性能,您可以通过在上传内容之前将“file_get_contents(”sql / get-all-tags.sql“替换为该文件的实际内容)将您的PHP代码”编译“为您发布的代码。

所以,再次,这不是快速代码,但非常易读!

当然,您可以将相同的格式直接放入PHP代码中,而无需从客户端程序中复制它:

<?
    $result=mysql_query("
       select tags.*,group_concat(subid) as subs from t.tags
          join t.taglink on taglink.id=tags.id
       group by id
       order by category,tag,subid
    ");
?>

没有开销,没有访问文件,所以它(相对)快

答案 5 :(得分:0)

这篇博客文章是一个很好的方法。

http://www.communitymx.com/content/article.cfm?page=1&cid=A5B54EAAE1BC138F

就个人而言,我不包括空的换行符。

答案 6 :(得分:0)

我个人喜欢将mySQL分开:

SELECT * FROM `table` a
INNER JOIN `table2` b
ON a.`id`=b.`id`
WHERE b.`colour` = "frink"

所以我喜欢将单独的命令放在新行上,以便于阅读。

答案 7 :(得分:0)

PHP Security Guide: SQL Injection。这本书Essential PHP Security也是一本快速,易于理解的读物。

答案 8 :(得分:0)

SQL,IMO,由于与其他代码层的紧密耦合,通常看起来很丑陋且难以理解。复杂的SQL查询通常需要有条件地构建,当你开始在SQL查询之间抛出HTML时,除了业务逻辑之外,结果是不可读的代码。

考虑使用DAL(数据访问层)或更正式地使用表数据网关或仅使用SQL网关。它将提供令人难以置信的优势:

  1. 提取SQL代码,使得更容易切换/移植到另一个RDBMS
  2. 将SQL代码与业务逻辑和模板等隔离开来,使代码更具可读性。
  3. 干杯, 亚历