2017-08-03 94 views
-2

我已经看到了关于如何解决此错误的多个答案,但我不知道如何将它应用到我的代码:警告: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; 
} 
+0

不嵌入这样的功能,它使无法正确调试 – rtfm

+3

[我可以在PHP中混合MySQL API?](https://stackoverflow.com/questions/17498216/can-i-mix-mysql -apis-in-php)...你在混合'mysqli_'和'mysql_' ... – Scuzzy

+0

强制性:停止使用mysql_ * – rtfm

回答

0

你试图混合mysqlmysqli的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()函数。

+0

谢谢。所以我不会在该查询中使用相同的'WHERE username ='$ username'?只是用户名=?“ –

+0

不,这就是'bind_param'的用处。阅读关于准备好的语句的文档。 – Barmar

+0

这看起来不错,我很感激!@Barmar –

相关问题