Javascript 处理mysql内外的特殊字符

Javascript 处理mysql内外的特殊字符,javascript,php,mysql,Javascript,Php,Mysql,我正在构建一个传单web应用程序,用于存储分配给地理位置的消息 我通过使用以下命令将数据从javascript发送到PHP,一次添加一行数据: $name = mysqli_real_escape_string($conn, $_POST['NAME']); $latitude = mysqli_real_escape_string($conn, $_POST['LATITUDE']); $longitude = mysqli_real_escape_string($conn, $_POST['

我正在构建一个传单web应用程序,用于存储分配给地理位置的消息

我通过使用以下命令将数据从javascript发送到PHP,一次添加一行数据:

$name = mysqli_real_escape_string($conn, $_POST['NAME']);
$latitude = mysqli_real_escape_string($conn, $_POST['LATITUDE']);
$longitude = mysqli_real_escape_string($conn, $_POST['LONGITUDE']);
$message = mysqli_real_escape_string($conn, $_POST['MESSAGE']);

$sql = "INSERT INTO geoData (NAME,LATITUDE,LONGITUDE,MESSAGE)
VALUES ('$name', '$latitude', '$longitude', '$message')";
我使用PHP将数据返回到javascript,使用:

$conn = mysqli_connect($dbServername,$dbUsername, $dbPassword, $dbName);
if(! $conn ){
    die('Could not connect: ' . mysqli_error());
}
$sql = 'SELECT * FROM geoData';

$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) > 0) {
    while($row = mysqli_fetch_assoc($result)) {
        $rows[] = $row;
    }
 } else {
    echo "0 results";
 } 

mysqli_close($conn);

<script type="text/javascript">
        var data = JSON.parse( '<?php echo json_encode($rows); ?> ' ); 
</script>
$conn=mysqli\u connect($dbServername、$dbUsername、$dbPassword、$dbName);
如果(!$conn){
die('无法连接:'.mysqli_error());
}
$sql='SELECT*FROM geoData';
$result=mysqli\u查询($conn,$sql);
如果(mysqli_num_行($result)>0){
while($row=mysqli\u fetch\u assoc($result)){
$rows[]=$row;
}
}否则{
回显“0结果”;
} 
mysqli_close($conn);
var data=JSON.parse(“”);
除非消息具有特殊字符,如撇号,例如“Dave's dogs's bone”,否则此操作正常。这会产生一个错误

使用PHP和javascript的应用程序的最佳实践是什么。我想我需要一些方法来编码特殊字符,然后javascript可以解码和显示这些字符

错误如下: 参数列表后未捕获的语法错误(缺少)

<script type="text/javascript">
        var data = JSON.parse( '[{"NAME":"The Kennel","LATITUDE":"50.7599143982","LONGITUDE":"-1.3100980520","MESSAGE","Dave's Dog's Bone"}] ' ); 
</script>

var data=JSON.parse(“[{”NAME:“犬舍”、“纬度”:“50.7599143982”、“经度”:“-1.3100980520”、“消息”、“戴夫的狗骨”}”);

非常感谢

问题在于您的
JSON.parse()
,在本例中根本不需要它

更改:

var data = JSON.parse( '<?php echo json_encode($rows); ?> ' );
var data=JSON.parse(“”);

var数据=;
JSON.parse()
用于解析字符串化的JSON。从
json\u encode()
回显结果将立即给出正确的结果

旁注

我建议添加
$rows=[]if(mysqli_num_rows($result)>0)
json_encode($rows)
之前,如果查询没有返回任何结果,则将抛出一个“未定义的变量”(因为当前在循环遍历结果时该变量是在循环内部创建的)

旁注2


进行数据库查询时,建议使用参数化而不是使用
mysqli\u real\u escape\u string()
手动转义和生成查询。预处理语句是目前推荐的防止SQL注入的方法,确保您不会忘记或错过一些值的转义。

问题在于您的
JSON.parse()
,在这种情况下根本不需要它

更改:

var data = JSON.parse( '<?php echo json_encode($rows); ?> ' );
var data=JSON.parse(“”);

var数据=;
JSON.parse()
用于解析字符串化的JSON。从
json\u encode()
回显结果将立即给出正确的结果

旁注

我建议添加
$rows=[]if(mysqli_num_rows($result)>0)
json_encode($rows)
之前,如果查询没有返回任何结果,则将抛出一个“未定义的变量”(因为当前在循环遍历结果时该变量是在循环内部创建的)

旁注2


进行数据库查询时,建议使用参数化而不是使用
mysqli\u real\u escape\u string()
手动转义和生成查询。预处理语句是目前推荐的防止SQL注入的方法,并确保您不会忘记或错过一些值的转义。

您自己通过在json中添加'。如果要检查是否使用此选项:

JSON.parse( '[{"NAME":"The Kennel","LATITUDE":"50.7599143982","LONGDITUTE":"-1.3100980520","type":"bad","reason":"Dave\'s Dog\'s Bone","improvement":"","reviewed":"0"}] ' );

如果您想在主代码中更正此错误,请在将var数据解析为json之前,对其使用
str.replace(/'/g,“)

您可以通过在json中添加“来生成此错误。如果您想检查此错误,请使用:

JSON.parse( '[{"NAME":"The Kennel","LATITUDE":"50.7599143982","LONGDITUTE":"-1.3100980520","type":"bad","reason":"Dave\'s Dog\'s Bone","improvement":"","reviewed":"0"}] ' );

如果您想在主代码中纠正这一点,请在将var数据解析为json之前,对其使用
str.replace(/'/g',“)

旁注:
mysqli_error()
不是测试连接是否失败的正确函数。您需要
mysqli\u connect\u error()
“这会产生一个错误”-具体是什么?您没有说。请使用参数化,而不是手动转义和生成这样的查询。当你使用预先准备好的语句时,你不需要逃避任何事情,因为一切都是由服务器处理的;这里也一样,要像你一样跑。祝你好运。我猜撇号没有被逃脱。。。字符串应该是“Dave's dogs's bone”。检查这是否是您的json_encodeSide的结果注意:
mysqli_error()
不是测试连接是否失败的正确函数。您需要
mysqli\u connect\u error()
“这会产生一个错误”-具体是什么?您没有说。请使用参数化,而不是手动转义和生成这样的查询。当你使用预先准备好的语句时,你不需要逃避任何事情,因为一切都是由服务器处理的;这里也一样,要像你一样跑。祝你好运。我猜撇号没有被逃脱。。。字符串应该是“Dave's dogs's bone”。检查你的json编码中是否会出现这种情况,这是否安全?上面有一些关于准备好的声明的评论。我以为我已经这样做了,使用$sql=“INSERT-INTO-geoData(NAME,LATITUDE,LONGITUDE,MESSAGE)值('$NAME','$LATITUDE','$LONGITUDE','$MESSAGE')”;我应该怎么做?准备好的语句用于数据库查询。这个答案是关于如何将结果输出为json(修复当前错误)。两件完全不同的事情。此外,上面的查询使用字符串插值(这不是准备好的语句)。请阅读我在评论中发布的关于你问题下准备好的声明的链接。我会的,非常感谢!这行得通,安全吗?上面有一些关于准备状态的评论