单引号中反斜杠仅转义自身和单引号,如''→、'''→';双引号中反斜杠解析转义序列(如 →换行)、变量及特殊字符,'\'才表示一个字面反斜杠。

PHP中单引号和双引号对反斜杠的处理差异
PHP里'
'和"
"根本不是一回事:单引号字符串里
就是字面量两个字符,双引号里才被解释为换行符。但真正容易翻车的是\——在双引号中写"C:\path\file.txt",实际只保留一个反斜杠;而单引号里'C:\path\file.txt'反而会原样保留两个。
常见错误现象:拼接Windows路径时路径崩掉、正则表达式preg_match('/a.b/', $str)漏掉转义导致匹配失败、JSON字段里"name":"O'Reilly"因没处理单引号直接输出乱码。
- 用单引号包裹含大量反斜杠的字符串(如正则模式、Windows路径),避免意外解析
- 双引号中需表示字面意义的
,必须写成\;要表示真实反斜杠再加一层,即\\才得一个 - 生成JSON或HTML属性值时,别靠手写
'或",优先走json_encode()或htmlspecialchars()
mysql_real_escape_string已被废弃,现在该用什么
mysql_real_escape_string()早在PHP 7.0就被移除,硬写会直接报Fatal error: Uncaught Error: Call to undefined function mysql_real_escape_string()。它的替代方案不是简单换成mysqli_real_escape_string(),而是应该彻底转向参数化查询。
使用场景:所有涉及用户输入拼进SQL的地方,比如$_GET['id']、$_POST['username']。
立即学习“PHP免费学习笔记(深入)”;
- 用
mysqli_prepare()+mysqli_stmt_bind_param(),变量自动隔离,不用手动转义 - 如果非得用字符串拼接(不推荐),
mysqli_real_escape_string($link, $str)仅对当前连接有效,且必须传入有效的$link资源,否则返回false -
addslashes()不能用于SQL防护——它不识别连接编码,对宽字节注入无效,纯属误导
htmlspecialchars()的flags参数选错会导致XSS漏洞
htmlspecialchars()默认只转义&、"、'、、<code>>,但如果你输出到HTML属性里又没加ENT_QUOTES,单引号就不转,攻击者就能闭合属性注入JS。
典型错误:写echo '<div data-id="'.htmlspecialchars($_GET['id']).'">';,当<code>id=1" onmouseover="alert(1)时,直接触发XSS。
- 输出到HTML文本内容,用
htmlspecialchars($str, ENT_QUOTES | ENT_HTML5, 'UTF-8') - 输出到HTML属性(尤其是
value、data-类),必须带ENT_QUOTES,否则单引号逃逸 - 不要依赖
htmlentities()——它会把中文也转成你,影响可读性和SEO - 模板引擎(如Twig、Blade)默认开启自动转义,但显式调用
{{ var|raw }}或{!! $var !!}会绕过,务必确认上下文
JSON中的特殊字符必须由json_encode()处理,别自己拼
很多人写'{"name":"'.str_replace('"', '"', $_POST['name']).'"}',以为能防注入,结果遇上、/、Unicode控制字符就崩溃,还可能被u2028(行分隔符)搞垮JS解析。
正确做法只有一条:json_encode()是唯一可信入口,它自动处理所有边界情况,包括嵌套数组、null、资源类型检测、编码验证。
- 永远传
JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES,避免中文变u4f60、URL里的/被转成/ - 若需嵌入JS变量,用
<script>var data = <?php echo json_encode($arr, JSON_UNESCAPED_UNICODE); ?>;</script>,别拼字符串 -
json_encode()返回false时,用json_last_error_msg()查原因,常见于资源类型、循环引用、非UTF-8字符串
最常被忽略的一点:json_encode()对float精度有默认限制(小数点后17位),如果做金融计算并直接塞进JSON,可能丢失精度;需要时得先格式化为字符串再编码。



















