0

我曾经mysql_real_escape_string在数据库中输入信息,但是当我在查询中返回信息时,我得到\\\'了文本。我已经做到了,以便插入查询在'像以前一样保存时不再停留在句子中。如果文章包含撇号,它会在中途停止保存文章的标题。这已得到修复,但现在我知道\\\'有撇号的地方。

例子:Microsoft\\\'s $15 Windows 8 upgrade offer to run from June 2nd to January 31st, will include free workshops

我从数据库返回列表的查询代码如下所示:(请注意,这是摘录,因此不包含此循环的结束)

<?php

    $q2 = "SELECT * FROM ReadLater WHERE Folder_ID = 0 AND User_ID = $loggedInUser->user_id ORDER BY dt_added DESC";
    $r2 = mysql_query($q2);

    echo "<div id='folderstitleright'>Unread</div>";

    if(mysql_num_rows($r2)>0)
        {
        echo "<ul id='foldersarticlelist'>";
        $sr2=1;
        while($row = mysql_fetch_assoc($r2))

            {

            echo "
               <li class='box'>

ETC

知道如何阻止这种情况吗?我已经测试过魔术引号是否打开并且它们是打开的,但是对于网络主机我无法打开它们(我发现,很可能有一个非常复杂的方法,但我还没有找到它)的和他们还说他们忽略了 .htaccess 文件中的 php 标志。

我试图做一个 preg_replace ,\\\' to '但到目前为止还没有成功,从我的尝试来看,它完全破坏了查询,但我很可能执行错了,或者把它放在了上面代码中的错误位置。

4

3 回答 3

2

不要使用preg_replace,只需使用str_replace

$text = str_replace("\\\\\\", "'", $text);
// Use 6 slashes as '\\' is really '\' because '\-' is an escape sequence.
于 2012-05-28T18:17:43.763 回答
0

要使用当前数据库中的数据,请在返回的内容上使用两次stripslashes

但是,最好更正数据库中的内容并更改INSERT脚本,以便将来不再插入损坏的数据(可能涉及删除对addslashesor的调用mysql_real_escape_string)。

于 2012-05-28T18:25:25.917 回答
0

首先,我会要求您的网络主机禁用魔术引号,如果您结帐页面http://www.php.net/manual/en/info.configuration.php#ini.magic-quotes-gpc您可以阅读“警告此功能自 PHP 5.3.0 起已弃用,自 PHP 5.4.0 起已移除。”。

您不能在运行时禁用它,因此您的主机必须在 php 配置中进行更改。如果您的主机拒绝禁用魔术引号,您可以创建一个 php 函数,例如“secVar()”,而不是在每个 mysql 查询中使用“mysql_real_escape_string”。

那么你的函数“secVar”将是:

如果在网络主机上激活“魔术报价”:

function secVar($var){
    return $var;
}

如果在虚拟主机上禁用了“魔术引号”:

function secVar($var){
    return mysql_real_escape_string($var)
}

这样做可以让您在您的虚拟主机禁用魔术引号或更改主机时快速更新您的脚本以保护您的变量。

你也可以用另一种方式来解决这个问题:在你的脚本被执行之前,魔术引号是在运行时“放置”的。凭记忆,“魔术引号”被放置在以下变量数组中:$_REQUEST、$_POST、$_GET、$_FILES 和其他变量。知道你可以 1. 检查是否启用了魔术引号 2. 如果启用,则从每个受魔术引号影响的数组中删除每个变量的所有斜线。

一种或另一种解决方案应该适合您。

玩得开心!

于 2012-05-28T18:39:00.933 回答