【问题标题】:Reversing the effect of `mysqli_real_escape_string`反转`mysqli_real_escape_string`的效果
【发布时间】:2025-12-12 21:35:01
【问题描述】:

我正在开发一个应用程序,用户可以在其中创建 HTML 模板并将它们保存到数据库中。模板由文本、图像等不同的组件组成。当我尝试使用 撇号 保存文本时> ' 它给了我mysql_error(很明显)。所以我尝试mysqli_real_escape_strings 来取消它。它有效,但我想取回保存的内容以用于编辑目的和撇号是使用\(斜杠)进行转义。因此内容在内部被修改,不再是可编辑的有效html,浏览器抛出语法错误。
我还尝试搜索其他功能以进行转义并遇到json_encode 但mysql不接受。
有人可以指出任何可以在 php 中执行此操作的函数吗?请建议任何可以为我执行任务的函数!

更新:

  function saveContent(){   
    var $getContent = $('#mainWrap').clone();
    $getContent.find('.textBox, .pictureBox').removeAttr('id');
    var saveContent  = $getContent.wrap('<div></div>').html();
    console.log(saveContent);
    var getBodyStyle=$('body').attr('style');
    console.log('this is body style'+getBodyStyle);
    var auto="auto";
    $.ajax({
        url:"auto_save.php",
        type:"POST",
        dataType:"text",
        //data:"txtComp="+saveContent+"&auto="+auto+"&pageId="+pageId+"&webId="+webId+"&userId="+userId+"&bodyStyle="+getBodyStyle,
        data: {txtComp: saveContent, auto: auto, pageId: pageId,webId:webId,userId:userId,bodyStyle:getBodyStyle}
    }); 
 }  

我在auto_save.php 中添加了mysql_real_escape_string。现在,当我从 DB 取回它时,我必须将它传递给这样的 javascript 变量。

    var getSavedContent = <?php echo json_encode($IdLessContent); ?>;

这会是个问题吗?

【问题讨论】:

  • mysqli_real_escape_string 转义数据以便可以在查询中使用,它不会影响表中存储的内容。检查您的magic_quotes_gpc 设置并禁用它,这可能会导致错误
  • 是的,你根本不想反转mysqli_real_escape_string。您的问题出在其他地方。
  • 你不需要使用一个。您应该只在将某些内容放入 MySQL 查询之前使用 mysql_escape_string。当数据从数据库中返回时,它们将保持原始形式。
  • 正如其他人所说,您不需要“反转”mysqli_real_escape_string。如果您使用得当,那么从数据库中取回数据将不会包含转义字符。如果您保存的数据库字符串中确实有转义字符,那么您需要修复保存到数据库的方式,而不是在之后尝试扭转损坏。

标签: php mysql function


【解决方案1】:

stripslashes() 将删除任何字符串中的斜线,在输出转义数据时很有用。

我相信你需要使用这个:

json_encode($IdLessContent, JSON_UNESCAPED_SLASHES);

使用 UNESCAPED_SLASHES 部分,您的数据应该可以正确返回。

【讨论】:

  • stripslashes 也会从我拥有但不想被删除的文本中删除斜杠..对吗?
  • 是的,都是斜线。请参阅上面关于magic_quotes_gpcphp.net/manual/en/function.stripslashes.php 的评论 - 你也许可以从一开始就避免这个问题:)
  • 但是,如果您已经有一个转义的反斜杠,您的表单会将其输出为双斜杠 \\,因此 stripslashes 只会删除其中一个,留下一个 \
  • 我收到一个错误SyntaxError: syntax error [Break On This Error] var getSavedContent = &lt;br /&gt;。还尝试将所有内容都保留在引号中,但没有奏效!
  • 您的 HTML 和内容中的某些内容可能会终止 javascript 语句并导致语法错误 - 这通常是它首先转义它的原因。我认为您可以做的最好的事情是将转义的数据存储在一个字符串中,然后在您在应用程序中使用代码时使用 javascript 函数对其进行转义。
【解决方案2】:

对于最新版本的 PHP(我在 7.3 上测试过),monkeymatrix 的答案是不正确的。 mysqli_real_escape_string() 仅转义某些字符。这是一个可以反转它的函数:

function reverse_mysqli_real_escape_string($str) {
    return strtr($str, [
        '\0'   => "\x00",
        '\n'   => "\n",
        '\r'   => "\r",
        '\\\\' => "\\",
        "\'"   => "'",
        '\"'   => '"',
        '\Z' => "\x1a"
    ]);
 }

在一个正确编写的应用程序中,应该很少需要这个函数。您应该使用带有参数绑定的 PDO 来自动处理任何转义。我只创建了这个函数来处理一些遗留代码,这些代码在输入上转义了所有内容,我需要一种方法来恢复原始数据。

【讨论】:

  • 2013 年 2 月是正确的。那是 6 年前。你明白事情会随着时间而改变吗?如果您要说“它不正确”,请说明您指的是哪个版本。
  • 当前版本的 PHP 7.3 不正确,我不知道你六年前运行的是什么版本。