将 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 发送的对象?谢谢。 @rpabonbox.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 数据库的主要内容,如果未能解决你的问题,请参考以下文章