PHP mySQLi real_escape_string无法使用撇号

时间:2015-06-30 15:24:38

标签: php mysql mysqli

我试图使用MySqli real_escape_string来准备一些文本以包含在SQL查询中,但是它看起来像real_escape_string似乎不适合使用撇号。我在下面提供了一些测试代码:

function validMySQLtest($var) {

    $conn= connopen();
    conncheck();
    $var = str_replace("£", "£", "$var");
    $var = str_replace("'", "\'", "$var");
    $var=htmlentities($var, ENT_QUOTES, "UTF-8");
    echo "Entities " . $var . "<br />";
    $var=stripslashes($var);
    echo "Stripslashes " . $var . "<br />";
    $var=strip_tags($var);
    echo "Striptags " . $var . "<br />";
    $var = $conn->real_escape_string($var);
    echo "Escape String " . $var . "<br />";
    connclose();
    return $var;
}

validMySQLtest("In medieval times Germany produced most of the world's brass.");

代码输出如下;

  

成功连接....

     

实体在中世纪时期,德国生产了世界上的大部分地区   黄铜。

     

Stripslashes在中世纪时期,德国生产了世界上大部分地区   黄铜。

     

Striptags在中世纪时期,德国生产了世界上大部分地区   黄铜。

     

Escape String在中世纪时期,德国生产了世界上的大部分地区   黄铜。

     

....连接关闭。

从这里我得知str_replace,stripslashes和striptags似乎有效,但是real_escape_string似乎没有。

非常感谢任何想法。

编辑:在回复评论时,我已经包含了connopen和conncheck代码:

// Open connection
function connopen() {

    $conn = new mysqli(servername, username, password, dbname);
    return $conn;
}

//Check connection
function conncheck() {

    $conn = connopen(); 
    if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
    } else {
    echo "Connected successfully....<br /><br />";
    }
}

1 个答案:

答案 0 :(得分:0)

技术上正确的答案可能是一个更好的通用文本处理程序,这对写作来说有点挑战,并且可能会让你陷入神秘的细节,特别是一旦你开始处理字符集的晦涩难懂 - 和通常你需要这样做,如果你的程序是安全的,或者更好地避免使用如上所述的预备语句的必要性。

但是如果你只是想要一种快速而又简单而有效的方法来处理单引号字符,那么这样的事情是有效的。

th:field="*{percentFormatted}

请注意,我们正在替换单引号字符,即不是撇号。在排版中使用的正确字符是&#34; Sean O&#39; Mara&#34;或者&#34;世界黄铜&#34;是一个撇号,它在视觉上非常类似于单右引号(rsqo),所以我们从语言学的角度来看这里是正确的。当然,这是正确的答案,特别是当您希望输出的排版正确时。例如,输入大块文本(错误地)更容易,因为&#34; Sean O&#39; Mara&#34;并使用真撇号全局替换单引号(更容易键入)。哦,真正的撇号也不会混淆你的数据库,它只是另一个角色,比如&#34; p&#34;或&#34; W&#34;。