javascript - 为什么 json_encode 返回数组而不是对象?

标签 javascript php jquery json

如果您倾向于否决此问题,请说明原因,以便我从错误中吸取教训。

PHP - 编辑

<?php

require_once "dbconnect.php";

function isEmpty($str) {
    return strlen(trim($str)) == 0;
}

function getWritersData() {
    try {
        if (!isset($_REQUEST["userid"]) || isEmpty($_REQUEST["userid"])) {
            throw new Exception('A user-id must be supplied.');       
        }
        $userid = $_REQUEST["userid"];
        $dbh = connect2DB();
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $stmt = $dbh->prepare("SELECT Title, WorkType, FormType, Genre, NumberOfPages, Filename, OriginalFilename FROM Writers WHERE fkAccounts = :userid");
        $stmt->bindParam(':userid', $userid, PDO::PARAM_INT);
        $stmt->execute();
        $rows = $stmt->fetchAll();
        echo json_encode($rows, JSON_FORCE_OBJECT);
    } catch (PDOException $e) {
        echo 'Database error: ' . $e->getMessage();
    } catch (Exception $e) {
        echo 'General error: ' . $e->getMessage();
    }
}    
/** Update writers data **/
function saveWritersData() 
{
    try {
        include_once "commonWritersPostElements";
        $dbh = connect2DB();
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $stmt = $dbh->prepare("UPDATE Writers SET fkAccounts=:userid, Title=:title, WorkType=:worktype, FormType=:formtype, Genre=:genre, NumberOfPages=:pages, Filename=:filename, OriginalFilename=:origonal WHERE fkAccounts=:userid");
        $worktype = "1";            
        $stmt->bindParam(':userid', $userid, PDO::PARAM_INT, 10);
        $stmt->bindParam(':title', $title, PDO::PARAM_STR, 255);
        $stmt->bindParam(':worktype', $worktype, PDO::PARAM_STR, 30);
        $stmt->bindParam(':formtype', $formtype, PDO::PARAM_STR, 30);
        $stmt->bindParam(':genre', $genre, PDO::PARAM_STR, 100);
        $stmt->bindParam(':pages', $nbrPages, PDO::PARAM_STR, 100);
        $stmt->bindParam(':filename', $NewFileName, PDO::PARAM_STR, 30);
        $stmt->bindParam(':original', $File_Name, PDO::PARAM_STR, 30);        
        $stmt->execute();

    } catch (PDOException $e) {
        echo 'Database error: ' . $e->getMessage();
    } catch (Exception $e) {
        echo 'General error: ' . $e->getMessage();
    }
}    
function deleteWritersData() 
{
    try {
        if (!isset($_REQUEST["userid"]) || isEmpty($_REQUEST["userid"]))
            throw new Exception('user-id is missing.');       
        else {
            $userid = filter_var(trim($_REQUEST["user-id"]), FILTER_SANITIZE_STRING);
            $userid = htmlspecialchars_decode($userid, ENT_QUOTES);
        }
        $dbh = connect2DB();
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $stmt = $dbh->prepare("DELETE Writers WHERE fkAccounts=:userid");
        $stmt->bindParam(':userid', $userid, PDO::PARAM_INT, 10);
        $stmt->execute();

    } catch (PDOException $e) {
        echo 'Database error: ' . $e->getMessage();
    } catch (Exception $e) {
        echo 'General error: ' . $e->getMessage();
    }
}    


if (!isset($_REQUEST['action'])  || isEmpty($_REQUEST['action']))
    throw new Exception('Programmer error: action not posted.');
else {
    $action = $_REQUEST['action'];
    switch($action) {
    case 'get-writer-data':
        getWritersData();
        break;
    case 'update-writers':
        select();
        break;
    default:
        throw new Exception("Unknown action: " . $action);
        break;
    }
}

if (!isset($_REQUEST['action'])  || isEmpty($_REQUEST['action']))
    throw new Exception('Programmer error: action not posted.');
else {
    $action = $_REQUEST['action'];
    switch($action) {
    case 'get-writer-data':
        getWritersData();
        break;
    case 'delete-writers':
        deleteWritersData();
        break;
    case 'update-writers':
        saveWritersData();
        break;
    default:
        throw new Exception("Unknown action: " . $action);
        break;
    }
}

?>

JS

