PHP + Backbone.js保存回调不断引发错误

时间:2011-11-03 19:32:25

标签: php backbone.js

首先,我想说我起初是一名平面设计师,所以如果我错过了一些非常愚蠢的东西,我真的很抱歉,但我不能自己解决这个问题:/。

使用backbone.js和PHP保存模型时遇到问题。我正在使用Restler来处理PHP调用。

我正在为一个我们将要举办会议的网站的管理员工作。当我在会议中添加一个发言者时,我在pl_speakers表中创建了一个条目,我想检索它的id,以便将它添加到相应的会议条目中。

我的PHP代码如下所示:

function post($id = NULL, $request_data = NULL) {

    $sql = "INSERT INTO pl_speakers(id, firstName, name, job, site, mail, video, cv) VALUES (
        '',
        '".$request_data["firstName"]."',
        '".$request_data["name"]."',
        '".$request_data["job"]."',
        '".$request_data["site"]."',
        '".$request_data["mail"]."',
        '".$request_data["video"]."',
        '".$request_data["cv"]."'
    )";

    $req = $this->db->query($sql);
    $response = array("id" => $this->db->lastInsertId());
    return json_encode($response);
}

我的javascript看起来像那样

    onAddClick: function(){
        var speaker = new speakerModel;
        this.speakers.add(speaker);
    },
    onAddSpeaker: function(speakerModel){
        speakerModel.save(speakerModel, {  success:$.proxy(this.onSpeakerSaved, this),  error: $.proxy(this.onSpeakerNotSaved, this)});
    },

    onSpeakerSaved: function(speakerModel, response){
        console.log(response)
    },

当我查看Chrome的网络面板时,php脚本发送的响应是“{\”id \“:\”128 \“}”但是“onSpeakerSaved”中记录的响应没有出现,而是我有这个错误:

Uncaught TypeError: Cannot use 'in' operator to search for 'id' in {"id":"128"}  
f.extend.setbackbone-min.js:9  
f.extend.save.b.successbackbone-min.js:12  
f.extend._Deferred.e.resolveWithjquery-min.js:2  
wjquery-min.js:4  
f.support.ajax.f.ajaxTransport.send.d  

无论php函数返回什么,我都会收到此错误(即使它是整个模型),但如果它没有返回任何内容,则错误消失。

我已经搜索了关于这个主题的前面的问题,似乎响应必须是一个带有“id”属性的json对象,它就在这里,所以我完全陷入困境,无法弄清楚我在哪里我错了:/。

同样,如果我错过了一个愚蠢的事情,我真的很抱歉,但我真的很感激这一方面:)

编辑: 这是整个php类,如果它可以有任何帮助,但我觉得它更多的是在javascript方面以及Backbone如何处理响应。我还添加了onAddClick JS方法。

class Speakers {
public $db;

function __construct() {
    $this->db = new PDO("mysql:dbname=".DB_NAME.";host=".DB_SERVER, DB_USER, DB_PWD);
}

function get($id=null) {
    return is_null($id) ? $this->getAll() : $this->getSpeaker($id);
}
function getAll() {
    $sql = "SELECT * FROM pl_speakers";
    return $this->getJSON($sql);
}
function getSpeaker($id) {
    $sql = "SELECT * FROM pl_speakers WHERE id='".$id."'";
    return $this->getJSON($sql);
}
function getJSON($sql) {
    $req = $this->db->query($sql);

    $data = array();
    while($row = $req->fetchObject()) 
    { 
        $data[] = $row;
    } 

    return json_encode($data);
}

function post($id = NULL, $request_data = NULL) {

    $sql = "INSERT INTO pl_speakers(id, firstName, name, job, site, mail, video, cv) VALUES (
        '',
        '".$request_data["firstName"]."',
        '".$request_data["name"]."',
        '".$request_data["job"]."',
        '".$request_data["site"]."',
        '".$request_data["mail"]."',
        '".$request_data["video"]."',
        '".$request_data["cv"]."'
    )";

    $req = $this->db->query($sql);
    $response = array("id" => $this->db->lastInsertId());
    return $this->getSpeaker($this->db->lastInsertId());
}

function put($id = NULL, $request_data = NULL) {
    $sql = "UPDATE pl_speakers
            SET firstName = '".$request_data["firstName"]."',
            name = '".$request_data["name"]."',
            job = '".$request_data["job"]."',
            site = '".$request_data["site"]."',
            mail = '".$request_data["mail"]."',
            video = '".$request_data["video"]."',
            cv = '".$request_data["cv"]."'
            WHERE id = '".$id."'";

    $req = $this->db->query($sql);
}
function delete($id = NULL) {
    $sql = "DELETE FROM pl_speakers WHERE id='".$id."'";
    $req = $this->db->query($sql);
}

1 个答案:

答案 0 :(得分:0)

Restler负责根据客户端请求的内容以及您希望API支持的格式,将您的方法返回的PHP数据转换为JSON / XML / YAML / PLIST / AMF

$restler->setSupportedFormats('JsonFormat', 'PlistFormat', ...);

所以你不应该尝试自己做JSON编码,你需要返回的只是一个数组。

以下是您班级的修改版本

<?php

class Speakers {
    public $db;

    function __construct() {
        $this->db = new PDO("mysql:dbname=".DB_NAME.";host=".DB_SERVER, DB_USER, DB_PWD);
    }

    function get($id=null) {
        return is_null($id) ? $this->getAll() : $this->getSpeaker($id);
    }
    private function getAll() {
        $req = $this->db->query("SELECT * FROM pl_speakers");
        return $req->fetchAll();
    }
    private function getSpeaker($id) {
        $req = $this->db->query("SELECT * FROM pl_speakers WHERE id='".$id."'");
        return $req->fetchAll();
    }   
    function post($id = NULL, $request_data = NULL) {

        $sql = "INSERT INTO pl_speakers(id, firstName, name, job, site, mail, video, cv) VALUES (
            '',
            '".$request_data["firstName"]."',
        '".$request_data["name"]."',
        '".$request_data["job"]."',
        '".$request_data["site"]."',
        '".$request_data["mail"]."',
        '".$request_data["video"]."',
        '".$request_data["cv"]."'
        )";

        $req = $this->db->query($sql);
        $response = array("id" => $this->db->lastInsertId());
        return $this->getSpeaker($this->db->lastInsertId());
    }

    function put($id = NULL, $request_data = NULL) {
        $sql = "UPDATE pl_speakers
            SET firstName = '".$request_data["firstName"]."',
        name = '".$request_data["name"]."',
        job = '".$request_data["job"]."',
        site = '".$request_data["site"]."',
        mail = '".$request_data["mail"]."',
        video = '".$request_data["video"]."',
        cv = '".$request_data["cv"]."'
        WHERE id = '".$id."'";

        $req = $this->db->query($sql);
    }
    function delete($id = NULL) {
        $sql = "DELETE FROM pl_speakers WHERE id='".$id."'";
        $req = $this->db->query($sql);
    }
}