有人可以指向我的资源,或者向我展示一个在php中编写sql语句的好方法的例子。
大多数陈述看起来都很丑陋且不可读。
答案 0 :(得分:6)
代码示例:
$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)
答案 2 :(得分:1)
http://en.wikibooks.org/wiki/Programming:PHP:SQL_Injection
请参阅底部的参数化语句部分。
答案 3 :(得分:1)
$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网关。它将提供令人难以置信的优势:
干杯, 亚历