MySQL存储Summernote生成的HTML时特殊字符被替换问题求助
解决Summernote HTML存储MySQL时'+'被替换为空格的问题
看起来你遇到的问题核心大概率是前端提交时的URL编码丢失,而非后端转义函数的问题——毕竟addslashes()和已废弃的mysql_real_escape_string()主要是处理SQL注入相关的字符转义,没法解决前端提交环节的编码错误。下面给你一步步拆解解决方案:
第一步:修复前端JS提交逻辑
你提到的saveDa...函数,估计是直接把Summernote生成的HTML通过GET方式拼接在URL里,或者没有正确编码就提交了。因为在URL规则里,+是用来表示空格的,浏览器会自动把URL中的+解析成空格,导致后端拿到的内容已经被替换,这时候再用转义函数自然没用。
推荐的JS提交方式:
- 优先用POST方法+
FormData封装数据(最稳妥,还支持上传文件):
function saveData() { // 获取Summernote的HTML内容 const noteContent = $('#summernote').summernote('code'); const formData = new FormData(); // 把内容添加到FormData中 formData.append('note_content', noteContent); $.ajax({ url: 'your-save-api.php', type: 'POST', data: formData, // 关键:不要让jQuery处理FormData和Content-Type processData: false, contentType: false, success: function(res) { console.log('内容保存成功'); } }); }
- 如果一定要用GET(不推荐,URL长度有限制),记得对HTML内容编码:
function saveData() { const noteContent = $('#summernote').summernote('code'); // 编码特殊字符,避免+被解析成空格 const encodedContent = encodeURIComponent(noteContent); $.ajax({ url: `your-save-api.php?content=${encodedContent}`, type: 'GET', success: function(res) { console.log('内容保存成功'); } }); }
这种情况后端需要用urldecode($_GET['content'])还原内容,但还是POST更可靠。
第二步:后端改用安全的数据库操作方式
mysql_real_escape_string()早就被PHP废弃了,强烈建议用PDO或mysqli的预处理语句——不仅能彻底避免SQL注入,还能自动处理字符编码问题,不需要手动调用转义函数。
PDO预处理示例:
// 假设已建立PDO连接 $content = $_POST['note_content']; // 预处理SQL语句 $stmt = $pdo->prepare("INSERT INTO your_table (content_column) VALUES (:content)"); // 绑定参数,自动处理特殊字符 $stmt->bindParam(':content', $content, PDO::PARAM_STR); $stmt->execute();
mysqli预处理示例:
// 假设已建立mysqli连接 $content = $_POST['note_content']; $stmt = $mysqli->prepare("INSERT INTO your_table (content_column) VALUES (?)"); // "s"表示参数为字符串类型 $stmt->bind_param("s", $content); $stmt->execute();
第三步:确保数据库字符集正确
- 数据库表的字符集设置为
utf8mb4(支持所有Unicode字符,包括emoji和特殊符号),字段类型用TEXT或LONGTEXT(如果内容较长)。 - 建立数据库连接时,明确指定字符集为
utf8mb4:- PDO连接:
new PDO("mysql:host=localhost;dbname=your_db;charset=utf8mb4", "username", "password"); - mysqli连接:
$mysqli->set_charset('utf8mb4');
- PDO连接:
为什么之前的转义函数没用?
addslashes()只会转义单引号、双引号、反斜线和NULL字符,对+这类URL编码相关的字符完全没作用;mysql_real_escape_string()虽然会转义SQL特殊字符,但如果前端提交过来的+已经被浏览器解析成空格了,后端拿到的就是空格,再怎么转义也没法还原成+——所以问题的核心在前端提交的编码处理上。
内容的提问来源于stack exchange,提问作者BSK
相关产品推荐
相关产品推荐

