Kai23
Kai23

Reputation: 1576

Retrieve datas with MySQL & Backbone JS

I hope you can help me. I'm trying to fetch datas from my database with mysql and backbone. The thing is that I can create a « user », and I can get all of them. But when I try to make :

var user = new User({id: 10});

I always have this type of result, wichever the given id :

Object {id: "10", nom: "", age: "", prenom: ""}

But I get a response from my server:

[{"id":"10","nom":"test","prenom":"test","age":"12"}]

So, the GET request is executed, and return something not saved in the « user » variable.

For more explanations, here is my script

// The model
var User = Backbone.Model.extend({
    defaults: {
        id:"",
        nom:"",
        age:"",
        prenom:""
    },

    url: function(){
    if (this.isNew()){
      return "./users.php";
    } else {
      return "./users.php?id=" + this.id;
    }
  }
});

// The collection
var Users = Backbone.Collection.extend({
    models:"user",
    url:"./users.php"
});

// The view
var EditUser = Backbone.View.extend({
    el: ".page",
    render: function(options) {
        var that = this
        if (options.id) {
            var user = new User({id: options.id});
            console.log(user.toJSON());
            user.fetch({
                success: function(user){
                    var template = _.template($('#edit-user-template').html(), {user: user});                   
                    that.$el.html(template);
                }
            })
        } else {
            var template = _.template($('#edit-user-template').html(), {user:null});
            this.$el.html(template);
        }

    },
    events: {
        'submit .edit-user-form' : 'saveUser',
    },

    saveUser: function(ev){
        data = $(ev.currentTarget).serializeObject();
        var user = new User();
        user.save(data, {
            success: function(user) {
                router.navigate('', {trigger:true})
            }
        });
        return false;
    }
});

And my users.php

<?php 

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


    switch($_SERVER['REQUEST_METHOD']){
        case 'POST':
        save();
        break;
        case 'GET':
        fetch();
        break;
        case 'PUT':
        save();
        break;
        case 'DELETE':
                    // delete item
        destroy();
        break;
    }


    function fetch() {
        $pdo=new PDO("mysql:dbname=nomade;host=localhost","","");
        $sql = "SELECT * FROM users";
        if (isset($_GET['id'])) $sql .= " WHERE id =".$_GET['id'];
        $statement=$pdo->prepare($sql);
        $statement->execute();
        $results=$statement->fetchAll(PDO::FETCH_ASSOC);
        echo json_encode($results);
    }


    function save() {
        $pdo=new PDO("mysql:dbname=nomade;host=localhost","","");
        $data = json_decode(file_get_contents('php://input'));
        $nom = $data->{'nom'};
        $prenom = $data->{'prenom'};
        $age = $data->{'age'};
        $statement=$pdo->prepare("INSERT INTO users (prenom, nom, age) VALUES ('".$nom."','".$prenom."',$age)");
        $statement->execute();
        $results=$statement->fetchAll(PDO::FETCH_ASSOC);
        echo json_encode($results);
    }
?>

EDIT When I make a

var user = new User({id: options.id});
        user.fetch({
            success: function(user){
                console.log(user.attributes[0]);
                // var template = _.template($('#edit-user-template').html(), {});
                // that.$el.html(template);
            }
        });

I get this :

 Object {id: "5", nom: "dsfsdfqds", prenom: "qsdfqsdf", age: "12"}

Why ?

Upvotes: 3

Views: 3524

Answers (1)

Kai23
Kai23

Reputation: 1576

I finally did it.

If you make a

$results=$statement->fetchAll(PDO::FETCH_ASSOC); 

You'll get an model attributes with an object which contains what you need. And you can parse it like that :

Here is my view :

var EditUser = Backbone.View.extend({
    el: ".page",
    render: function(options) {
        var that = this
        if (options.id) {
            var user = new User({id: options.id});
            user.fetch({
                success: function(user){
                    var template = _.template($('#edit-user-template').html(), {user: user.attributes['0']});
                    that.$el.html(template);
                }
            });
        } else {
            var template = _.template($('#edit-user-template').html(), {user:null});
            this.$el.html(template);
        }

    },
    events: {
        'submit .edit-user-form' : 'saveUser',
    },

    saveUser: function(ev){
        data = $(ev.currentTarget).serializeObject();
        var user = new User();
        user.save(data, {
            success: function(user) {
                router.navigate('', {trigger:true})
            }
        });
        return false;
    }
});

And the template associated :

<script type="text/template" id="edit-user-template">
<form  class="edit-user-form">
<legend><%= user ? "Créer" : "Mettre à jour" %> un user</legend>
<label>Prenom</label>
<input type="text" name="prenom" value="<%= user ? user['prenom'] : '' %>" placeholder="">

<label>Nom</label>
<input type="text" name="nom" value="<%= user ? user['nom'] : '' %>" placeholder="">

<label>Age</label>
<input type="text" name="age" value="<%= user ? user['age'] : '' %>" placeholder="">

<hr>
<input type="submit" name="submit" value="Envoyer" placeholder="" class="btn">

</form>
</script>

But if you make

$results=$statement->fetchObject();

It'll return the user. Thanks @WiredPrairie , I was just too silly and changed my « save » function instead of the « fetch » function.

Upvotes: 2

Related Questions