【问题标题】:Issue inserting ampersands into MySQL在 MySQL 中插入和号的问题
【发布时间】:2012-10-25 16:40:31
【问题描述】:

我已经尝试解决这个问题一段时间了,我在网络上花费了无数时间来寻找解决方案。所以我想我会来找你们,因为我对这个问题束手无策。基本上我有一个我不久前设计的 CMS 系统,我最近使用 PDO 等将其更新为现代标准,现在我似乎在将 & 符号 (&) 插入 MySQL 数据库时遇到问题,一切都设置为 'UTF- 8',PDO连接,MySQL排序规则,一切,但由于某种原因,当文本区域的表单中有一个&符号时,数据被发送,但是当它到达&符号时被切断,好像它正在解析它一样切断它,因为它认为与号是一个漏洞。

这是我在 PHP 中插入的代码:

            $fbl = $_POST['fblValue'];
        $fbr = $_POST['fbrValue'];
        $sbl = $_POST['sblValue'];
        $sbr = $_POST['sbrValue'];
        $tbl = $_POST['tblValue'];
        $tbr = $_POST['tbrValue'];
        $fblDisabled = $_POST['fblDisabled'];
        $fbrDisabled = $_POST['fbrDisabled'];
        $sblDisabled = $_POST['sblDisabled'];
        $sbrDisabled = $_POST['sbrDisabled'];
        $tblDisabled = $_POST['tblDisabled'];
        $tbrDisabled = $_POST['tbrDisabled'];
        $footer = $_POST['footerValue'];
        $copyright = $_POST['copyrightValue'];

        $statement = $conn->prepare("UPDATE pages SET FBL = :fbl, 
                                                    FBLDisabled = :fblDisabled, 
                                                    FBR = :fbr, 
                                                    FBRDisabled = :fbrDisabled, 
                                                    SBL = :sbl, SBLDisabled = :sblDisabled, 
                                                    SBR = :sbr, SBRDisabled = :sbrDisabled, 
                                                    TBL = :tbr, TBLDisabled = :tblDisabled, 
                                                    TBR = :tbr, TBRDisabled = :tbrDisabled, 
                                                    Footer = :footer, 
                                                    Copyright = :copyright 
                                                    WHERE ID = :pageToEdit");
        $statement->bindParam(":fbl", $fbl);
        $statement->bindParam(":fblDisabled", $fblDisabled);
        $statement->bindParam(":fbr", $fbr);
        $statement->bindParam(":fbrDisabled", $fbrDisabled);
        $statement->bindParam(":sbl", $sbl);
        $statement->bindParam(":sblDisabled", $sblDisabled);
        $statement->bindParam(":sbr", $sbr);
        $statement->bindParam(":sbrDisabled", $sbrDisabled);
        $statement->bindParam(":tbl", $tbl);
        $statement->bindParam(":tblDisabled", $tbDisabled);
        $statement->bindParam(":tbr", $tbr);
        $statement->bindParam(":tbrDisabled", $tbrDisabled);
        $statement->bindParam(":footer", $footer);
        $statement->bindParam(":copyright", $copyright);
        $statement->bindParam(":pageToEdit", $pageToEdit);
        $statement->execute();              
    }

我还可以补充一下,我使用 ajax 发送数据,是否有可能与此有关?

这里是 AJAX 代码:

