0

私は mysqli を初めて使用し、オブジェクト指向の方法で PHP を使用しています。また、準備済みステートメントを使用して値を取得することに問題があります。変数を持つPHPクラスがあります:

var $getUsernameStatement;

建設中、私は声明を準備します:

$this->getUsernameStatement = $this->db->prepare("SELECT username FROM users WHERE id = ?;");

その後、値を取得します。

function getUsername($userID) {
    $this->getUsernameStatement->bind_param("i", $userID);
    $this->getUsernameStatement->execute();
    $this->getUsernameStatement->bind_result($username);
    if($this->getUsernameStatement->fetch()) {
        echo("Retrieved username " . $username);
    } else {
        echo("Nope!");
    }
    return $username;
}

少なくともその計画です。次のように既知の適切な ID を渡すと、値が返されないようです。

$user->getUsername(2); // There exists an entry with id 2 in the table

私は何か間違ったことをしていると確信しています (誰のせいでもなく、プログラミングにおける自分自身のせいです) が、それを見つけることができないようです。どんな助けでも大歓迎です。

参考までに、users テーブルの作成に使用する SQL を次に示します。

$sql = <<<SQL
    CREATE TABLE IF NOT EXISTS `users` (
    `id` INT NOT NULL AUTO_INCREMENT ,
    `username` VARCHAR(64) NOT NULL ,
    `email` VARCHAR(128) NOT NULL ,
    `password_hash` VARCHAR(128) NOT NULL ,
    PRIMARY KEY (`id`) ,
    UNIQUE INDEX `id_UNIQUE` (`id` ASC) ,
    UNIQUE INDEX `email_UNIQUE` (`email` ASC) ,
    UNIQUE INDEX `username_UNIQUE` (`username` ASC) );
SQL;

どんな助けでも大歓迎です。

4

1 に答える 1

1

さて、私にとってあなたのコードは機能しているようです...

私はあなたが言ったとおりにしました。構成時に、ステートメントを作成します。$db 変数について何も言わなかったのですが、使用する前に、クラスでデータベース接続を定義して初期化したと思いますか?

class TheClass
{
    private $db;
    private $getUsernameStatement;

    function __construct()
    {
        // Initialise database variable
        $this->db = mysqli_connect("host", "username", "password", "dbname");

        // Prepare the statement
        $this->getUsernameStatement = $this->db->prepare("SELECT username FROM users WHERE id = ?;");
    }

    // Your function, without changes
    public function getUsername($userID) {
        $this->getUsernameStatement->bind_param("i", $userID);
        $this->getUsernameStatement->execute();
        $this->getUsernameStatement->bind_result($username);
        if($this->getUsernameStatement->fetch()) {
            echo("Retrieved username " . $username);
        } else {
            echo("Nope!");
        }
        return $username;
    }
}

次に、クラスをインスタンス化し、メソッドを呼び出してテストします。

$c = new TheClass();
$username = $c->getUsername(2);

取得されたユーザー名 MyUsernameを画面に正常に出力し、$username はMyUsername (テーブル内の ID=2 のユーザー名) と等しくなります。

あなたのコードは機能しているようですか?

于 2013-07-14T01:22:36.240 に答える