Loading... # 背景 今天有个Easy-Send的用户发邮件给我,说他二开的时候写了一段代码,怎么都达不到预期的效果,让我帮忙看看,我一看,有意思了。帮完他后觉得有必要讲一讲单引号和双引号的区别了,这也算是小白容易踩坑的一个点。 # 讲解 我有个不是很好的习惯,就是平时写代码一般都是单引号和双引号混着用(除非特殊需要,比如写sql的时候),但其实两者在php里是有区别的。 我们先来看之前说的那个用户发来的出错的代码片段(无关部分用x代替了) ```php mysqli_query($db,'UPDATE `setting` SET `xxxx`="{$xxx}" WHERE `xx`="xx"'); ``` 我们很容易理解他的思路,他需要的应该是把setting表格中的指定行的xxxx列内容改为变量$xxx的值。而他问我的问题就是为什么代码没出错但是变更的值就是错的呢?其实问题就是出在引号上。 我帮他改的代码是 ```php mysqli_query($db,"UPDATE `setting` SET `xxxx`='{$xxx}' WHERE `xx`='xx'"); ``` 正常的运行了,很容易看出来,我不过是将单引号与双引号互换了一下而已,为什么就成功了呢? 首先我们先了解一下php中单引号和双引号的区别: 1.php会解析双引号中的变量,将其替换为指定变量的值,而单引号并不会进行变量的解析,只会直接按照原样输出。需要注意的一个点是如果要双引号进行变量的转义那么变量需要放在字符串的末尾或者用空格将变量与其他字符串隔开或者用{}将变量括起来 2.php中单引号只能转义(输出特殊字符)单引号和反斜杠(\)而双引号能转义更多字符(见下表) | 转义字符 | 意义 | ASCII码值(十进制) | | ---------- | ------------------------------------- | --------------------- | | \a | 响铃(BEL) | 007 | | \b | 退格(BS) ,将当前位置移到前一列 | 008 | | \f | 换页(FF),将当前位置移到下页开头 | 012 | | \n | 换行(LF) ,将当前位置移到下一行开头 | 010 | | \r | 回车(CR) ,将当前位置移到本行开头 | 013 | | \t | 水平制表(HT) (跳到下一个TAB位置) | 009 | | \v | 垂直制表(VT) | 011 | | \\ | 代表一个反斜线字符''\' | 092 | | \' | 代表一个单引号(撇号)字符 | 039 | | \" | 代表一个双引号字符 | 034 | | \? | 代表一个问号 | 063 | | \0 | 空字符(NULL) | 000 | | \ddd | 1到3位八进制数所代表的任意字符 | 三位八进制 | | \xhh | 1到2位十六进制所代表的任意字符 | 二位十六进制 | 3.php中单引号的解析速度比双引号更快,因为其不需要解析变量、进行过多的字符转义。所以一般而言,为了提高运行速度,应该尽量使用单引号而非双引号 了解了这些,也就很容易看懂为什么上面的代码修改后就能正确运行。 Last modification:November 26, 2022 © Allow specification reprint Support Appreciate the author AliPayWeChat Like 如果觉得我的文章对你有用,请随意赞赏