php.ini配置文件,get_magic_quotes_gpc函数用来判断是否为用户提供的数据增加斜线,在传递$_GET、$_POST、$_COOKIE时发生作用。

1.测试数据

数据:$data="a'' ''b"; (a和b之间是四个单引号),从以下几方面执行写入数据库操作。

magic_quotes_gpc=offmagic_quotes_gpc=on
写入数据库字符串未经过任何过滤处理 字符串加函数addlashes()处理字符串未经过任何过滤处理 字符串加函数addlashes()处理
从数据库读出 字符串也未作任何处理字符串未作任何处理 字符串也未作任何处理 字符串未作任何处理
操作结果sql语句错误,mysql无法执行sql语句,写入数据库失败 sql语句顺利执行,数据成功写入数据库 sql语句顺利执行,数据成功写入数据库 sql语句顺利执行,数据成功写入数据库
数据库保存格式无数据a'' ''b(与输入一样) a'' ''b(与输入一样)a\'\' \'\'b(添加了转义字符)
输出数据格式 无数据a'' ''b(与输入一样)a'' ''b(与输入一样) a\'\' \'\'b(添加了转义字符)
结论 对于未经处理的单引号在写入数据库时会使sql语句发生错误 addslashes()函数将单引号转换为\'的转义字符使sql语句成功执行,
但\'并未作为数据存入数据库,数据库保存的是a'' ''b 而并不是想象的a\'\' \'\'b
magic_quotes_gpc=on 将单引号转换为\'的转义字符使sql语句成功执行,
但\'并未作为数据入数据库,数据库保存的是a'' ''b 而并不是想象的a\'\' \'\'b
magic_quotes_gpc=on 将单引号转换为\'的转义字符使sql语句成功执行,
addslashes又将即将写入数据库的单引号转换为\',后者的转换被作为数据写入
数据库,数据库保存的是a\'\' \'\'b
总结 magic_quotes_gpc=off 的情况
必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出
因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行。
magic_quotes_gpc=on的情况,
可不对输入和输出数据库的字符串数据作
addslashes()和stripslashes()的操作,数据也会正常显示。
如果对输入的数据作了addslashes()处理,
那么在输出的时候就必须使用stripslashes()去掉多余的反斜杠。

2.科学解决方案

$c='"3';
$c=get_magic_quotes_gpc()?$c:addslashes($c);

get_magic_quotes_gpc在php7.4中已废弃,以后均是off情况,就是要加[addslashes() - 使用反斜线引用字符串,stripslashes() - 反引用一个引用字符串]。ini_set('magic_quotes_gpc', 'Off');也只能在低版本中使用。