2011-11-03 18 views
0

首先,我想说,我是一个平面设计师,在第一,所以我真的很抱歉,如果我失去了一些东西真的很愚蠢的,但我可以”自己找出问题:/。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); 
} 
+0

更多的代码PLZ,很难弄明白我。 – malletjo

+0

您好racar,感谢您的关注, 我添加了整个php类代码,如果它可以有任何帮助。 我不知道我可以添加什么JS,因为eveything是由Backbone处理.... –

回答

0

Restler需要基于什么客户端请求,什么格式转换你的方法,以JSON/XML/YAML/PLIST/AMF返回PHP数据的照顾你希望你的API支持

$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); 
    } 
}