使用MeekroDB存储TinyMCE HTML被转义,如何存储原始HTML?
搞定MeekroDB存储TinyMCE原始HTML的问题
嘿,我来帮你捋清楚这个问题~首先得先搞懂MeekroDB各个占位符的真实作用,你遇到的情况大概率是对占位符的理解有点偏差,或者代码里藏了额外的转义操作:
先澄清MeekroDB占位符的真相
%s:这个占位符只会做SQL注入防护的转义(比如把单引号转成两个单引号),根本不会碰你的HTML标签!如果你看到数据库里的HTML被转成了<这种实体,那绝对不是MeekroDB干的,要么是你代码里手动加了htmlspecialchars()/htmlentities()这类函数,要么是TinyMCE本身的配置把HTML转成了实体。%l:这个是字面量占位符,直接把内容塞到SQL语句里,完全不转义——这玩意儿非常危险,分分钟给你搞出SQL注入漏洞,而且你报错的原因大概率是HTML里有单引号/双引号,直接插入SQL导致语法错误,所以绝对别用它!
正确的处理步骤
1. 先排查代码里的额外转义
检查你接收POST数据后的代码,有没有把TinyMCE的内容用htmlspecialchars()处理过?比如这种:
// 错误示例!别这么干 $content = htmlspecialchars($_POST['tinymce_content']);
如果有,赶紧删掉这个调用,它会把<转成<,导致存储的是转义后的内容,而不是原始HTML。
2. 用%s安全存储HTML
%s才是正确的选择,它既防注入,又不会破坏你的HTML标签。举个实际的代码例子:
// 正确的写法 $tinymce_content = $_POST['tinymce_content']; DB::query("INSERT INTO your_table (content_column) VALUES (%s)", $tinymce_content);
这样存储到数据库里的就是原始的HTML标签,不会被转义。
3. 检查TinyMCE的配置
如果上面两步都没问题,但还是存了转义后的实体,那得看看TinyMCE的初始化配置。默认情况下,TinyMCE可能会把一些字符转成实体,你可以在初始化时加上这个配置:
tinymce.init({ // 其他配置项... entity_encoding: 'raw' // 设置为'raw',让编辑器输出原始HTML,不转义实体 });
4. 读取时别多此一举
最后,从数据库读取内容输出到页面时,别再用htmlspecialchars()了,直接输出就行,这样浏览器才能解析成HTML:
// 正确输出 echo $row['content_column']; // 错误输出!会把HTML转成文本显示 // echo htmlspecialchars($row['content_column']);
这样一套操作下来,就能完美存储和展示TinyMCE生成的原始HTML啦~
内容的提问来源于stack exchange,提问作者Alexandre Cristo
相关产品推荐
相关产品推荐

