准备语句查询没有结果

时间:2013-07-14 00:50:19

标签: php sql mysqli prepared-statement

我是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;

非常感谢任何帮助。

1 个答案:

答案 0 :(得分: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的用户名)。

好像你的代码有效吗?