带参数的slim-php获取路由(用户登录系统)


slim php get route with parameter (user login system)

我正试图遵循以下内容: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
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"

我在第二个GET路由(/user/:username)中的$request变量上做了一个var_dump,它是一个空数组。。。这个变量中存储了什么?var_dump($request)之后的一切都只是我试图根据用户名获得正确的用户。此外,var_dump($sql)打印出bool(false),这意味着在数据库中没有正确找到用户。我有一个名为Users的数据库表,我用两个用户填充数据库:"joe"answers"eamon"。当我在浏览器中键入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一样。

更新

我的代码现在看起来是这样的:

$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("joe"是我手动插入数据库的用户)时,我会得到以下错误:

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

不是只有一块田地吗?username字段?

老实说,我已经有一段时间没有使用Slim和mysqli了,但我认为这应该有效:

$app->get('/user/:username', function ($username) use ($app) {
    ...
    $sql = $mysqli->prepare("SELECT * FROM $tbl_name WHERE username=?");
    $sql->bind_param($username);
    $sql->execute();

这完成了我对/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();
});

为了消除最后一个错误,我只需要插入我需要的列的名称,而不是使用*