2012-01-09 310 views
1

可能重複:
mysql_fetch_array() expects parameter 1 to be resource, boolean given in selectPHP登錄腳本,PHP的安全登錄會話

我仍然爲我的網站創建一個PHP登錄腳本掙扎。我得到讀取爲誤差修改如下:

警告:mysql_num_rows()預計參數1是資源,布爾線在給定/Applications/XAMPP/xamppfiles/htdocs/xponline/loginproc.php 13

警告:無法修改標頭信息 - 已在第21行的/Applications/XAMPP/xamppfiles/htdocs/xponline/loginproc.php中發送的標頭(輸出開始於/Applications/XAMPP/xamppfiles/htdocs/xponline/loginproc.php:13)

這是我的驗證頁面代碼:

<?php 

// Inialize session 
session_start(); 

// Include database connection settings 
include('config.inc'); 

// Retrieve username and password from database according to user's input 
$login = mysql_query("SELECT * FROM user WHERE (\ 
    username = '" . mysql_real_escape_string($_POST['username']) . "') and \ 
    (password = '" . mysql_real_escape_string(md5($_POST['password'])) . "')"); 

// Check username and password match 
if (mysql_num_rows($login) == 1) { 
// Set username session variable 
$_SESSION['username'] = $_POST['username']; 
// Jump to secured page 
header('Location: default_1.php'); 
} 
else { 
// Jump to login page 
header('Location: index.php'); 
} 

?> 

13號線是:​​

if (mysql_num_rows($login) == 1) { 

請幫助:-(

+0

打印您的選擇查詢有錯誤。 – Bajrang 2012-01-09 12:35:21

+0

每行不得超過80(更現代,100)字符。順便說一句,每當你問一個問題時,你必須接受一個答案:請訪問你的一些過去的問題(可通過你的個人資料訪問)並接受任何幫助你的答案。 – Hossein 2012-01-09 12:43:03

+0

'$ _SESSION ['username'] = $ _POST ['username'];'小心,如果您輸出到屏幕上,如果用戶命名爲'' – DampeS8N 2012-01-09 13:21:06

回答

0

mysql_query()將返回失敗時FALSE ......這似乎發生。

0

的mysql_query會在某些情況下,返回一個布爾值,而不是一個MySQL的結果:

對於SELECT,SHOW,描述,解釋等語句返回 結果集,請求mysql_query()成功返回的資源,或FALSE在 錯誤。

您的代碼正在等待資源,但由於查詢失敗,您將獲得FALSE。

查看mysql_error()()以查明初始查詢出了什麼問題。

Warning: Cannot modify header information - headers already sent by (output started at /Applications/XAMPP/xamppfiles/htdocs/xponline/loginproc.php:13) in /Applications/XAMPP/xamppfiles/htdocs/xponline/loginproc.php on line 21 

只不過是由你的PHP腳本輸出的錯誤信息(用於MySQL查詢),然後嘗試寫頭的事實引起的。在設置標題之前,您無法輸出任何內容。

0

第一個警告mysql_num_rows() expects parameter 1 to be resource意味着您的查詢沒有返回任何結果。 echo $login;,看看你是否可以在你的SQL控制檯(例如phpMyAdmin)中執行它。

第二個警告,Cannot modify header information很可能是由於之前的警告引起的。由於第一次警告發送了一些文本輸出,header(...)給你這樣的警告。如果在運行代碼期間沒有發出警告和錯誤,則header不會發出此類警告。

順便說一下,md5現在可以輕鬆破解。使用更安全的方式(SHA)獲得更多的安全性。並請注意,mysql_real_escape_string alone is not enough to protect agains SQL injections

1

首先,在調試PHP代碼時,總是嘗試按報告的順序解決錯誤。

因此,開始的第一個:

警告:mysql_num_rows()預計參數1是資源,布爾在...給出線...

顯然,傳遞給mysql_num_rows的第一個參數(值爲$login)是布爾值而不是資源。讓我們看看沒有$login得到了它的價值分配,其中:

$login = mysql_query("…"); 

顯然,mysql_query並返回一個布爾值,而不是一個資源。在manual page for mysql_query你可以閱讀:

對於SELECT,SHOW,描述,解釋等語句返回的結果集,mysql_query()成功返回的資源,或者在錯誤FALSE。

當你執行SELECT語句和mysql_query沒有回resource而是一個布爾值,查詢必須已經失敗,原因是一個錯誤。

要得到的錯誤,你可以失敗呼叫mysql_error

if ($login) { 
    echo mysql_error(); 
} 

請注意,您應該只打印MySQL錯誤消息調試的目的,但從來沒有在實際環境中。

1

錯誤是說預計資源類型,但給出了布爾值。

現在,如果你去檢查php.net(http://www.php.net/manual/en/function.mysql-query.php)上的mysql_query參考,你可以看到,當你執行一個查詢資源被返回,但在某些情況下,它reeturn FALSE,從php.net網站:

的mysql_query()也將失敗並返回FALSE,如果用戶沒有權限訪問被引用的表(一個或多個)查詢。

然後可能是問題是: 1.您沒有正確連接到服務器?

您可以使用mysql_error從如何使用mysql_error功能php.net現場檢查錯誤http://php.net/manual/en/function.mysql-error.php

下面的例子:

<?php 
$link = mysql_connect("localhost", "mysql_user", "mysql_password"); 

mysql_select_db("nonexistentdb", $link); 
echo mysql_errno($link) . ": " . mysql_error($link). "\n"; 

mysql_select_db("kossu", $link); 
mysql_query("SELECT * FROM nonexistenttable", $link); 
echo mysql_errno($link) . ": " . mysql_error($link) . "\n"; 
?> 

正如你可以看到使用該功能很簡單,你只需要使用用於mysql連接的資源變量來調用該函數。 而且還說不定這一段代碼可以幫助你(這又是從php.net網站)

<?php 

$link = mysql_connect("localhost", "mysql_user", "mysql_password"); 
mysql_select_db("database", $link); 

$result = mysql_query("SELECT * FROM table1", $link); 
$num_rows = mysql_num_rows($result); 

echo "$num_rows Rows\n";  
?> 

希望這有助於。