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