这是我第一次使用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 回答
几乎所有的东西都没问题,除了你不能像你那样从fetch语句中得到结果 .
一切都取决于您的登录功能如何工作,您可以通过多种方式实现,我将演示3个示例并由您自己决定:
For both solutions:
在sql语句中,您可以选择所需的特定字段或所有字段:
或者所有领域如:
Solution 1:
更换
有了这个
并调用您的登录方法/功能,我为测试注入了一个测试用户:
我从我的虚拟测试数据库得到的结果,一个包含数据库表中关于特定用户的所有字段数据的数组,如下所示(我在
SELECT
语句中使用了star *):Solution 2:
我们保留了之前删除的2行,但添加了包含从数据库中获取的值的变量,它应该与
SELECT
语句中的顺序相同,如果选择star(*)则需要写入所有字段数据库顺序 . 我们的bind_result
语句将向我们提供数据库的结果,如果您错过了一个字段,它将无法工作并返回错误 .更换
有了这个
如果您需要用户电子邮件地址,然后使用
$db_email
变量,您可以将所有或部分结果放入数组并返回它甚至返回单个值,这取决于您 .Solution 3
该解决方案组合1和2 .
更换
有了这个
同样在这里,如果你需要用户的电子邮件地址,那么使用
$db_email
变量,你可以将所有或部分结果放在数组中并返回它甚至返回一个值 . 它是由你决定 .Note:
为了减少测试失败的机会,我在测试时已经禁用了
sanitize($username)
和md5($password)
. 所以我只使用纯文本,只是为了测试并查看一切是否按预期工作 . 作业完成后,您可以再次激活它们 . 我建议您也使用替代哈希解决方案,因为md5被认为对密码不安全 . 有关Best Practices的信息,请参见PHP手册页 .