2012-06-07 6 views
7

У меня есть модель Backbone.js с некоторыми значениями по умолчанию и URL:Вставка Backbone.js модели в базу данных MySQL

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(); 

Теперь я хочу, чтобы сохранить эту модель в базу данных MySQL с помощью PHP скрипт «save.php», это выглядит следующим образом:

<?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!"; 

Я пробовал читать много учебников, но я не могу заставить эту простую модель экономить на работе. Почему мой код не работает? Любые идеи о том, как это можно решить?

Благодаря

EDIT: БЫСТРОЕ РЕШЕНИЕ

В сценарии 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()); 

Таким образом, одна строка будет вставлена ​​в таблицу «Ящики» с информацией каждого из атрибутов базовой модели Box. Метод запроса сервера в этом случае - POST, а идентификатор в таблице «Ящики» установлен на автоматическое приращение.

+0

Почему бы вам не сохранить JSON в одном поле? Будет расширяться. Или лучшим способом будет использование базы данных на основе документов, такой как CouchDB или MongoDB, где данные уже сохранены как JSON. –

+0

Вы видите сообщение «Введенное данные»? Ca n вы видите, что запрос к файлу php выполняется? вы вообще получаете ответ? – danwellman

ответ

18

Backbone основан на REST API: при сохранении/обновлении модели на сервер, Backbone отправит его сериализовать JSON в теле запроса с POST нашего PUT запроса. От Backbone.sync documentation

С реализацией по умолчанию, когда Backbone.sync отправляет на запрос , чтобы сохранить модель, ее атрибуты будут переданы, сериализованными в формате JSON, и отправленный в теле HTTP с приложением типа контента/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(); 

Проверьте эту страницу f или более тщательная реализация REST API в PHP http://www.gen-x-design.com/archives/create-a-rest-api-with-php/

+0

Спасибо @nikoshr, однако я все еще не могу сэкономить модель в базе данных. Я попытался хотя бы увидеть, что сервер получает с помощью ключа switch в request_method и сохраняет результат в переменной, но я ничего не вижу, единственное, что я знаю, это метод запроса GET. Можете ли вы предоставить простой код, в котором, по крайней мере, я могу получить доступ к отправленному объекту JSON? Благодарю. – rpabon

+0

@rpabon 'box.save()' отправляет запрос 'GET'? Очень странно. Вы можете прочитать сериализованный JSON с 'file_get_contents ('php: // input')', но это не будет работать с 'GET'. Можете ли вы проверить с Firebug или Chrome Inspector, что ваш браузер отправляет (параметр запроса, параметры сообщения, тело запроса)? – nikoshr

+0

Теперь я использую тот же код, который был отправлен на вопрос, а затем добавил , поэтому я могу с этим видеть способ запроса и JSON в браузере, я не знаю, может ли это повлиять на результат. – rpabon

0

Вы забыли отправить идентификатор.

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

enter image description here

Сделать Id в AUTO_INCREMENT и удалить из кода:

$ ID = $ _POST [ 'чид'];

mysql_query("INSERT INTO boxes (x, y, w, h) 
         VALUES('$x', '$y', '$w', '$h') 
         ") or die(mysql_error()); 
Смежные вопросы