2012-01-09 315 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";  
?> 

希望这有助于。