Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL中的PHP引号_Php_Mysql_Sql_Quotes - Fatal编程技术网

SQL中的PHP引号

SQL中的PHP引号,php,mysql,sql,quotes,Php,Mysql,Sql,Quotes,为什么这段代码会产生错误 $sql = "INSERT INTO accountlist VALUES (\"\", \"$user\", \"$pwd\", \"$mail\", \"$date\")"; 这个没有 $sql = "INSERT INTO accountlist VALUES ('', '$user', '$pwd', '$mail', '

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

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

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

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

因为在第一个中,您忘记了连接,导致了错误。但是等等

…您应该始终使用预先准备好的语句,这样您就再也不用担心查询中的引号了

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


。即使是这样也不安全

他们说的都是钱。。。而且相当容易

您的查询变成:

INSERT INTO accountlist VALUES ("", ?, ?, ?, ?)
符号(注意,这些符号没有括在引号中)是参数

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

如果您必须执行“大量”操作,比如数千次或数百万次,只需准备一次语句,然后根据需要多次执行准备好的语句,每次提供不同的值数组作为输入

还有很多库允许您按名称指定参数,给出命名值的散列,例如

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

{ 'user' => 'fred', 'pwd' => 'secret', 'mail' => 'foo@bar.com', 'date' => today() }
。。。库将其转换为有效的SQL语句,如上图所示


更安全、更省事、更高效。

要回答您的问题,而不是在查询参数上走弯路

解释在带引号的字符串中使用引号字符的机制

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

但您可能希望在字符串中使用文字双引号字符,但不希望结束字符串。要执行此操作,您可以在其前面加一个反斜杠,如下所示:

$sql = "INSERT INTO accountlist VALUES (\"\", \"$user\", \"$pwd\", \"$mail\", \"$date\")";
然后,反斜杠双引号字符成为字符串内容的一部分,而不是字符串结尾的分隔符

但是双引号字符串中的单引号字符不会导致相同的歧义,因此它们不需要反斜杠。因此,以下操作无误:

$sql = "INSERT INTO accountlist VALUES ('', '$user', '$pwd', '$mail', '$date')";
解析器可以判断单引号不是它要用来结束双引号字符串的字符。因此,这些单引号被解析为文字字符

<强> C++在许多其他编程语言中也有同样的用法,类似java、c、C++、露比、python、perl,甚至在SQL本身中。


这就是为什么有些人可能听上去不耐烦你问这个问题。这是一个非常初级的问题,表明您对编程语言的阅读还不够,您希望社区为您提供个性化的概念指导,您应该自己学习。

因为在第一个问题中,您忘记了连接。但是等等。。。。。。。。说。即使是这样也不安全!所以您应该始终使用准备好的语句,这样您就再也不用担心查询中的引号了
mysqli\u escape\u string()
不会阻止SQL注入。这是有办法的。@JayBlanchard不幸的是,由于我们的慈善事业,我们现在必须涉过像这样的问题浪潮,以及那些询问如何在css中垂直居中div的问题。此外,这是我第一次接触服务器端世界(我现在有点迷失方向)我第一次以这种方式运行命令,所以这里我为什么提出这样的问题,谢谢你的回答,现在更清楚了@即使在C++中,你也需要匹配一个开头<代码>“/CUT>结尾的代码> <代码> @ SalamanA没有单单和双闭,你甚至不可能面对另一个引用中的引用问题,在C++中,我从来没有遇到过像运行另一种语言的命令那样的东西。(我甚至不知道你是否能做那样的事)@Temp,这里有一些阅读材料给你: