这是我第一次使用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;"
答案 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手册页。