0

在过去的 10 个小时里,我遇到了一个奇怪的问题,这真的很烦人。问题在于 jquery 从 php 打印 json 数据。php 脚本运行良好,但是当 ajax 调用完整返回时:事件我没有得到任何有效的输出。

这是jQuery代码::

list_choice = "A";
content_choice = "Artists";             //globals to store default value

$(document).ready(function() {
$('.list-nav > a').click(function() {
    var ltext = $(this).text();
    list_choice = ltext;
    console.log(ltext+" <------>    ");        
    $.ajax({            
        url: 'retrieveFileFront.php',
        data: {type: content_choice, navtext: list_choice},
        type: 'POST',
        dataType: 'json',            
        complete: function(data) {                
            console.log(data['message']['Album_Name']);          
        }
    });
    return false;
});

});

我不得不使用完成:事件作为成功:根本没有用。至少我从 complete: 事件中得到了某种输出,尽管它的给予undefined或者[object][Object]这完全是荒谬的。

这是retrieveFileFront.php

<?php

require './retrieveFiles.php';

$type = $_POST['type'];
$nav_text = $_POST['navtext'];

$ret_files = new retrieveFiles($type, $nav_text);
$data = $ret_files->retFiles();
if ($data['success'] == FALSE) {
    $data = array('success' => FALSE, 'message' => 'Sorry an Error has occured');
    echo json_encode($data);

} else {
    echo json_encode($data);
}

?>

这是/retrieveFiles.php

<?php

class retrieveFiles {        
    public $content_type;
    public $list_nav;
    public $connection;
    public $result;
    public $result_obj;
    public $tags_array;
    public $query;
    public $row;

    public function __construct($type, $nav_text) {            
        $this->content_type = $type;
        $this->list_nav = $nav_text;     
    }

    public function retFiles() {

        @$this->connection = new mysqli('localhost', 'usr', 'pass', 'data');
        if(!$this->connection) {
            die("Sorry Database connection could not be made please try again later. Sorry for the inconvenience..");
        }

        if ($this->content_type == "Artists") {                

            $this->query = "SELECT album_name, album_art FROM album_dummy NATURAL JOIN album_images_dummy WHERE artist_name LIKE '$this->list_nav%'";               

            try {
                $this->result = $this->connection->query($this->query);
                $this->row = $this->result->fetch_row();

                if (isset($this->row[0]) && isset($this->row[1])) {
                    $this->tags_array = array("success" => true, "message" => array("Album_Name" => $this->row[0], "Album_Art" => $this->row[1]));

                    return $this->tags_array;
                }

        }   catch (Exception $e) {                
                echo 'Sorry an Error has occurred'.$e;
                return false;
            }
        }
   }

}

?>

我在 firebug 的控制台中收到 200 响应,这表明它运行正常。

<!DOCTYPE HTML>

{"success":true,"message":{"Album_Name":"Streetcleaner","Album_Art":"\/var\/www\/html\/MusicLibrary\/Musics\/1989 - Streetcleaner\/folder.jpg"}}

现在这让我更加困惑,因为我可以看到 json 格式正确。请提供有关如何解决此问题的任何建议。

提前致谢..

4

4 回答 4

1

在 ajax 中使用成功事件而不是完成,我们可以使用 JSON.parse 解析 javascript/jQuery 中的 JSON 编码数据

于 2013-07-03T14:24:51.793 回答
1

JSON 编码的数据通常不会像这样发送

data['message']['Album_Name']);

但更喜欢:

data.message.Album_Name;

你以错误的方式称呼你的结果。正如名称 JSON(JavaScript Object Notation)所暗示的,这些不再是关联数组,而是现在的对象。

于 2013-07-03T14:20:42.030 回答
1

您需要使用解析 json 响应

data = $.parseJSON(data)
于 2013-07-03T14:22:29.677 回答
0

经过长时间的创伤,我终于找到了一个解决方案,原来我需要解析响应文本,然后单独访问对象。这是工作代码

list_choice = "A";
content_choice = "Artists";             //globals to store default value

$(document).ready(function() {
$('.list-nav > a').click(function() {
    var ltext = $(this).text();
    list_choice = ltext;
    console.log(ltext+" <------>    ");

    $('#loading').css('visibility', 'visible');

    $.ajax({
        url: 'retrieveFileFront.php',
        data: {type: content_choice, navtext: list_choice},
        type: 'POST'
        dataType: 'json',
        complete: function(data) {

            var res = data.responseText;
            res = res.replace(/<!DOCTYPE HTML>/g, "");
            res = res.trim();

            console.log(res);
            var arr = JSON.parse("[" + res +"]");    //needed to parse JSON object into arrays
            console.log(arr[0].message.Album_Name);
            console.log(arr[0].message.Album_Art);               

            $('#loading').css('visibility','hidden');
        }
    });
    return false;

});

这可以正常工作并给出所需的响应。无论如何感谢您的帮助,伙计们。

于 2013-07-06T04:35:56.757 回答