使用" Prepare Statment"

时间:2015-08-08 16:35:38

标签: php function mysqli null prepared-statement

这是我第一次使用prepare statement方法。

问题是该函数返回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,null   在"

中给出

我不知道问题是什么!

最新结果:

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;
} 
  

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

1 个答案:

答案 0 :(得分:1)

几乎所有事情都没问题,除非你不能像你那样从fetch语句中获得结果。

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

对于这两种解决方案:
在sql语句中,您可以选择所需的特定字段或所有字段:

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

或所有字段如:

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

解决方案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 ) 

解决方案2:
我们保留了之前删除的2行,但是添加了包含从数据库中获取的值的变量,它应该与SELECT语句中的顺序相同,如果你选择了星号(*)那么你需要按数据库顺序写入所有字段。我们的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变量,您可以将所有或部分结果放入数组并返回它甚至返回单个值,这取决于您。

解决方案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变量,您可以将所有或部分结果放入数组并返回它,甚至返回单个值。这取决于你。

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