2012-10-24 45 views
1

Possible Duplicate:
mysql_fetch_array() expects parameter 1 to be resource, boolean given in select
Warning: mysql_num_rows() expects parameter 1 to be resource,PHP登錄腳本不工作 - 投擲錯誤

我貼在這裏一天一個問題,因爲我的登錄腳本簡單地呈現空白頁,我打開錯誤報告的建議和解決問題,但是現在,這是一個不同的問題,當我登錄時,它有時會將我重定向回登錄屏幕,如果登錄失敗(我檢查了我使用的是正確的密碼),這是重定向的位置。每隔一段時間,儘管它彈出以下錯誤。

Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in /Applications/MAMP/htdocs/PropSuite/login.php on line 24 

Warning: Cannot modify header information - headers already sent by (output started at /Applications/MAMP/htdocs/PropSuite/login.php:24) in /Applications/MAMP/htdocs/PropSuite/login.php on line 26 

這是我的代碼:

<?php 

error_reporting(E_ALL & ~E_NOTICE); 
ini_set('display_errors', TRUE); 
ini_set('display_startup_errors', TRUE); 

session_start(); //must call session_start before using any $_SESSION variables 
$username = $_POST['username']; 
$password = $_POST['password']; 
//connect to the database here 

$hostname_PropSuite = "localhost"; 
$database_PropSuite = "propsuite"; 
$username_PropSuite = "root"; 
$password_PropSuite = "root"; 
$PropSuite = mysql_pconnect($hostname_PropSuite, $username_PropSuite, $password_PropSuite) or trigger_error(mysql_error(),E_USER_ERROR); 
mysql_select_db($database_PropSuite, $PropSuite); 

$username = mysql_real_escape_string($username); 
$query = "SELECT password, salt 
     FROM users 
     WHERE username = '$username';"; 
$result = mysql_query($query); 
if(mysql_num_rows($result) < 1) //no such user exists 
{ 
    header('Location: http://localhost/PropSuite/index.php'); 

    die(); 
} 
$userData = mysql_fetch_array($result, MYSQL_ASSOC); 
$hash = hash('sha256', $userData['salt'] . Hash('sha256', $password)); 
if($hash != $userData['password']) //incorrect password 
{ 
    header('Location: http://localhost/PropSuite/index.php'); 

    die(); 
} 
else 
{ 
    validateUser(); //sets the session data for this user 
} 
//redirect to another page or display "login success" message 
header('Location: your-desired-login-location.php'); 
die() 


//redirect to another page or display "login success" message 


?> 

我是相當新的PHP所以希望得到您的幫助下,我可能會得到關於直接把數據庫信息的腳本註釋的方式,這將通過連接文件最終完成。

+0

[頭已經通過PHP發送(http://stackoverflow.com/questions/8028957/headers-already-sent-by-php) – deceze

+0

HTTP:/ /stackoverflow.com/a/2973209/476 – deceze

+0

提示:不要使用pconnect。在99%的案件中,這是錯誤的選擇。 – Ron

回答

1

第一個問題是下面的查詢:

$query = "SELECT password, salt 
     FROM users 
     WHERE username = '$username';"; 

它在每行拿起白色空間(間隙)。這使它成爲一個無效的查詢,這就是爲什麼這條線不工作:

if(mysql_num_rows($result) < 1) //no such user exists 
{ 
    header('Location: http://localhost/PropSuite/index.php'); 

    die(); 
} 

嘗試更改查詢到在同一行:

$query = "SELECT password, salt FROM users WHERE username = '$username';"; 

對於調試,嘗試將在以下:

$result = mysql_query($query) or die(mysql_error()); 

關於標題,只要發生任何形式的輸出,您都無法發送標題。你可以做下面繞過它:

<?php 
ob_start(); // Start output buffering 

error_reporting(E_ALL & ~E_NOTICE); 
ini_set('display_errors', TRUE); 
ini_set('display_startup_errors', TRUE); 
+0

爲什麼查詢由於空白而無效?我從來沒有遇到與空白有關的問題,而且我的查詢比我更多地分解了我的查詢。 – Kao

+0

林不知道爲什麼,但我有過這個問題。也許它拿起換行符? – Menztrual

+0

也許你在文件/行結尾和數據庫的編碼方面有不匹配?從來沒有自己的問題。 – Kao

1

爲了您的第一個錯誤信息:使用方法mysql_error()理解問題

第二條錯誤信息出現,只是因爲PHP呼應頭()指令之前的第一個錯誤。(什麼應該是一個頭之前outputed ()指令)..所以這是正常的..糾正第一個錯誤,你不會再看到這一個。

1

我建議你檢查是否連接工程,並與替換線24:

$result = mysql_query($query) or die(mysql_error()); 

也許你會發現錯誤(如果有的話......)!

第二個錯誤是第一個錯誤的結果,沒有第一個,第二個錯誤將不會顯示。

3

這些可能是SO上公佈的最常見的兩個錯誤。

第一個錯誤來自查詢中的錯誤,即回顯至屏幕。這是由於缺乏錯誤處理,代碼改變此,修復錯誤:

$query = "SELECT password, salt 
     FROM users 
     WHERE username = '$username';"; 
$result = mysql_query($query) or die mysql_error(); 

第二錯誤消息是第一個的結果。由於錯誤發送到屏幕,標題功能無法工作。

然後當然還有不使用mysql_ *功能上房哭的,因爲他們是棄用

1

問題是您的查詢不能正常工作,並且您得到的錯誤是因爲這個原因。

該查詢故障莫名其妙:

SELECT password, salt 
     FROM users 
     WHERE username = '$username'; 

嘗試調試查詢,通過回輸出並粘貼到的phpMyAdmin(或MySQL經理你使用任何),看看它是否運行。這對調試查詢很有用。