代码之家  ›  专栏  ›  技术社区  ›  Zach

addslashes,mysql_real_escape总是添加两个斜线?

  •  2
  • Zach  · 技术社区  · 15 年前

    我在将json插入数据库时遇到了问题,我的目的是获取变量,json对它们进行编码,删除斜杠(从magic_quotes中),然后再添加斜杠,以转义{“key”:“value”}中的引号。

    不幸的是,对编码字符串的strip_斜杠没有任何作用,并输出

    {"content":"<p>This string has it\'s downsides</p>","date":1271352514}
    

    然后我尝试了addslashes和mysql_real_escape_string,这两个输出

    "{\\"content\\":\\"<p>This string has it\\\'s downsides</p>\\",\\"date\\":1271352514}"
    

    我搞不懂为什么要加两个斜杠?每次我试着把头发剪掉的时候都会留下一条,再加上两条。任何帮助都将不胜感激!

    2 回复  |  直到 15 年前
        1
  •  0
  •   Andrew Moore    15 年前

    首先,你真的应该考虑 magic_quotes 关闭…引用 the manual :

    警告

    此功能已 贬低 从php 5.3.0开始。不鼓励依赖此功能。


    那就是说,利用 json_encode() 要构建json数组(而不是自己构建),只需调用 mysql_real_escape_string() 查询时:

    $data = array();
    $data['content'] = "<p>This string has it's downsides</p>";
    $data['date'] = 1271352514;
    
    $json = json_encode($data);
    
    mysql_query("INSERT INTO data
                    VALUES ('" . mysql_real_escape_string($json) . "');");
    

    另外,php组建议您使用 mysqli 而不是 mysql . 它的面向对象的api和对参数化查询的支持极大地提高了开发速度、代码维护和安全性。

    下面是使用 米斯利 :

    $data = array();
    $data['content'] = "<p>This string has it's downsides</p>";
    $data['date'] = 1271352514;
    
    $json = json_encode($data);
    
    $sqlInsert = $mysqli->prepare("INSERT INTO data VALUES (?);")
    $sqlInsert->bind_param("s", $json);
    $sqlInsert->execute();
    
        2
  •  0
  •   Gumbo    15 年前

    如果已经有了这样的json字符串(顺便说一下:在json中 / 也需要转义):

    {"content":"<p>This string has it\'s downsides<\/p>","date":1271352514}
    

    那你只需要申请 mysql_real_escape_string 对其进行转义,以便可以使用它将其插入到mysql字符串声明中:

    $query = "INSERT INTO … SET json='".mysql_real_escape_string($json).'"';
    

    如果你启用了魔法引号,你应该 disable or remove them 在那一步之前 $json 字符串实际上只是有效的json。

    推荐文章