我正在为我的项目创建一个新网站。我创建了一个index.php页面并设置了一个登录表单,并将表单操作设置为log.php页面。登录后,还必须转到account.php页面。它适用于本地服务器。但是当我上网时,登录时会在log.php页面中显示空白页面。但是登录发生了,如果我通过在地址栏中输入来转到account.php,它可以正常工作。与注册页面相同。
这是Log.php代码:
<?php
include("connection.php");
extract($_POST);
$password=md5($_POST['password']);
$query=mysql_query("SELECT * from register WHERE username='$username' and password='$password'");
$numrows=mysql_num_rows($query);
if($numrows!=0)
{
$info = mysql_fetch_array($query);
session_start();
$_SESSION[username]=$username;
$_SESSION[fname]=$info['fname'];
$_SESSION[lname]=$info['lname'];
$_SESSION[email]=$info['email'];
header("location:account.php");
}
else
header("location:login.php?i=invalid");
?>
答案 0 :(得分:1)
首先,逃避你的params以防止SQL注入,考虑解析像
这样的东西 '; DROP DATABASE xxxxx;
作为用户名;
同样不要提取所有的变量 - 只有那些你需要的东西(如果你使用某个未经初始化的变量或用isset()检查它可能是危险的,有人可以创建一个。
对于你的问题:
然后,在<?php
之前检查您的文件中的字符。签名<
应该是你代码中的第一个字节,因为如果你的服务器上有输出缓冲 - 你不能改变已经发送的头 - 我的意思是,当解析器看到一些注销掉php结构时,它会发送具有该数据的200 OK代码(不是30x重定向)。也许你在文件开头有一个看不见的BOM(一些特殊字符表示文件是用unicode编码的),尝试用例如notepad ++进行编辑来检查它。
它也与connection.php有关,因为包含了该文件。
尝试启用error_reporting(E_ALL);看看你有“标题已发送”错误。
使用$_SESSION['lname']
而非$_SESSION[lname]
。
不需要if($numrows!=0)
,if($numrows)
它更干净(在我看来)。
如果您写SELECT * from
,请尝试保留您的约定,然后您应该写SELECT * FROM
。
从仅限数据库获取您需要的字段,因此SELECT username,fname,lname,email
不是*
(此处不需要密码,如果您在此表中添加了一些字段,那么这些字段不应该是在这里转发)
您甚至不需要检查行数:
$numrows=mysql_num_rows($query);
if($numrows!=0) {
$info = mysql_fetch_array($query);
只需检查一行是否已被检索:
$info = mysql_fetch_array($query);
if($info)
{
如果你只使用$ info表的文本索引,请使用mysql_fetch_assoc而不是mysql_fetch_array(第二个也创建索引0,1,2,依此类推,使用相同的数据。