首先,我想说我起初是一名平面设计师,所以如果我错过了一些非常愚蠢的东西,我真的很抱歉,但我不能自己解决这个问题:/。
使用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 :(得分: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);
}
}