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 本身。
这就是为什么有些人可能对您提出这个问题感到不耐烦。这是一个非常初级的问题,表明您对编程语言的阅读还不够,并且您希望社区为您提供个性化的概念辅导。
为什么这段代码会产生错误
$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 本身。
这就是为什么有些人可能对您提出这个问题感到不耐烦。这是一个非常初级的问题,表明您对编程语言的阅读还不够,并且您希望社区为您提供个性化的概念辅导。