PHP 字符串在没有“点”运算符的情况下连接


PHP string concat without the "dot" operator

我正在努力将插件集成到 PHP Web 应用程序中,其中一行代码让我感到困惑:

$sql = "update inventory set qtyleft='$qtyleft',price='$price',sales=sales+'$sales',qtysold=qtysold+'$qtysold' where id='$id'";
mysql_query($sql);

其中$qtyleft、$price、$sales、$qtysold和$id都是变量。

我对 PHP 不是很熟悉,但我一直认为 PHP 中的字符串连接是通过使用 . 运算符,在我看来,上面的代码只是一个长字符串,而实际上并没有将这些变量放入 SQL 查询。是这样吗?

在PHP中,双引号(")分隔的字符串将计算其中的变量。

$foo = 42;
echo "The answer for everything is $foo"; // The answer for everything is 42

这个特定示例非常糟糕,因为您不应该直接在 SQL 查询中包含变量,也不应该在新代码中使用mysql_query

查看更多:

  • 为什么我不应该在 PHP 中使用 mysql_* 函数?
  • 如何防止 PHP 中的 SQL 注入?

请参阅字符串手册页的变量解析部分。

当用双引号或 heredoc 指定字符串时,将在其中解析变量。

如果对字符串使用单引号,则不会对变量进行插值。如果您使用双引号,它们将是。

你提到的代码可以在PHP中工作,没有任何问题。有关更多详细信息,请参阅 PHP 手册。

您可能需要向前看的另一个问题是mysql_query折旧的函数。请参考这里。这给我一种感觉,您要使用的插件没有得到正确维护。还有一个问题是,在SQL查询中直接传递变量对可能存在的安全问题不是一个好的做法

有人称之为"变量插值"。在有关字符串的手册页的变量解析部分对此进行了说明。它有助于阅读整个页面以及用户评论。

基本思想是,对于括在引号(")和heredoc块中的字符串,PHP在需要使用字符串时搜索字符串中的变量,并在执行时用它们的值替换它们。这意味着同一字符串可以在脚本执行的不同时刻呈现为不同的值。

这只是语法糖,它不会改变代码的行为方式,任何包含变量的字符串都可以使用字符串连接运算符 (.) 重写。通常,此语法生成较短的源代码。有时代码更容易以这种方式阅读,有时则更难,因为复杂的表达式(数组访问,例如)需要括在字符串内的大括号({})中。