<script type="text/javascript">


        function savePage(str1, str2, str3, str4, str5, str6, str7, str8, str9, str10, str11, str12, str13, str14)
        {
            var xmlhttp;

            if (window.XMLHttpRequest)
            {// code for IE7+, Firefox, Chrome, Opera, Safari
                xmlhttp=new XMLHttpRequest();
            }
            else
            {// code for IE6, IE5
                xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
            }

            xmlhttp.open("post", "putEditedPage.php", true);
            xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
            xmlhttp.send("fblValue=" + str1 + "&fbrValue=" + str2 + "&sblValue=" + str3 + "&sbrValue=" + str4 + "&tblValue=" + str5 + "&tbrValue=" + str6 + "&fblDisabled=" + str7 + "&fbrDisabled=" + str8 + "&sblDisabled=" + str9 + "&sbrDisabled=" + str10 + "&tblDisabled=" + str11 + "&tbrDisabled=" + str12 + "&footerValue=" + str13 + "&copyrightValue=" + str14);
            document.getElementById('blackout').style.display="block";
            document.getElementById('Alert').style.display="block";
            document.getElementById('Alert').style.marginTop=((window.innerHeight/2)+((window.innerHeight/100) * 35))+"px";
            setTimeout(function(){
                document.getElementById('blackout').style.display='none';           
                document.getElementById('Alert').style.display='none';
            }, 1250);
        }
        function insertTab(o, e)
        {
            var kC = e.keyCode ? e.keyCode : e.charCode ? e.charCode : e.which;
            if (kC == 9 && !e.shiftKey && !e.ctrlKey && !e.altKey)
            {
                var oS = o.scrollTop;
                if (o.setSelectionRange)
                {
                    var sS = o.selectionStart;
                    var sE = o.selectionEnd;
                    o.value = o.value.substring(0, sS) + "\t" + o.value.substr(sE);
                    o.setSelectionRange(sS + 1, sS + 1);
                    o.focus();
                }
                else if (o.createTextRange)
                {
                    document.selection.createRange().text = "\t";
                    e.returnValue = false;
                }
                o.scrollTop = oS;
                if (e.preventDefault)
                {
                    e.preventDefault();
                }
                return false;
            }
            return true;
        }

    </script>

提前谢谢各位,干杯。

【问题讨论】:

  • 刚刚解决了这个问题,对不起。

标签: php javascript mysql pdo


【解决方案1】:

就在这里:

xmlhttp.send("fblValue=" + str1 + "&fbrValue=" + str2 + "&sblValue=" + str3 + ...
                                   ^                     ^

看到那些 & 符号了吗?它们是 URL 编码中的特殊字符。要提交包含 & 符号本身的值,您需要使用 URL 编码转义该 & 符号。因此,encodeURIComponent 您的值在将它们连接成 URL 编码字符串之前。

也许我可以让你感兴趣:The Great Escapism (Or: What You Need To Know To Work With Text Within Text)

【讨论】:

  • 它不起作用,我将发送字符串移动到一个新变量中并使用了'encodeURIComponent'函数,但不幸的是它仍然在做同样的事情。
  • 调试更多。查看您的浏览器网络检查工具究竟发送到服务器的内容。将您在服务器上收到的值记录在某处,以便您检查它们(var_dump($_POST) 或等效项)。检查每一步。沿着表单→AJAX→PHP→PDO→数据库的链条有很多事情会出错。找出失败的确切位置。
  • 通过post发送数据时如何输出var_dump()数据? var_dump 是否转储到某种文件中?
  • 如果您var_dump,您将在浏览器的开发人员工具中看到它作为对 AJAX 请求的响应。否则,使用var_export 将其写入某处。
【解决方案2】:

PDO、Ajax、XML 支持特殊字符。

你一定有小洞:“一切都设置为'UTF-8'”。

检查这些事情:

  1. HTML 页面字符集(此处:&lt;head&gt;&lt;/head&gt;

  2. JS文件的编码?

    &lt;script src="file.js" type="text/javascript" charset="utf-8"&gt;

  3. XML(我不知道在哪里)

  4. 数据库连接(设置名称、排序规则)

  5. 在特定列上设置排序规则

  6. 源文件的字符集

  7. 如果您在 JavaScript 中使用某些编辑器 - 也许它在配置文件中有字符集?

您可以尝试“逐步”调试。您可以尝试在不使用 AJAX 的情况下插入与号。

【讨论】:

    【解决方案3】:

    【讨论】:

    • 因为&符号的“html代码”是&amp;amp;,其中包含一个&符号...?
    • 大声笑你把我打败了,我屈服于不合逻辑的想法。
    猜你喜欢
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多