上传到DB时,正在从JSON字符串中删除反斜杠

时间:2018-06-08 20:34:23

标签: javascript php sql

我有一个JSON对象,我已经使用JavaScript中的JSON.stringify()方法将其转换为JSON字符串。然后我使用AJAX发布到PHP文件将其插入到数据库中。

     $("#saveToDatabase").click(function(){
   var place = searchBox.getPlaces();
   var locationJson = JSON.stringify(place[0]);

   $.ajax({
    type: "POST",
    url: "insertLocation.php",
    dataType:"json",
    ContentType:"application/json",
    data:  {
      locationJson : locationJson
  },
    cache: false,
    success: function(result){
     window.alert("successful upload!");
    }});
  });
}

    <?php
require_once("connection.php");



if(isset($_POST["locationJson"])){

    $locationJson = $_POST['locationJson'];

$query ="INSERT INTO Locations (json) VALUES ('$locationJson')";
        $statement = $pdo ->prepare($query);
        $statement->execute();

}

?>

我遇到的问题是,在数据上传的某个时刻,反斜杠&#34; \&#34;正在从我的JSON字符串中删除。因此,当我从数据库中选择它们并尝试在JavaScript中再次操作它们时,它们不再是有效的JSON对象。

我正在使用SQL上传到PHPmyAdmin。

有没有人知道解决这个问题的方法?我需要将JSON字符串存储在数据库中,而不会使它们失效。

干杯!

2 个答案:

答案 0 :(得分:2)

使用参数化查询,而不是将变量替换为字符串。

$query ="INSERT INTO Locations (json) VALUES (:json)";
$statement = $pdo ->prepare($query);
$statement->bindParam(':json', $locationJson);
$statement->execute();

请参阅How can I prevent SQL injection in PHP?,了解为什么将变量替换为SQL查询是一个坏主意,即使您使用addslashes()之类的函数来尝试转义它们。

答案 1 :(得分:0)

始终可以修复食逃者。我在存储JSON字符串时发现,我不可避免地会在以后处理相同的问题。由于我从不在SQL中搜索存储的对象,因此我通常只将它们转换为base64。所以:

btoa(JSON.stringify(place[0]))

可悲的是,一些base64字符会导致URL,文件名等问题,因此我实际上使用了修改后的base64 for URL。在javascript中:

function safeobj(ob) {
    return btoa(JSON.stringify(ob)).replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, ".");
}

这几乎没有任何损失。对我来说,它值得额外的存储,以避免不断处理这些各种问题。

如果您支持IE9-,则需要使用填充物或填充物进行btoa。