$(function () {
    populateWritersDropdowns();

    data = {};
    data.action = 'get-writer-data';
    data.userid = sessionStorage.getItem("user-id");
    console.log("user-id-manage-uploads=" + sessionStorage.getItem("user-id"))
    ajax('post', 'php/manage-uploads.php', data, getSuccess, "Error retrieving writer's data: ");
    $(".tr-clone");
    function getSuccess(data) {
        console.log("data=" + data);
        var trClone = $(".tr-clone");
        var jsonData = $.parseJSON(data);
        var count = 0;
        for (var key in jsonData) count++
        $.each(jsonData, function (key, value) {
            trClone.find(".title").val(value.Title);
            trClone.find(".work-type").val(value.WorkType);
            trClone.find(".form-type").val(value.FormType);
            trClone.find(".genre").val(value.Genre);
            console.log("value.FormType=" + value.FormType + ", form-type.val()=" + trClone.find(".form-type").val());
            console.log("value.Genre=" + value.Genre + ", genre.val()=" + trClone.find(".genre").val());
            trClone.find(".form-type").val(value.FormType);
            trClone.find(".nbr-pages").val(value.NumberOfPages);
            trClone.find(".synopsis a[href='" + value.Filename + "']");
            if (key === count - 1) return false;
            trClone = trClone.clone().insertAfter($(".tr-clone:last"));
        });
    }

console.log

在 JS 代码中,JSON.parse(...) 抛出如下错误。

data=[{"Title":"Mozart, Wunderkind","0":"Mozart, Wunderkind","WorkType":"1","1":"1","FormType":"4","2":"4","Genre":"12","3":"12","NumberOfPages":"250","4":"250","Filename":"6532744220.pdf","5":"6532744220.pdf","OriginalFilename":"MozartWunderkindQueryLetter.pd","6":"MozartWunderkindQueryLetter.pd"},{"Title":"Mozart, Wunderkind Query-Letter","0":"Mozart, Wunderkind Query-Letter","WorkType":"2","1":"2","FormType":"7","2":"7","Genre":"9","3":"9","NumberOfPages":"129","4":"129","Filename":"9981287843.pdf","5":"9981287843.pdf","OriginalFilename":"MozartWunderkindQueryLetter.pd","6":"MozartWunderkindQueryLetter.pd"}][{"Title":"Mozart, Wunderkind","0":"Mozart, Wunderkind","WorkType":"1","1":"1","FormType":"4","2":"4","Genre":"12","3":"12","NumberOfPages":"250","4":"250","Filename":"6532744220.pdf","5":"6532744220.pdf","OriginalFilename":"MozartWunderkindQueryLetter.pd","6":"MozartWunderkindQueryLetter.pd"},{"Title":"Mozart, Wunderkind Query-Letter","0":"Mozart, Wunderkind Query-Letter","WorkType":"2","1":"2","FormType":"7","2":"7","Genre":"9","3":"9","NumberOfPages":"129","4":"129","Filename":"9981287843.pdf","5":"9981287843.pdf","OriginalFilename":"MozartWunderkindQueryLetter.pd","6":"MozartWunderkindQueryLetter.pd"}]

VM1161:1 Uncaught SyntaxError: Unexpected token [ in JSON at position 613n.parseJSON @ jquery.min.js:4getSuccess @ VM1137:13(anonymous function) @ VM1136:97j @ jquery.min.js:2k.fireWith @ jquery.min.js:2x @ jquery.min.js:4(anonymous function) @ jquery.min.js:4

最佳答案

在这里仔细查看您的 JSON 字符串,我发现您正在回显该字符串两次......以便它被发送到客户端两次附加,这就是为什么它没有以正确的方式显示.. .

您可以使用JSON parser在线工具来了解你的 JSON 字符串......所以你需要在你的 php 代码中弄清楚为什么它被发送两次,它一定是像你已经回显了两次......如果你把你的完整的 php 代码,那么我们可以为您提供更多帮助..

因此,您需要更正来自服务器的响应,因为 JSON 编码工作正常,并且编码的字符串应该只响应一次

宾果!!!在您的 php 代码中,您在 if (!isset($_REQUEST['action']) || isEmpty($_REQUEST['action'])) 行后执行 switch case 两次,请参见下文,这就是它回显两次的原因。 .并且破坏了你的 JSON 字符串

if (!isset($_REQUEST['action'])  || isEmpty($_REQUEST['action']))
    throw new Exception('Programmer error: action not posted.');
else {
    $action = $_REQUEST['action'];
    switch($action) {
    case 'get-writer-data':
        getWritersData();
        break;
    case 'update-writers':
        select();
        break;
    default:
        throw new Exception("Unknown action: " . $action);
        break;
    }
}

if (!isset($_REQUEST['action'])  || isEmpty($_REQUEST['action']))
    throw new Exception('Programmer error: action not posted.');
else {
    $action = $_REQUEST['action'];
    switch($action) {
    case 'get-writer-data':
        getWritersData();
        break;
    case 'delete-writers':
        deleteWritersData();
        break;
    case 'update-writers':
        saveWritersData();
        break;
    default:
        throw new Exception("Unknown action: " . $action);
        break;
    }
}

关于javascript - 为什么 json_encode 返回数组而不是对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37501210/

相关文章:

php - 实现回合制网页游戏

php - 如何在 php 中使用密码保护 zip?

javascript - 根据变量动态生成函数名

javascript - 如何在 .load() 之后重新绑定(bind) .click() 函数?

javascript - 按一次空格键后jquery功能不起作用

javascript - 一个函数在作用域内,一个函数在作用域外,即使这两个函数定义在同一位置

javascript - 带有 javascript 的 Photoshop 面板

javascript - 如何定义多个相似的指令?

php - 在 codeigniter 中连接来自多个表的数据

php - 如何从从 mysqli_fetch_array() 获取的数组转换的 javascript 数组中获取所有行数据