无法将Backbone JS模型保存到MySQL数据库

时间:2013-01-04 02:52:54

标签: php mysql backbone.js

我是初学者学习Backbone JS,我在将第一个测试模型保存到MySQL数据库时遇到了麻烦。虽然从Backbone发送的AJAX请求具有正确的POST负载(根据浏览器检查器),但后端的PHP脚本似乎正在接收一个空数组。

以下是模型的代码:

var UserModel = Backbone.Model.extend({
    urlRoot: 'backboneUserBackend.php',
    defaults: {
        name: '',
        email: ''
    }
});

 var user = new UserModel(),
 userDetails = {name: 'Jim Smith', email: 'jimsmith@example.com'};

 user.save(userDetails, {success: function(user){
    console.log(user);
 }
});

这是我的PHP脚本:

if (!empty($_POST)) {
// @todo: replace deprecated mysql method w/ PDO connection
mysql_connect("localhost", "user", "password");
mysql_select_db("mydatabase");

if (mysql_errno()) {
    exit('DB connect error: '.mysql_error());
}

$name = mysql_real_escape_string($_POST['name']);
$email = mysql_real_escape_string($_POST['email']);
$query = sprintf("INSERT INTO users VALUES (NULL, '%s', '%s')", $name, $email);

if (mysql_query($query)) {
    echo mysql_insert_id();
} else {
    exit('Error inserting record: '.mysql_error());
}
}

为了测试我的PHP脚本是否实际上是通过AJAX请求执行的,我将此测试添加到顶部:

$fh = fopen("mytest_".time().".txt", "w");
ob_start();
print_r($_POST);
$payload = ob_get_clean();
fwrite($fh, $payload);
fclose($fh);

每当我保存Backbone模型时,都会创建一个新文件,但该文件包含一个空数组。有什么想法吗?

注意:我正在使用Chrome。另外,我知道我应该在我的Backbone模型中使用一个简单的根URL,例如“/ user”...我只是暂时使用“backboneUserBackend.php”脚本进行测试。

3 个答案:

答案 0 :(得分:1)

Backbone会发布您的模型更新JSON编码,而不是正常的application/x-www-form-urlencoded编码形式,所以如果$_POST数组有效,我会感到惊讶。 (PHP不是我常用的服务器端语言,因此自上次使用PHP以来,它们可能已经改变了一些东西。)

看起来您的问题的答案可能会在这个问题/答案中找到:Insert Backbone.js model into MySQL database

答案 1 :(得分:0)

正如@JayC所提到的,Backbone发送的POST数据是请求体中的JSON,而不是参数。你想要做的是:

$data = json_decode(http_get_request_body());
$name = $data->name;
$email = $data->email;

// DB stuff goes here

答案 2 :(得分:0)

其他两个答案确实概述了代码中出现的问题。我建议您使用php微框架(例如Slim)来帮助您使用REST API。我刚刚开始学习骨干,而使用slim已经使服务器端的东西变得轻而易举。

配置slim后,设置路线非常简单:

<?php
  require '../lib/Slim/Slim.php';
  \Slim\Slim::registerAutoloader();

  $api = new \Slim\Slim();

  $api->get('/users', function(){ //sql function });
  $api->get('/users/:id', function($id){ sql function });
  $api->post('/users', 'addUser');

  $api->run();
  //functions below
?>

我自己就是在做这一切,然后意识到Slim在这个过程中带来了很多麻烦。

例如获取帖子数据:

$user = json_decode($request->getBody());