【问题标题】:"&amp" character from api url not saved to mysql database来自 api url 的“&amp”字符未保存到 mysql 数据库
【发布时间】:2013-02-14 07:44:32
【问题描述】:

我正在开发一个应用程序,该应用程序涉及使用 javascript 从页面获取整个页面内容并将 html 转储到数据库。在页面上,我有各种组件将使用 ajax 请求进行解析和存储。我这样做。

 function saveContent(){    
    var $getContent = $('#mainWrap').clone();
    $getContent.find('.textBox, .pictureBox').removeAttr('id');
    var saveContent  = $getContent.wrap('<div></div>').html();
    var getBodyStyle=$('body').attr('style');
    var auto="auto";
    $.ajax({
        url:"save.php",
        type:"POST",
        dataType:"text",
        data:"txtComp="+saveContent+"&auto="+auto+"&pageId="+pageId+"&webId="+webId+"&userId="+userId+"&bodyStyle="+getBodyStyle,
        success:function(data){
            var options = {"text":data,"layout":"topCenter","type":"success","animateOpen": {"opacity": "show"}};
            setTimeout(function(){noty(options)}, 1000);
            //$('#draftMsg').html(data).fadeIn(500);
        }
    }); 
 }  

现在我有了 facebook、twitter 等社交媒体组件。当我尝试保存 facebook 组件时,它并没有完全保存,因为它包含脚本中带有“&amp”的一些参数。

    <div style="z-index: 1001; height: 560px; width: 413px; top: -20px; left: 121.5px;" id="com-IADDFSGNHLU7WNR3WM2KC3I8DA2DOIC6" class="facebookBox contentBox boxStyle">
    <div class="blankDiv"></div>
    <iframe class="facebookBoxObject" allowtransparency="true" style="border: medium none; overflow: hidden; height: 560px; width: 413px;" src="https://www.facebook.com/plugins/likebox.php?api_key=117096311791424&amp;locale=en_US&amp;height=560&amp;header=true&amp;show_faces=true&amp;stream=true&amp;width=413&amp;href=http://www.facebook.com/cbil360" frameborder="0" scrolling="no">
    </iframe>
   </div>

以上是我要存储到数据库的内容,当我说console.log 时我得到它,但在数据库中它只存储以下内容

 <div style="z-index: 1001; height: 388px; width: 283px; top: -20px; left: 120.5px;" id="com-IADDFSGNHLU7WNR3WM2KC3I8DA2DOIC6" class="facebookBox contentBox boxStyle">
    <div class="blankDiv"></div><iframe class="facebookBoxObject" allowtransparency="true" style="border: medium none; overflow: hidden; height: 388px; width: 283px;" src="https://www.facebook.com/plugins/likebox.php?api_key=117096311791424

它在api_key 参数之后中断,因为它有 & 之后。我不确定我没有得到任何错误。尝试调试但尚未得出结论。 请纠正我哪里出错了。

更新:我使用的查询是

$query = "insert into tbl_revision (userId,revisionContent,webId,pageId,status,saveType,dateAdded) values ('".$_SESSION['UserId']."','$revisionContent','$webId','$pageId','$status','$saveType','$toDate')"

【问题讨论】:

  • 你能发布你的 PHP 吗?我猜这与您的查询或执行查询的方法有关。
  • 您不会转义 GET 参数。也许你应该。内容在 & 处终止的事实表明。
  • 我已经用查询更新了问题。我认为查询是正确的,因为我可以保存其余的组件。数据库中的字段标记为varchar,如果这可能会有所不同。
  • 尝试更改 ajax 调用中的 data 字段以使用 json 格式。例如:数据:{txtComp: saveContent, auto: auto, pageId: pageId}
  • @JanDvorak by escape 你的意思是我需要做mysql_real_escape_strings

标签: php javascript jquery mysql


【解决方案1】:

我真的怀疑问题是否在数据到达您的后端之前发生。它发生在前端,因为您在查询字符串中包含 &amp; 作为普通字符,这会导致一些混乱。我建议您 URL 编码 您的 saveContent 变量(URL 编码而不是 HTML 编码)。

encodeURIComponent(saveContent) //that will replace the & with it's corresponding url encoding

还有另一种解决方法,您可以使用 jquery $.ajax 提供的 json 表单提交 ajax 请求字段。一个例子是

 $.ajax({
        url:"save.php",
        type:"POST",
        dataType:"text",
        data:{txtComp: saveContent, auto: auto }, //etc
        success:function(data){
            var options = {"text":data,"layout":"topCenter","type":"success","animateOpen": {"opacity": "show"}};
            setTimeout(function(){noty(options)}, 1000);
            //$('#draftMsg').html(data).fadeIn(500);
        }
    }); 

我还建议您查看该问题以了解 URL 编码和 HTML 编码之间的区别

Difference between Url Encode and HTML encode

【讨论】:

  • json部分解决了这个问题。肯定会看看这个问题。 一个问题 作为json发送如何解决问题?普通字符串参数是否会阻塞特殊字符?
  • 当您使用 json 表单时,jQuery 似乎为您进行了 url 编码。从逻辑上讲,当您使用平面字符串表示时,它也无法做到这一点,因为它无法区分字段名称和字段值。
  • 好会看看!!谢谢你的帮助!
【解决方案2】:

您是否尝试过使用 htmlentities 和 html_entity_decode 对输入字符串进行编码并解码输出字符串?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-22
    • 2012-07-04
    • 1970-01-01
    • 2015-05-26
    • 2016-09-06
    • 2014-09-16
    • 2011-08-12
    • 1970-01-01
    相关资源
    最近更新 更多