2012-06-07 24 views
7

tengo un modelo Backbone.js unos valores y una url:Backbone.js en base de datos MySQL

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

Entonces tengo una instancia de este modelo y procedo a guardarlo:

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

Ahora quiero salvar este modelo en una base de datos MySQL usando un script PHP "save.php", que es la siguiente:

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

He intentado leer muchos tutoriales pero no puedo hacer que este sencillo modelo de salvar funcione. ¿Por qué mi código no funciona? ¿Alguna idea sobre cómo se puede resolver esto?

Gracias

EDIT: SOLUCIÓN RÁPIDA

En el script php, la forma correcta para obtener la información del objeto JSON enviado es el siguiente:

$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'}; 

Y para almacenar en la base de datos:

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

De esta forma, se insertará una fila en la tabla "cajas" con la información de cada uno de los atributos del modelo de red troncal. El método de solicitud del servidor en este caso es POST y el ID en la tabla "cuadros" está configurado para autoincrementarse.

+0

¿por qué no lo guarda un JSON en un campo? Sería extensible O un enfoque mucho mejor sería utilizar una base de datos basada en documentos como CouchDB o MongoDB, donde los datos ya se guardan como JSON. –

+0

¿Ve el mensaje Datos insertados? ¿Puede ver que se está realizando la solicitud al archivo php? ¿recibes alguna respuesta? – danwellman

Respuesta

18

Backbone se basa en una API REST: al guardar/actualizar un modelo para el servidor, Backbone lo enviará serializado como JSON en el cuerpo de la petición con un POST nuestra solicitud PUT. De Backbone.sync documentation

Con la implementación predeterminada, cuando Backbone.sync envía una petición para salvar un modelo, se pasarán sus atributos, serializado como JSON, y enviados en el cuerpo HTTP con la aplicación de tipo de contenido/json.

Esto significa que del lado del servidor que tiene que

  • determinar el tipo de solicitud
  • decodificación JSON serializado

Algo como esto debería empezar

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

Revisa esta página f o una implementación más completa de una API REST en PHP http://www.gen-x-design.com/archives/create-a-rest-api-with-php/

+0

Gracias @nikoshr, pero sigo sin poder guardar el modelo en la base de datos. Intenté, al menos, ver lo que el servidor recibe usando un conmutador en el método request_method y almacenando el resultado en una variable, pero no veo nada, lo único que sé es que el método de solicitud es GET. ¿Puede proporcionar un código simple en el que al menos pueda tener acceso al objeto enviado JSON? Gracias. – rpabon

+0

@rpabon 'box.save()' envía una solicitud 'GET' Muy extraño. Puedes leer el JSON serializado con 'file_get_contents ('php: // input')' pero eso no funcionará con un 'GET'. ¿Puedes verificar con Firebug o Chrome Inspector qué envía tu navegador (parámetro de consulta, parámetros de publicación, cuerpo de solicitud)? – nikoshr

+0

Lo que estoy haciendo ahora es usar el mismo código que publiqué en la pregunta y luego agregué , entonces puedo ver el método de solicitud y el JSON en el navegador, no sé si esto está afectando el resultado. – rpabon

0

Has olvidado enviar ID.

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

enter image description here

Haga Id a AUTO_INCREMENT y eliminar de código:

$ id = $ _POST [ 'cid'];

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