PHP登录脚本无法正常工作 - 抛出错误

时间:2012-10-24 11:19:21

标签: php mysql

  

可能重复:
  mysql_fetch_array() expects parameter 1 to be resource, boolean given in select
  Warning: mysql_num_rows() expects parameter 1 to be resource,

我前几天在这里发布了一个问题,因为我的登录脚本只是呈现一个空白页面,我按照建议启用了错误报告并解决了问题,但是现在这是一个不同的问题,当我现在登录它有时只是将我重定向回登录屏幕,如果登录失败,这是重定向的位置(我已经检查过我使用了正确的密码)。偶尔会出现以下错误。

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的新手,所以非常感谢您的帮助,顺便说一下我可能会得到关于将数据库信息直接放在脚本中的评论,这最终将通过连接文件来完成。

5 个答案:

答案 0 :(得分:3)

这些可能是SO上发布的两个最常见的错误。

第一个错误来自查询中的错误,即错误显示在屏幕上。这是由于缺少错误处理,将代码更改为此并修复错误:

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

第二条错误消息是第一条错误消息的结果。由于错误被发送到屏幕,因此标题功能无法工作。

然后当然永无止境的哭不使用mysql_ *函数,因为它们已弃用

答案 1 :(得分:1)

第一条错误消息:使用方法mysql_error()来理解问题

第二条错误消息的出现只是因为php在header()指令之前回显了第一个错误..(在header()指令之前不应该输出任何内容)..所以它是正常的......纠正第一个错误并且你赢了'再见这个了。

答案 2 :(得分:1)

我建议您检查连接是否有效,并将第24行替换为:

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

也许你会发现错误(如果有的话......)!

第二个错误是第一个的结果,没有第一个,第二个不会显示。

答案 3 :(得分:1)

问题是你的查询无效,而你得到的错误就是因为这个。

此查询以某种方式出错:

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

尝试调试查询,通过回显输出并将其粘贴到PHPMyAdmin(或者您正在使用的任何MySQL管理器),并查看它是否运行。这非常适合调试查询。

答案 4 :(得分: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);