PHP 引用 SQL

PHP quotes in SQL

为什么这段代码会产生错误

  $sql = "INSERT INTO accountlist VALUES (\"\", \"$user\", \"$pwd\", \"$mail\", \"$date\")";

而这个没有?

  $sql = "INSERT INTO accountlist VALUES ('', '$user', '$pwd', '$mail', '$date')";

我知道双引号是过程变量而单引号不是,所以第一个选项应该是正确的,但事实恰恰相反!

因为第一个忘记拼接了,导致出错。但是等等....

...您应该始终 使用准备好的语句,这样您永远不会 再次担心查询中的引号!

在第二个查询中,PHP 将在单引号中插入变量,因为整个查询都被双引号包围。

Little Bobby says your script is at risk for SQL Injection Attacks.. Even escaping the string不安全!

他们所说的是绝对物有所值的……而且也容易得多!

您的查询变为:

INSERT INTO accountlist VALUES ("", ?, ?, ?, ?)

? 符号(注意,没有用引号引起来)是 参数。

现在,每次执行查询时,您都会提供一个包含四个值的 数组,以便在语句中从左到右替换。这些值可以是任何值,您不必关心引号等,因为 它们不是 SQL 的一部分。 相反,参数是 输入.

如果你必须"a whole lot of this,"说几千或几百万次,你只准备语句一次,然后根据需要多次执行准备好的语句,每次都提供不同的值数组作为输入。

还有很多库可以让您按名称指定参数,给出命名值的哈希值,例如

INSERT INTO accountlist VALUES ("", :user:, :pwd:, :mail:, :date:)

{ 'user' => 'fred', 'pwd' => 'secret', 'mail' => 'foo@bar.com', 'date' => today() }

... 库将其转换为有效的 SQL 语句,如上所示。

更安全,更少头痛,效率也明显提高。

回答您的问题而不是继续讨论查询参数...

https://www.php.net/manual/en/language.types.string.php 解释了在带引号的字符串中使用引号字符的机制。

基本上,如果您的 PHP 字符串由 " 分隔,那么下一个 " 字符就是字符串的结尾。

但是您可能希望在字符串中使用文字双引号字符,而不是结束字符串。为此,您可以像这样在它前面加上一个反斜杠:

$sql = "INSERT INTO accountlist VALUES (\"\", \"$user\", \"$pwd\", \"$mail\", \"$date\")";

那么反斜杠双引号字符成为字符串内容的一部分,而不是字符串结尾的分隔符。

但是双引号字符串中的单引号字符不会造成同样的歧义,因此不需要反斜杠。因此以下工作没有错误:

$sql = "INSERT INTO accountlist VALUES ('', '$user', '$pwd', '$mail', '$date')";

解析器可以判断单引号不是它正在寻找的结束双引号字符串的字符。所以那些单引号被解析为文字字符。

这在许多其他编程语言中的工作方式相同, 如 Java、C、C++、Ruby、Python、Perl ,甚至在 SQL 本身。

这就是为什么有些人可能对您提出这个问题感到不耐烦。这是一个非常初级的问题,表明您对编程语言的阅读还不够,并且您希望社区为您提供个性化的概念辅导。