我有一个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字符串存储在数据库中,而不会使它们失效。
干杯!
答案 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。