警告:mysql_result()期望参数1是资源,给定的对象?
我已经看到了关于如何解决此错误的多个答案,但我不知道如何将它应用到我的代码:警告:mysql_result()期望参数1是资源,给定的对象?
function user_exists($username) {
$username = sanitize($username);
global $con;
return (mysql_result(mysqli_query($con, "SELECT COUNT(`user_id`) FROM `users` WHERE `username` ='$username' "), 0) == 1) ? true : false;
}
我觉得它有什么根据这里的答案与mysql_result
做:mysql_result() expects parameter 1 to be resource, object given。我将如何让它在我的代码上工作?
编辑:
function login($username, $password){
$user_id = user_id_from_username($username);
global $con;
$username = sanitize($username);
$password = md5($password);
return (mysqli_num_rows(mysqli_query($con, "SELECT COUNT(`user_id`) FROM `users` WHERE `username`='$username' AND `password`='$password'"))==1) ? $user_id : false;
}
你试图混合mysql
和mysqli
的API,这是无效的。 mysqli
中没有任何内容与mysql_result()
直接等价。
正确使用mysqli
,包括使用准备好的语句(所以不需要消毒)。
function user_exists($username) {
global $con;
$stmt = mysqli_prepare($con, "SELECT COUNT(*) FROM users WHERE username = ?");
mysqli_stmt_bind_param($stmt, "s", $username);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $count);
mysqli_stmt_fetch($stmt);
return $count == 1;
}
如果你真的想用mysqli_num_rows
,不要在查询中使用COUNT()
,因为它总是返回包含匹配的计数的单个行。
return mysqli_num_rows(mysqli_query($con, "SELECT 1 FROM `users` WHERE `username`='$username' AND `password`='$password'")) == 1;
但是,这是一个糟糕的方式来做到这一点,因为你没有使用准备好的语句。
您也不应该使用MD5
进行密码散列,请使用PHP的password_hash()
函数。
谢谢。所以我不会在该查询中使用相同的'WHERE username ='$ username'?只是用户名=?“ –
不,这就是'bind_param'的用处。阅读关于准备好的语句的文档。 – Barmar
这看起来不错,我很感激!@Barmar –
不嵌入这样的功能,它使无法正确调试 – rtfm
[我可以在PHP中混合MySQL API?](https://stackoverflow.com/questions/17498216/can-i-mix-mysql -apis-in-php)...你在混合'mysqli_'和'mysql_' ... – Scuzzy
强制性:停止使用mysql_ * – rtfm