更新简单点

结论一、

1、引号定义的字符串里如果还有引号,是当成普通字符来处理的

例1:

双引号定义的字符串里有被单引号包围的变量(单引号会‘阻断’双引号对变量的解析?不会,单引号被当成普通的字符串处理,不是php定义字符串的语法)

$fruit = ' apple ' ;
$string = " i like '{$fruit}' " ;
echo $string ;

2、单引号定义的字符串里有被双引号包围的变量(双引号会解析变量?不会,双引号被当成普通的字符串处理,不是php定义字符串的语法)

例2:

$fruit = ' apple ' ;
$string = ' i like "{$fruit}" ' ;
echo $string ;

结论二、

1、字符串在合并的时候,如果引号的‘身份’相同或者功能重复(都是php定义字符串的语法),只保留一对,‘身份’不同则不会影响。

例1:

两个字符串合并输出时,最后只会保留一对引号(同为php定义字符串的语法,最后只会保留一对)

$h = ' hello ' ;
$w = “ world ” ;
echo $h . $w ;

例2:

引号的‘身份’是普通字符,合并时不会受到影响(例如合并字符串时,被当作普通字符的引号不会受php定义字符串的引号重复合并的影响)

$str = ' I bought an "apple" ' ;
$str1 = ' yesterday ' ;
echo $str . $str1 ;

看回问题

正确的sql语句语法:

" insert into tbname(field1 , field2 ……) values(' value1 ' , ' value2 ' ……) " ;

问题一:为什么要加引号?

如果变量外不加引号:

例子:

$name = ' mark ' ;
$sex = ' male ' ;
" insert into person(name , sex) values( {$name} , {$sex} ) " ;

根据结论二,双引号解析变量,3个字符串合并,同为字符串定义的引号只会保留一对,结果是(echo输出看一下)

" insert into person(name , sex) values(mark , male) " ;

和正确的sql语句规范对比一下就错了

而如果变量外加了引号:

例子:

$name = ' mark ' ;
$sex = ' male ' ;
" insert into person(name , sex) values( '{$name}' , '{$sex}' ) " ;

根据结论一和二,双引号解析变量,3个字符串合并,单引号是普通字符保留,字符串定义的引号也只保留一对,结果是(echo输出看一下)

" insert into person(name , sex) values('mark' , 'male') " ;

和正确的sql语句规范对比一下没错了

问题二:为什么在变量外加的是单引号,不是双引号,或者用转义等等?

因为要解析变量,就要外双内单,看结论一中的例1,反过来外单内双就解析不了,看结论一中的例2。

—————————————————————————————————————

原回答:

初学php刚好碰到这两个问题,不知道算不算晚,弱弱的发表下看法

为什么变量被单引号包围了还能被解析?

结论:

引号定义的字符串内如果还有引号,那么字符串内的引号是被当成普通字符的,而不再是php语言的语法—即不再是定义字符串的“身份”了,那么肯定也不具备什么能不能解析变量的功能了吧。

验证:

用双引号定义的字符串里有被单引号包围的变量,输出看能否被解析,答案是可以被解析(此时双引号里的单引号就是普通字符,不具备php语言中单引号怎么怎么样的功能,当然也就不能“阻断“双引号解析变量了)。

用单引号定义的字符串里有被双引号包围的变量,上面的结论正确的话,那这个被双引号包围的变量是解析不出来的(单引号里的双引号也已经是普通字符串,没有php语言中双引号能解析变量的功能)。

$string = 'apple';
$string1 = "i like '{$string}'";
$string2 = 'i like "{$string}"';
echo $string1;
echo '
';echo $string2;

为什么变量已经定义为字符串类型了,使用insert操作写sql语句的时候,还是要给sql语句中的插入值(已经用变量表示了)加上引号?--为什么要给变量加引号?

感觉本质上和上面说的还是一样的,就是引号此时的“身份”。

我理解为身份相同就被“同化”了,比如都是php语言中定义字符串的语法

首先最后要执行的正确的sql语句应该是:

"insert into tbname(field1 , field2 ......) values('value1' , value2)";

举例:

$fruit = ' apple ' ;
$string = " I like $fruit " ;
echo $sting ;

结果会是”I like apple”,其实这个存在能不能解析的问题(外单内双时),不够直观,下面insert操作也要解析变量,所以也会外面用双引号,里面用单引号,反过来就不能解析了,不能解析就看不出被“同化了”。

看这个

$a = ‘hello’;
$b = ‘world’;
echo $a.$b;

结果会是‘helloworld’,是不是两个字符串类型的变量(4个引号)结合起来最后转换成一个“新”的字符串(2个引号),字符串只要一对引号,多余的就被“同化”了。

回过来看你的问题,sql语句有它自己的格式(插入值如果是字符串类型加引号),你定义的变量虽然是字符串了,但是变量和那句insert语句结合起来成一条语句时,php中的变量的引号已经被“同化“了,放到数据库查询时已经没有引号了

$name = 'mark' ;
$sex = 'male' ;
mysql_query("insert into XXX(name , sex) values({$name} , {$sex})");

如果使用上面的语句,两个变量的定义和mysql_query中的引号的“身份”都属于php语言的语法,而不是普通字符串,所以最后合并后会“同化”成 "insert into XXX(name , sex) values(mark , male)";

而正确的sql语句应该是 "insert into XXX(name , sex) values('mark' , 'male')"; 才能执行成功。

给 mysql_query("insert into XXX(name , sex) values({$name} , {$sex})"); 中两个变量都加单引号(因为变量要被解析,所以要外双内单,也回答了问题问的为什么要用单引号的原理,而不是双引号等等)变成 mysql_query("insert into XXX(name , sex) values('{$name}' , '{$sex}')");上面说了引号里面还有引号的话是被当成普通字符串处理的,所以合并时会保留不会被“同化”,最后合并成一条字符串语句且双引号解析变量后,把里面的单引号当成普通字符串处理保留起来,就变成 mysql_query("insert into XXX(name , sex) values('mark' , 'male')"); 符合正确的sql规范就可以执行了,如果要拆开使用字符串连接符类似 ') values(' . "$name" . ',' . $sex 这样的也要注意会不会被“同化”,看最后合并成一条字符串语句后sql语句插入值的引号还在不。