3 回答
TA贡献1829条经验 获得超13个赞
因为在第一个中,您忘记连接,从而导致错误。但是等等...。
....您应该始终使用准备好的语句,这样您就不必再担心查询中的引号了!
在第二个查询中,PHP 将用单引号插入变量,因为整个查询被双引号包围。
小鲍比说你的脚本有SQL注入攻击的风险。即使逃避绳子也是不安全的!
TA贡献2011条经验 获得超2个赞
要回答您的问题,而不是继续纠缠于查询参数...
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本身中。
这就是为什么有些人可能听起来不耐烦你问这个问题。这是一个非常初级的问题,表明你对编程语言的阅读还不够,你希望社区能为你提供个性化的辅导,让你了解你应该自己掌握的概念。
TA贡献1906条经验 获得超3个赞
他们说的是死在钱上...而且也相当容易!
您的查询变为:
INSERT INTO accountlist VALUES ("", ?, ?, ?, ?)
交易品种(请注意,它们没有括在引号中)是参数。?
现在,每次执行查询时,您都会提供一个数组,其中包含四个值,以便在语句中从左到右替换。这些值可以是任何东西,你不必关心引号等,因为它们不是SQL的一部分。相反,参数是输入。
如果你必须做“很多这样的”,比如几千或几百万次,你只准备一次语句,然后根据需要多次执行准备好的语句,每次提供不同的值数组作为输入。
还有很多库可以让你按名称指定参数,给出命名值的哈希值,例如
INSERT INTO accountlist VALUES ("", :user:, :pwd:, :mail:, :date:) { 'user' => 'fred', 'pwd' => 'secret', 'mail' => 'foo@bar.com', 'date' => today() }
...并且该库会将其转换为有效的 SQL 语句,如上所示。
更安全,更少头痛,并且明显更有效率。
- 3 回答
- 0 关注
- 139 浏览
添加回答
举报