0

我是学习 Backbone JS 的初学者,我无法将我的第一个测试模型保存到 MySQL 数据库。虽然 AJAX 请求是从 Backbone 发送的带有正确的 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”脚本,用于测试目的。

4

3 回答 3

1

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

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

于 2013-01-04T03:36:52.297 回答
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());
于 2013-01-04T05:31:44.417 回答
0

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

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

// DB stuff goes here
于 2013-01-04T04:07:46.877 回答