2010-04-14 241 views
1

我正在創建一個新的登錄腳本/ members目錄。PHP錯誤 - 登錄腳本

我從頭開始創建它沒有任何框架(關於這個問題的建議也將不勝感激)。

的情況:

// Look up the username and password in the database 
    $query = "SELECT admin_id, username FROM admin WHERE adminname = '$admin_user' AND password = SHA1('$admin_pass')"; 
    $data = mysqli_query($dbc, $query); 

    if (mysqli_num_rows($data) == 1) { 

這段代碼一直給我一個錯誤(尤其是最後一行):

Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in /home8/craighoo/public_html/employees/security/dir_admin.php on line 20 

當呼應查詢我得到:

SELECT admin_id, adminname FROM admin WHERE adminname = 'admin' AND password = SHA1('password') 

編輯: 感謝大家。問題出在我的數據庫列名和我引用的列名。

+2

我假設你正在使用PHP會議確保運行(如果你不應該!)會話成功登錄後的session_regenerate_id()以防止已知漏洞。 – TravisO 2010-04-14 18:04:06

+2

而不是在數據庫中運行SHA散列,我建議您使用PHP的SHA函數,特別是如果數據庫服務器位於另一個盒子上,因爲您將密碼從Web服務器以純文本的形式發送到數據庫,即使它在您的網絡,它仍然是一個漏洞。 – TravisO 2010-04-14 18:05:49

+1

旁註:您可能需要查看一下準備好的語句(http://php.net/manual/en/pdo.prepared-statements.php)以避免SQL注入攻擊。 – pinkgothic 2010-04-14 18:08:39

回答

3

你的查詢執行失敗。發生這種情況時mysqli_query返回false(布爾值),當傳遞給mysqli_num_rows時,會出現此錯誤。

在執行之前打印查詢並檢查正確性。

+0

謝謝,我更新了原來的問題,現在正在查看我的SQL。 – 2010-04-14 18:03:08

+0

修正了它。感謝提醒,有時我忘記了調試的基本規則。 – 2010-04-14 18:07:03

2

考慮到mysqli_query失敗時返回false,並且$ data是一個布爾值,在這裏,我想在執行SQL查詢期間發生錯誤。

你可以嘗試使用mysqli_error找出這個錯誤是:

$data = mysqli_query($dbc, $query); 
if ($data !== false) { 
    // Do whatever you want with $data 
    if (mysqli_num_rows($data) == 1) { 
     // 
    } 
} else { 
    echo mysqli_error($dbc); 
    die; 
} 


注:呼應的錯誤信息和垂死的,像我一樣在這裏,是OK,同時深化發展腳本;但你不應該在生產中這樣做。

相反,在生產中,你應該:

  • 錯誤記錄到文件
  • 顯示一個友好的信息給用戶
+0

謝謝,我更新了原來的問題,現在正在查看我的SQL。 – 2010-04-14 18:03:27

+0

很高興看到您解決了您的問題:-) – 2010-04-14 18:11:20

0

您是否嘗試過通過phpmyadmin或控制檯手動運行相同的查詢?你會得到什麼結果?

1

當你有一個關鍵的查詢,這是最好的一個芯片添加到它,像這樣:

mysqli_query($dbc, $query) or die('Critical error on line #'. __LINE__ .' when attempting to login ...<br>'. mysql_error());