猿问

SQL 中的 PHP 报价

为什么此代码会产生错误

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

而这个没有?

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

我知道双引号处理变量,而单引号则不然,所以第一个选项应该是正确的,但它恰恰相反!


Qyouu
浏览 140回答 3
3回答

烙印99

因为在第一个中,您忘记连接,从而导致错误。但是等等...。....您应该始终使用准备好的语句,这样您就不必再担心查询中的引号了!在第二个查询中,PHP 将用单引号插入变量,因为整个查询被双引号包围。小鲍比说你的脚本有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本身中。这就是为什么有些人可能听起来不耐烦你问这个问题。这是一个非常初级的问题,表明你对编程语言的阅读还不够,你希望社区能为你提供个性化的辅导,让你了解你应该自己掌握的概念。

一只名叫tom的猫

他们说的是死在钱上...而且也相当容易!您的查询变为:INSERT INTO accountlist VALUES ("", ?, ?, ?, ?)交易品种(请注意,它们没有括在引号中)是参数。?现在,每次执行查询时,您都会提供一个数组,其中包含四个值,以便在语句中从左到右替换。这些值可以是任何东西,你不必关心引号等,因为它们不是SQL的一部分。相反,参数是输入。如果你必须做“很多这样的”,比如几千或几百万次,你只准备一次语句,然后根据需要多次执行准备好的语句,每次提供不同的值数组作为输入。还有很多库可以让你按名称指定参数,给出命名值的哈希值,例如INSERT INTO accountlist VALUES ("", :user:, :pwd:, :mail:, :date:) { 'user' => 'fred', 'pwd' => 'secret', 'mail' => 'foo@bar.com', 'date' => today() }...并且该库会将其转换为有效的 SQL 语句,如上所示。更安全,更少头痛,并且明显更有效率。
随时随地看视频慕课网APP
我要回答