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"

2 番目のルート ( )var_dumpで変数を実行しました。これは空の配列です...この変数には何が格納されていますか? その後のすべては、ユーザー名に基づいて正しいユーザーを取得しようとする私の試みです。また、ユーザーがデータベースで正しく検出されていないことを意味する出力も出力します。という名前のデータベース テーブルがあり、データベースに "joe" と "eamon" という 2 人のユーザーを入力しました。ブラウザに入力すると、次のようなエラーが表示されます ( '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を使用する予定です。このプロジェクトの後、ルートでコードをモデル化しています。 1-はじめに/ . 彼はルートを宣言し、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

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 に答える