2013-07-11 66 views
0

我想按照這個:http://www.9bitstudios.com/2013/05/restful-backbone-js-implementation-using-slim-api/,這http://coenraets.org/blog/2011/12/backbone-js-wine-cellar-tutorial-part-1-getting-started/。我有這樣的代碼到目前爲止 - 我纔剛剛開始試圖瞭解苗條的PHP框架:苗條PHP獲取路線

<?php 
require 'Slim/Slim.php'; 

\Slim\Slim::registerAutoloader(); 

$app = new \Slim\Slim(); 

// GET route with parameter 
$app->get('/users', function() use ($app) { 

    // get all users 
    $host="localhost"; // Host name 
    $password=""; // Mysql password 
    $db_name="backbone"; // Database name 
    $tbl_name="Users"; // Table name 

    // Connect to server and select databse. 
    $mysqli = new mysqli("$host", "root", "$password", "$db_name")or die("cannot connect"); 

    $sql = $mysqli->prepare("SELECT username FROM $tbl_name"); 
    $sql->execute(); 
    $sql->bind_result($namesie); 

    while ($sql->fetch()) { 
     echo json_encode($namesie); 
    } 

    $sql->close(); 
    $mysqli->close(); 
}); 

    // GET route with parameter 
$app->get('/user/:username', function() use ($app) { 

    $request = (array) json_decode($app->request()->getBody()); // WHAT IS THIS LINE DOING? 
    var_dump($request); 

    $host="localhost"; // Host name 
    $password=""; // Mysql password 
    $db_name="backbone"; // Database name 
    $tbl_name="Users"; // Table name 

    // Connect to server and select databse. 
    $mysqli = new mysqli("$host", "root", "$password", "$db_name")or die("cannot connect"); 

    $sql = $mysqli->prepare("SELECT * FROM $tbl_name WHERE username=:username"); 
    var_dump($sql); 
    $sql->execute(); 
    $sql->bind_result($dauser); 
    echo json_encode($dauser); 
}); 

第一條路線的作品,因爲它應該顯示所有用戶像這樣:"eamon""joe"

我做的$request變量var_dump第二GET路線(/user/:username) - 這是一個空數組...什麼是獲得存儲在這個變量? var_dump($request)之後的所有內容都是我根據用戶名獲取正確用戶的嘗試。此外var_dump($sql)打印出bool(false)這意味着用戶沒有被正確地在數據庫中找到。我有一個數據庫表叫Users我填充數據庫與兩個用戶:「喬」和「埃蒙」。當我鍵入localhost/user/joe到我的瀏覽器,我得到一個錯誤(與var_dump的一起)說:

Fatal error: Call to a member function execute() on a non-object

我想是因爲什麼也沒有存儲在$sql我得到這個錯誤。任何人都可以將我指向正確的方向嗎?我最終將使用backbone.js - 在此項目之後,我一直在我的路由中對代碼進行建模:http://coenraets.org/blog/2011/12/backbone-js-wine-cellar-tutorial-part-1-getting-started/。他宣佈路線,然後使用一個功能,如getWine($id)這實際上是我試圖實現 - 但用戶數據庫,而不是。我也在使用mysqli,因爲他使用PDO我想。

UPDATE

我的代碼現在看起來像這樣:

$app->get('/user/:username', function ($username) use ($app) { 

    $host="localhost"; // Host name 
    $password=""; // Mysql password 
    $db_name="backbone"; // Database name 
    $tbl_name="Users"; // Table name 

    // Connect to server and select databse. 
    $mysqli = new mysqli("$host", "root", "$password", "$db_name")or die("cannot connect"); 

    $sql = $mysqli->prepare("SELECT * FROM $tbl_name WHERE username=?"); 

    $sql->bind_param("s",$username); 
    $sql->execute(); 
    $sql->bind_result($profile); 

    if($sql->fetch()) { 
     echo json_encode($profile); 
    } 

    $sql->close(); 
    $mysqli->close(); 
}); 

當我在localhost/user/joe類型(「喬」是我手動插入到數據庫中的用戶),我得到這個錯誤:

mysqli_stmt::bind_result(): Number of bind variables doesn't match number of fields in prepared statement

是不是有隻有一個字段? username字段?

回答

0

這實現了我設置了與/user/:username路線做:

$app->get('/user/:username', function ($username) use ($app) { 

    $host="localhost"; // Host name 
    $password=""; // Mysql password 
    $db_name="backbone"; // Database name 
    $tbl_name="Users"; // Table name 

    // Connect to server and select databse. 
    $mysqli = new mysqli("$host", "root", "$password", "$db_name")or die("cannot connect"); 

    $sql = $mysqli->prepare("SELECT username, email FROM $tbl_name WHERE username=?"); 

    $sql->bind_param("s",$username); 
    $sql->execute(); 
    $sql->bind_result($username1,$email); 

    if($sql->fetch()) { 
     echo $username1; 
     echo $email; 
    } 

    $sql->close(); 
    $mysqli->close(); 
}); 

爲了擺脫我只需要插入我需要的,而不是使用*列的名字的最後一個錯誤。

1

老實說,我不實際使用超薄和mysqli的,因爲一段時間,但我認爲這應該工作:

$app->get('/user/:username', function ($username) use ($app) { 

    ... 

    $sql = $mysqli->prepare("SELECT * FROM $tbl_name WHERE username=?"); 
    $sql->bind_param($username); 
    $sql->execute(); 
+0

的感謝!我會更新我的問題,以反映我對您的代碼所做的事情 - 我認爲我們正處在正確的軌道上。讓我以一個新的錯誤 - 你可以理解...'mysqli_stmt :: bind_result():綁定變量的數目不準備statement'匹配字段數 – ewizard

+0

只是想通了,你是非常接近 - bind_result做不喜歡'SELECT * FROM'。我不得不將其更改爲'SELECT username,email FROM',這實際上更好,因爲我不想檢索密碼(表中唯一的其他列)。 – ewizard

+0

很高興我指出你在正確的方向! – Ingro