2012-10-24 43 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经理你使用任何),看看它是否运行。这对调试查询很有用。