在PHP中单引号和双引号并非是互通的,具体区别如下:
” ” 双引号里面的字段会经过编译器解释,然后再当作HTML代码输出。
‘ ‘ 单引号里面的不进行解释,直接输出。
从字面意思上就可以看出,单引号比双引号要快了。
例如:
$abc=’my name is tome’;
echo $abc //结果是:my name is tom
echo ‘$abc’ //结果是:$abc
echo “$abc” //结果是:my name is tom
在SQL语句中
这是会经常遇到的问题,在插入数据库的SQL语句是采用单引号来定义字符串,如果要将一个含有单引号的字符串插入数据库,这个SQL语句就会出错。
如:$sql="insert into userinfo (username,password) Values('O'Kefee','123456')"
此时,处理的方法之一是在SQL语句中加入转义符反斜线,
即:……Values('O'Kefee',……
当然也可以使用函数 addslashes(),该函数的功能就是加入转义符,
即:$s = addslashes("O'Kefee") ……Values('".$s."',……
还有一种方法是设置php.ini中的magic-quotes选项,打开该选项,则通过表单提交的信息中如果有单引号是,将会自动加上如转义符。因此不用使用其他函数了。
补充: 这就要从双引号和单引号的作用讲起: 双引号里面的字段会经过编译器解释然后再当作HTML代码输出,但是单引号里面的不需要解释,直接输出。
$val ='a';
sql =" select * from table where name like '%$val%'"; //将自动替换里面的$val,但如果要用单引号来组织语句则表示为:
sql =' select * from table where name like '%'.$val.'%''; //麻烦很多
但用单引号代替双引号来包含字符串,这样做会更快一些,因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会。
假设查询条件中使用的是常量,例如:
select * from abc_table where user_name=’abc’;
SQL语句可以写成:
SQLstr = “select * from abc_table where user _name= ‘abc’” ;
假设查询条件中使用的是变量,例如:
$user_name = $_REQUEST['user_name']; //字符串变量
或
$user=array (”name”=> $_REQUEST['user_name‘,"age"=>$_REQUEST['age'];//数组变量
SQL语句就可以写成:
SQLstr = “select * from abc_table where user_name = ‘ ” . $user_name . ” ‘ “;
SQLstr = “select * from abc_table where user_name = ‘ ” . $user["name"] . ” ‘ “;
对比一下:
SQLstr=”select * from abc_table where user_name = ‘ abc ‘ ” ;
SQLstr=”select * from abc_table where user_name =’ ” . $user _name . ” ‘ “;
SQLstr=”select * from abc_table where user_name =’ ” . $user["name"] . ” ‘ “;
SQLstr可以分解为以下3个部分:
1:”select * from table where user_name = ‘ ” //固定SQL语句
2:$user //变量
3:” ‘ ”
1,2,3部分字符串之间用”.” 来连接
PHP效率计:从引号开始(单引号、双引号效率区别)
实验一:在普通情况下的效率
我们的实验是5000次执行10000个字节的文件,获得解析过程中的速度。
首先,本实验特别规定一个单位,这是为了更好地表示以及排除计算机本身效率的差异。
时间单位 TT,表示约 7.2×10[sup]-8[/sup]s 。
我们获得四组实验数据,可理解为表示 'a' 比 "a" 快的时间:
0.29 TT,大概0.0000000206s
0.46 TT,大概0.0000000328s
0.38 TT,大概0.0000000275s
0.41 TT,大概0.0000000292s
平均值:0.39 TT ('aaaa....(139个)' 的效率接近于 "aaa...(100个)" )
结论:在数据量相同,并且在普通情况下(不借助转义),使用单引号速度更快。
实验二:单引号转义的效率
我们的实验是5000次分别以「单引号、双引号」执行两份数据相同,但其中一份特别用'表示单引号。
时间单位 TT,表示约 7.2×10[sup]-8[/sup]s 。
我们获得四组实验数据,可理解为表示 " ' " 比 ' ' ' 快的时间:
0.19 TT,大概0.0000000138s
0.15 TT,大概0.0000000110s
0.23 TT,大概0.0000000162s
0.24 TT,大概0.0000000173s
平均值:0.2 TT (” ''''...(12个) " 的效率接近于 ' ''...(10个)" )
结论:如果字符串中需要表示单引号(MySQL查询),应尽可能避免转义,所以应使用双引号。
实验三:花括号的效率
我们的实验是1000次执行含有数量一定的变量标记的文件,获得解析过程中的速度。
时间单位 TT,表示约 1.581×10[sup]-7[/sup]s~1.666×10[sup]-7[/sup]s 。(TT 变化)
得到三组数据,表示 "{$abc}" 比 "$abc" 快。
15.3 TT,大概0.0000024186s
14.5 TT,大概0.0000024093s
15.3 TT,大概0.0000024152s
这数据是十分惊人的,平均结果 15 TT。
这意味着:使用花括号的解析速度,大约是不使用花括号的16倍。
结论:在双引号中表示变量,尽可能使用花括号。
实验四:连续与非连续的效率
我们的实验是1000次执行含有数量一定的变量标记的文件,获得解析过程中的速度。
时间单位 TT,表示约 1.581×10[sup]-7[/sup]s~1.666×10[sup]-7[/sup]s 。(TT 变化)
第一组实验数据,表示 "{$abc}{$abc}{$abc}..." 比 $abc.$abc.$abc 平均每个变量解析快
22.45 TT,大概0.0000035498s
21.03 TT,大概0.0000035037s
22.12 TT,大概0.0000034930s
花括号(连续)比单引号(非连续)快的时间,平均结果 22 TT。
这意味着:使用花括号的解析速度,大约是使用不连续的单引号的23倍。
结论:在单引号中表示多个变量(或数据总量少),尽可能换用双引用,并使用花括号。
第二组实验数据,表示 "...$abc$abc$abc..." 比 ‘...’.$abc.$abc.$abc.'...' 平均每个变量解析快
7.15 TT,大概0.0000011311s
6.57 TT,大概0.0000010943s
6.83 TT,大概0.0000010777s
双引号(连续)比单引号(非连续)快的时间,平均结果 7 TT。(该数据变化)
这意味着:变量多时,使用双引号(不使用花括号)的解析速度,大约是使用不连续的单引号的8倍。
结论:在双引号中表示多个变量(或数据总量少),比使用单引号而需要用「连接运算符」要快。
结论:表示多个变量时(或数据总量少),应可能范围内使用双引号,并使用花括号。
(附:作者推测,这可能和内存空间的分配有关系,连续符可能会使内存不断调整)
最终结论:
首先,表示简单的数据时(不需要转义),尽量用单引号。
'Cal: Are you good at long jump?'
但如果因为使用单引号,而需要进行转义(即包含单引号),考虑使用双引号。
'Cal: Yes. But, you know, it's written.' => "Cal: Yes. But, you know, it's written."
如果需要表示变量,应尽量使用花括号。
"Cal: $to" => "Cal: {$to}, you shouldn't go shopping."
尽量使其连续:
'Cal: '.$calsaid => "Cal: $calsaid" => "Cal: {$calsaid}"