将 Backbone.js 模型插入 MySQL 数据库

Posted

技术标签:

【中文标题】将 Backbone.js 模型插入 MySQL 数据库【英文标题】:Insert Backbone.js model into MySQL database 【发布时间】:2012-06-11 10:43:52 【问题描述】:

我有一个带有一些默认值和 url 的主干.js 模型:

var Box = Backbone.Model.extend(
    url: "./save.php",
    defaults: 
        x: 0,
        y: 0,
        w: 1,
        h: 1
    
);

然后我有这个模型的一个实例,我继续保存它:

var box = new Box( x:10, y:10, w:200, h:200 );
box.save();

现在我想使用 PHP 脚本“save.php”将此模型保存到 mysql 数据库中,如下所示:

<?php 
    include('connection.php');

    $id = $_POST['cid'];
    $x = $_POST['x'];
    $y = $_POST['y'];
    $w = $_POST['w'];
    $h = $_POST['h'];

    mysql_query("INSERT INTO boxes (id, x, y, w, h)
                         VALUES('$id', '$x', '$y', '$w', '$h')
                       ") or die(mysql_error());
?>
echo "Data Inserted!";

我已经尝试阅读许多教程,但我无法让这个简单的模型保存工作。为什么我的代码不起作用?关于如何解决这个问题的任何想法?

谢谢

编辑:快速解决方案

在php脚本中,从发送的JSON对象中获取信息的正确方法如下:

$box_data = json_decode(file_get_contents('php://input'));
$x = $box_data->'x';
$y = $box_data->'y';
$w = $box_data->'w';
$h = $box_data->'h';

并存入数据库:

mysql_query("INSERT INTO boxes(id, x, y, w, h)
            VALUES('', '$x', '$y', '$w', '$h') ") 
or die(mysql_error());

这样一来,将在“boxes”表中插入一行,其中包含主干模型 Box 的每个属性的信息。 在这种情况下,服务器请求方法是 POST,并且“boxes”表中的 id 设置为自动递增。

【问题讨论】:

你为什么不把它保存到一个字段中呢?将是可扩展的。或者更好的方法是使用基于文档的数据库,如 CouchDB 或 MongoDB,其中数据已经保存为 JSON。 您看到数据插入消息了吗?你能看到对 php 文件的请求正在发出吗?你有任何回应吗? 【参考方案1】:

Backbone 基于 REST API:将模型保存/更新到服务器时,Backbone 将在请求正文中将其序列化为 JSON,并带有 POST 我们的 PUT 请求。来自Backbone.sync documentation

使用默认实现,当 Backbone.sync 发送请求时 保存模型,它的属性将被传递,序列化为 JSON, 并在 HTTP 正文中发送,内容类型为 application/json。

这意味着你必须在服务器端

确定请求类型 解码序列化的 JSON

这样的事情应该让你开始

$request_method = strtolower($_SERVER['REQUEST_METHOD']);
$data = null;

switch ($request_method) 
    case 'post':
    case 'put':
        $data = json_decode(file_get_contents('php://input'));
    break;


// print_r($data);

// note that mysql_* functions are deprecated
// http://php.net/manual/en/function.mysql-query.php
// inserting with a PDO object, assuming an auto incremented id
$sql = "INSERT INTO boxes (x, y, w, h) VALUES(?, ?, ?, ?)";
$sth = $dbh->prepare($sql);
$sth->execute(array(
    $data->x,
    $data->y,
    $data->w,
    $data->h
));
$id = $dbh->lastInsertId();

查看此页面以更全面地在 PHP http://www.gen-x-design.com/archives/create-a-rest-api-with-php/ 中实现 REST API

【讨论】:

感谢@nikoshr,但是我仍然无法将模型保存到数据库中。我至少尝试过使用 request_method 的 switch case 来查看服务器接收到的内容并将结果存储在变量中,但我什么也没看到,我唯一知道的是请求方法是 GET。您能否提供一个简单的代码,至少我可以访问 JSON 发送的对象?谢谢。 @rpabon box.save() 发送GET 请求?很奇怪。您可以使用 file_get_contents('php://input') 读取序列化的 JSON,但这不适用于 GET。您可以通过 Firebug 或 Chrome Inspector 检查您的浏览器发送的内容(查询参数、发布参数、请求正文)吗? 我现在正在做的是使用我在问题上发布的相同代码,然后添加 ,所以我可以在浏览器中看到请求方法和JSON,我不知道这是否会影响结果。 @rpabon header('Location: ./save.php'); 重定向请求,丢失请求类型和 JSON,这就是为什么你有一个 GET 而没有别的。回到你以前的版本,用我的代码修改它,然后检查响应。它对 Backbone 无效,但至少你会看到一些东西。【参考方案2】:

您忘记发送 ID。

//$id = $_POST['cid'];

将 ID 设为 AUTO_INCREMENT 并从代码中删除:

$id = $_POST['cid'];

mysql_query("INSERT INTO boxes (x, y, w, h)
                         VALUES('$x', '$y', '$w', '$h')
                       ") or die(mysql_error());

【讨论】:

以上是关于将 Backbone.js 模型插入 MySQL 数据库的主要内容,如果未能解决你的问题,请参考以下文章

Backbone.js 将模型添加到集合问题

Backbone.js 将两个不同的模型添加到同一个集合中

如何使用 Backbone.js 生成模型 ID

Backbone.js + Spring MVC。保存模型

Backbone.js:组合多个模型的复杂视图

在 Backbone.js 中使用 localStorage