2013-04-04 108 views
3

我希望你能幫助我。我試圖從MySQL和骨幹數據庫中獲取數據。 事情是,我可以創建一個«用戶»,我可以得到他們所有人。但是,當我試圖讓:用MySQL&Backbone檢索數據JS

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

我一直有這種類型的搜索結果,wichever定id:

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

但我從我的服務器的響應:

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

所以,GET請求被執行,並返回一些沒有保存在«user»變量中的東西。

更多的解釋,這裏是我的腳本

// 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; 
    } 
}); 

而且我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); 
    } 
?> 

編輯 當我做一個

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

我得到這樣的:

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

爲什麼?

+0

看起來你的PHP正在返回一個數組,而不僅僅是一個'User'記錄。也許'fetchObject'會是一個更好的選擇? – WiredPrairie 2013-04-04 20:39:13

+0

什麼都不做,但是多虧了幫助:) – Kai23 2013-04-04 20:43:51

+0

什麼都不做?那麼你的問題並不清楚。當你調用fetchObject並將結果返回給你的客戶端時返回什麼? – WiredPrairie 2013-04-04 21:27:30

回答

2

我終於做到了。

如果你犯了一個

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

你會得到與包含你所需要的對象的模型屬性。你可以這樣分析它:

這是我的觀點:

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

和相關的模板:

<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> 

但是,如果你

$results=$statement->fetchObject(); 

它會返回用戶。感謝@WiredPrairie,我太傻了,改變了我的«save»功能,而不是«fetch»功能。