You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();

第三步:确保数据库字符集正确

  1. 数据库表的字符集设置为utf8mb4(支持所有Unicode字符,包括emoji和特殊符号),字段类型用TEXT或LONGTEXT(如果内容较长)。
  2. 建立数据库连接时,明确指定字符集为utf8mb4:
    • PDO连接:new PDO("mysql:host=localhost;dbname=your_db;charset=utf8mb4", "username", "password");
    • mysqli连接:$mysqli->set_charset('utf8mb4');

为什么之前的转义函数没用?

addslashes()只会转义单引号、双引号、反斜线和NULL字符,对+这类URL编码相关的字符完全没作用;mysql_real_escape_string()虽然会转义SQL特殊字符,但如果前端提交过来的+已经被浏览器解析成空格了,后端拿到的就是空格,再怎么转义也没法还原成+——所以问题的核心在前端提交的编码处理上。

内容的提问来源于stack exchange,提问作者BSK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:36:16