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

我在第二条路径 ( ) 中var_dump对变量做了一个- 它是一个空数组......这个变量中存储了什么?之后的一切只是我根据用户名获取正确用户的尝试。还打印出表示未在数据库中正确找到用户的意思。我有一个名为的数据库表,我用两个用户填充了数据库:“joe”和“eamon”。当我在浏览器中输入时,我收到一个错误(连同's)说:$requestGET/user/:usernamevar_dump($request)var_dump($sql)bool(false)Userslocalhost/user/joevar_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-入门/ . 他声明了路由,然后使用了一个类似的函数getWine($id),这基本上就是我想要实现的——但是对于用户数据库。我也在使用mysqliwhere 他正在使用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领域?

4

2 回答 2

1

老实说,我实际上已经有一段时间没有使用 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();
于 2013-07-11T23:35:23.197 回答
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();
});

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

于 2013-07-12T15:16:29.850 回答