首页 文章

使用“Prepare Statment”时从函数返回MySQLi查询结果

提问于
浏览
1

这是我第一次使用prepare语句方法 .

问题是该函数返回Nothing“null” .

功能:

function login($username, $password)
{

    $username = sanitize($username);
    $password = md5($password);

    global $connect;

    $stmt = $connect->prepare("SELECT `user_id` FROM `users` WHERE `username` = ? AND `password` = ? ");

    $stmt->bind_param("ss", $username, $password);
    $stmt->execute();

    $stmt->bind_result($id);
    $result = $stmt->fetch();

    $stmt->close();
    $connect->close();

    return $result;
}

我得到的错误:

“mysqli_num_rows()期望参数1为mysqli_result,在”

我不知道是什么问题!


最新结果:

function login($username, $password)
{
    global $connect;

    $stmt = $connect->prepare("SELECT `user_id` FROM `users` WHERE `username` = ? AND `password` = ? ");
    $stmt->bind_param("ss", $username, $password);
    $stmt->execute();

    $result = $stmt->get_result();
    while ($row = $result->fetch_array(MYSQLI_NUM))
    {
        $result[] = $row;
    }

    $stmt->close();
    $connect->close();

    return $result;
}

不能在“$ result [] = $ row;”中使用mysqli_result类型的对象作为数组

1 回答

  • 1

    几乎所有的东西都没问题,除了你不能像你那样从fetch语句中得到结果 .

    一切都取决于您的登录功能如何工作,您可以通过多种方式实现,我将演示3个示例并由您自己决定:

    For both solutions:
    在sql语句中,您可以选择所需的特定字段或所有字段:

    SELECT `user_id`, `email`, `username`, `password` FROM `users`......etc...
    

    或者所有领域如:

    SELECT * FROM `users`......etc...
    

    Solution 1:
    更换

    $stmt->bind_result($id);
    $result = $stmt->fetch();
    

    有了这个

    $output = $stmt->get_result();
    while ($row = $output->fetch_array(MYSQLI_NUM))
    {
        $result = $row;
    }
    

    并调用您的登录方法/功能,我为测试注入了一个测试用户:

    print_r(login("user", "1234"));
    

    我从我的虚拟测试数据库得到的结果,一个包含数据库表中关于特定用户的所有字段数据的数组,如下所示(我在 SELECT 语句中使用了star *):

    Array ( [0] => 1 [1] => user@user.com [2] => user [3] => 1234 )
    

    Solution 2:
    我们保留了之前删除的2行,但添加了包含从数据库中获取的值的变量,它应该与 SELECT 语句中的顺序相同,如果选择star(*)则需要写入所有字段数据库顺序 . 我们的 bind_result 语句将向我们提供数据库的结果,如果您错过了一个字段,它将无法工作并返回错误 .

    更换

    $stmt->bind_result($id);
    $result = $stmt->fetch();
    

    有了这个

    $stmt->bind_result($db_user_id, $db_email, $db_username, $db_password);
    $stmt->fetch();
    

    如果您需要用户电子邮件地址,然后使用 $db_email 变量,您可以将所有或部分结果放入数组并返回它甚至返回单个值,这取决于您 .

    Solution 3

    该解决方案组合1和2 .

    更换

    $stmt->bind_result($id);
    $result = $stmt->fetch();
    

    有了这个

    $stmt->bind_result($db_user_id, $db_email, $db_username, $db_password);
    while ($stmt->fetch()) {
        echo $db_user_id;
    }
    

    同样在这里,如果你需要用户的电子邮件地址,那么使用 $db_email 变量,你可以将所有或部分结果放在数组中并返回它甚至返回一个值 . 它是由你决定 .


    Note:
    为了减少测试失败的机会,我在测试时已经禁用了 sanitize($username)md5($password) . 所以我只使用纯文本,只是为了测试并查看一切是否按预期工作 . 作业完成后,您可以再次激活它们 . 我建议您也使用替代哈希解决方案,因为md5被认为对密码不安全 . 有关Best Practices的信息,请参见PHP手册页 .

相关问题