2017-08-03 120 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 –

相關問題