Php 将查询和结果分开的原因?

Php 将查询和结果分开的原因?,php,mysql,mysqli,Php,Mysql,Mysqli,在编写代码时,除了可读性之外,还有什么理由要将查询和结果分开吗 单独示例: $query = "SELECT * FROM foo ORDER BY foo2 DESC LIMIT 10"; $result = mysqli_query($dbconnect,$query); 与单线相比: $result = mysqli_query($dbconnect,"SELECT * FROM foo ORDER BY foo2 DESC LIMIT 10"); 我通常使用第一个例子,但最近我发现

在编写代码时,除了可读性之外,还有什么理由要将查询和结果分开吗

单独示例:

$query = "SELECT * FROM foo ORDER BY foo2 DESC LIMIT 10";
$result = mysqli_query($dbconnect,$query);
与单线相比:

$result = mysqli_query($dbconnect,"SELECT * FROM foo ORDER BY foo2 DESC LIMIT 10"); 

我通常使用第一个例子,但最近我发现自己越来越多地使用第二个单行例子,因为它写起来更快更容易,所以我想在它成为第二天性之前问一下,然后发现它真的很糟糕,可能会炸毁世界或其他东西。这更像是一种偏好,但可读性无疑是一个强有力的理由。然而,我还认为,查询的可伸缩性和可维护性也可能是一个合适的参数。假设您有一个复杂的查询,其中多个变量正在被清理,以便使用连接进行SQL注入。换句话说,长查询:

$result = mysqli_query($dbconnect,"SELECT * FROM foo, bar Where col1.bar = (Select col1 From someTable where {$varibale} = ...) Group By ... ORDER BY foo2 DESC LIMIT 10");

将所有这些都塞进函数中会使读取和维护变得困难

来回答这个问题。做你想做的(或差不多)

就像我说的,第一种方式可能是因为历史原因,我们被限制在80个字符以内。但是这种限制已经不存在了(我们有更大的屏幕)。顺便说一句,我不会告诉你每行写300个字符


使用您觉得更可读/更易于维护的工具。唯一的缺点就是你的同事。它们可以指定您必须使用的源代码。

实际上,您可以在一行中编写整个源代码

(最小化源=删除所有空格和换行符)

当然不是字符串:)

效果是:(1个为正,3个为负)

  • 可读性差(-)
  • 更快的解析(+)
  • 慢速编辑源(-)
  • 没有良好的可维护性(-)
不是每一行都写

效果是:(3个为正,1个为负)

  • 良好的可读性(+)
  • 解析速度稍慢(-)
  • 快速编辑源代码(+)
  • 更好的可维护性(+)
(估计您只会在非常大的代码文件中感受到parsingtime差异)

这就是我决定写我的源代码的方式


有时(例如插件),我使用最小化版本。

我认为这也是一种偏好。我通常使用short-way来表示简短且“不变”的请求

但是对于较长的请求,单独读取和维护更容易

特别是对于“动态请求”(部分取决于外部条件):有时处理字符串更容易,例如,根据条件连接
where
子句,或其他子句,或根本不连接任何子句。
我想到的一个例子是:“list.php”脚本,如果不使用参数调用,则显示所有文章;如果使用get参数
?cat=foo
调用,则过滤特定类别“foo”的文章。 我个人觉得这样更容易阅读和维护:

$query="select name, description, price from articles";
if(isset($_GET['cat'])) $query.=" where cat={$_GET['cat']}";
$result = mysqli_query($dbconnect,$query);
当然,也可以使用三元
(?:)
运算符在单行版本中直接执行,但可读性会受到一些影响:

$result = mysqli_query($dbconnect,"select name, description, price from articles".(isset($_GET['cat'])?" where cat={$_GET['cat']}":""));
如果您添加其他条件,它实际上会变得更加不可读和不可维护。例如,获取参数“supplier=bar”上的第二个过滤器

[编辑:]我刚刚遇到过这样的情况:当您的请求失败时,当查询以字符串形式出现时,更容易调试。
echo$query;
可以让您准确地看到要发送到DB服务器的内容……
在下面的php代码中:
$query=“select*from$userTable,其中id=:uid”
,您可能会看到,
$userTable
没有定义…

但是在执行
echo$query;
之后,您无法检查此处是否缺少某些内容:
$query=“select*from where id=:uid";..

对我来说,这都是关于可读性的。我写了大量的代码。并发布应用程序。6个月后,当我回去修复一个bug时,我需要快速找到一些东西。我尽可能多地分开。除非您正在编写难以置信的大量代码,否则解析时间非常短。对我来说,这都是关于可读性的。我更进一步,使它尽可能漂亮

 $select = "SELECT x,y,z";
 $from = " FROM foo,bar,table3";
 $order = " ORDER BY foo2 DESC ";
 $limit = " LIMIT 10";
 $query = $select . $from . $order . $limit;

 $result = mysqli_query($dbconnect,$query);

这是一种“各自为政”的方式。Poh-tay-toe,Poh-tah-toe。可读性似乎很好。另外,请参阅准备好的语句。对于第一个语句,可能是由于每行字符数的旧限制。但这不再是一个好理由;您需要准备语句,然后使用绑定变量执行