2013-04-21 149 views
0

任何人都可以請幫我解決以下錯誤。我正在爲我的網站製作註冊和登錄功能。我把它連接到我的本地數據庫,並在那裏創建了一個用戶。當我測試我可以登錄並且該用戶名和密碼被識別時,它按預期工作。但是,我得到這個錯誤無法解決PHP錯誤信息

Warning: mysql_result(): Unable to jump to row 0 on MySQL result index 17 in C:\xampp\htdocs\LoginAndRegistration\core\functions\users.php on line 34 

這是我對線路34

return (mysql_result(mysql_query("SELECT * FROM users WHERE username = '$username' AND password = '$password'"), 0) == 1) ? true : false; 

這是以下功能的一部分

function login($username, $password) { 
    $user_id = user_id_from_username($username); 

    $username = sanitize($username); 
    $password = md5($password); 

    return (mysql_result(mysql_query("SELECT * FROM users WHERE username = '$username' AND password = '$password'"), 0) == 1) ? true : false; 
} 

我一直都現在盯着它的年齡但似乎無法找出問題。誰能告訴我我做錯了什麼? 謝謝

+4

mysql_ *已棄用。請使用mysqli_ *或PDO對象。 – christopher 2013-04-21 11:09:41

+0

只有使用md5散列密碼是不夠的。改用bcrypt。我希望你在'sanitize'內調用'mysql_real_escape_string'。 – 2013-04-21 11:11:49

+0

如果沒有找到該行,代碼會發生什麼情況? – 2013-04-21 11:13:00

回答

1

這行代碼看起來像要檢查做用戶名和密碼存在。您需要將您的代碼更改爲:

return (mysql_result(mysql_query("SELECT COUNT(id) FROM users WHERE username = '$username' AND password = '$password'"), 0) == 1) ? true : false; 

還要將(id)更改爲您的id列名稱。

+0

Thanks for this。原來我有一些語法錯誤,以至於我不得不解決。必須從FROM'用戶'更改WHERE TO FROM用戶WHERE – heyred 2013-04-24 11:01:31

1

此錯誤表示查詢失敗。經常檢查,如果查詢成功:

$q = mysql_query("SELECT * FROM users WHERE username = '$username' AND password = '$password'"); 
if ($q) { 
    if ($rows = mysql_num_rows($q)) { 
     // Continue operation, or set a flag 
    } else { 
     // No matching rows, throw an Exception or set a flag 
    } 
} else { 
    // Something is wrong 
    die(mysql_error()); 
} 
+0

如果你必須使用mysql_ *函數結合Timonthy在這裏所說的和Adrian在下面做的。 IE使用if(!$ q)打印任何錯誤,並使用mysql_num_rows來檢查在數據庫中是否找到用戶/傳遞組合。 – 2013-04-21 11:17:31

+0

@ConstantineLoukas阿德里安的答案與我的。不能確切地記住它是如何工作的(上次我使用mysql庫是相當久以前),但應該是這樣。 – tyteen4a03 2013-04-21 11:19:12

+0

我會這樣做 $ q = mysql_query(QUERY); 如果($ Q){ 如果(mysql_num_rows($ Q){// 在 登錄}其他{ //不在 登錄}}否則{ 模具(mysql_error());} – 2013-04-21 11:22:23

0

你的錯誤可能來自一個事實,即查詢沒有返回任何結果,因爲在所有有沒有相匹配的用戶名和密碼。

我真的不會將太多的功能塞進對方。它看起來過於複雜,它沒有留出任何空間來添加錯誤處理(例如處理應該發生在你的案例中的情況),並且它弄亂了PHP的錯誤報告,因爲發生的任何錯誤都將在相同的代碼行上。

將東西分散到多行中。對於任何讀取代碼的人來說,它會讓事情變得更加清晰,從而增強了調試活動,並且由於行長較短,因此通常是一個好主意。

0

你得到一個警告(不是錯誤),因爲的mysql_query在某些時候,它不會返回任何行,所以試圖用mysql_result拿到第一排的時候有沒有行,將提高警告。

你可以試試:

function login($username, $password) { 
    $user_id = user_id_from_username($username); 

    $username = sanitize($username); 
    $password = md5($password); 

    $query = mysql_query("SELECT * FROM users WHERE username = '$username' AND password = '$password'"); 
    if (mysql_num_rows($query) > 0) 
     return true; 
    else 
     return false; 
} 
0

隨着貶值的說法不談,使用mysql_num_rows代替mysql_result。

function login($username, $password) { 
    $user_id = user_id_from_username($username); 

    $username = sanitize($username); 
    $password = md5($password); 

    return (mysql_num_rows(mysql_query("SELECT * FROM users WHERE username = '$username' AND password = '$password'")) == 1) ? true : false; 
} 
0

試試這個

function login($username, $password) { 
$user_id = user_id_from_username($username); 

$username = sanitize($username); 
$password = md5($password); 
$query = mysql_query("SELECT * FROM users WHERE username = '$username' AND password = '$password'") ; 
if (mysql_num_rows($query) > 0) { 

    $data = true ; 
}else { 

    $data = false ; 
} 
return $data ; 
}