JSON 仅作为一个值出现

Posted

技术标签:

【中文标题】JSON 仅作为一个值出现【英文标题】:JSON comes out as only one value 【发布时间】:2021-05-05 19:21:03 【问题描述】:

我正在尝试将一些设置保存到我的 SQL 数据库中并使用 ajax 和 php 恢复它们。 但结果只有一个长 JSON 值而不是 3。所以我无法访问“setting1”例如。

Settings: ""setting1":"true","setting2":"false","setting3":"10""

这是我的保存方法。 变量都设置好了。

 let newSettings = 
        "setting1": setting1_value,
        "setting2": setting2_value,
        "setting3": setting3_value
    ;

    newSettings = JSON.stringify(newSettings);


    var xhttp = new XMLHttpRequest();
    xhttp.open("POST", "save-settings.php");
    xhttp.setRequestHeader("Content-Type", "application/json");


    xhttp.onreadystatechange = function () 
        if (this.readyState == 4 && this.status == 200) 
            console.log(this.responseText);
        
    ;

    xhttp.send(newSettings);

这是保存设置的php脚本。

include "connection.php"

$newSettings = file_get_contents("php://input");
$object = json_decode($newSettings, true);

$sql = "UPDATE mytable SET Settings = '$newSettings'";


$result = $connect->query($sql);

并且这个方法应该从 SQL 中读取设置。

include "connection.php";

$sql = "SELECT Settings FROM Leads_Zugriff WHERE atpid = 21001";
$result = $connect->query($sql);


if ($result->num_rows > 0) 
    
    while ($row = $result->fetch_assoc()) 
        print(json_encode($row, true)); 
    


这会调用读取设置的 php 脚本

function readSettings() 
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function () 
        if (this.readyState == 4 && this.status == 200) 
            
            myObj = JSON.parse(this.responseText);
            console.log(myObj);

        
    ;

    xhttp.open("GET", "read-settings.php");
    xhttp.send();

【问题讨论】:

警告:您对SQL Injections 持开放态度,应该使用参数化的prepared statements,而不是手动构建查询。它们由PDO 或mysqli 提供。永远不要相信任何形式的输入!即使您的查询仅由受信任的用户执行,you are still in risk of corrupting your data。 Escaping is not enough! 【参考方案1】:

这一行在这里 $row = $result->fetch_assoc() 顾名思义,返回一个关联数组。 而且您正在将结果转换为 JSON,这就是您得到的原因

Settings: ""setting1":"true","setting2":"false","setting3":"10""

尝试改变这一行:

print(json_encode($row, true)); 

进入

print($row['Settings'], true);

【讨论】:

【参考方案2】:

您将$newSettings 直接保存到数据库中。 $newSettings 是一个 JSON 字符串。然后,你再把它拿出来,你在上面运行json_encode,它把它重新编码为JSON。所以你最终会得到双重编码的数据。

如果您要将原始 JSON 存储在数据库中,则无需在将其返回给浏览器之前再次对其进行编码。

【讨论】:

以上是关于JSON 仅作为一个值出现的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AEM 中的 json 中获取布尔值和数值 OOB

如何仅从一个键中过滤对象并将其作为 json 返回?

AJAX 成功调用仅从 JSON 字符串中获取一个值

Phpmyadmin 仅接受来自具有多个输入值的 json 数组中的一个条目

如果值仅包含数字,AFNetworking 不会返回 NSString

Bigquery:是不是有一种 json 路径方法可以仅从具有动态键的 json 数组中提取值?