如何在PHP中调试会话/登录错误?

时间:2016-03-12 16:11:25

标签: php

我试图制作一个简单的登录系统而且我被严重困住了。问题在于会话。当我按下登录时,我在登录页面被重定向。现在我可以看到,在登录页面中启动了一个会话.session_id()给出了一些数字。

但受保护的页面显示为NULL。如何在受保护的页面上启动会话?我试图实现一些代码的代码 - 仍然重定向到登录页面。我尝试使用新的空页面,只是页面上的表单,但是使用相同的数据库并仍然重定向到登录页面。

这是登录页面

<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    require('dbcon.php');
    if (isset($_POST['email']) && ($_POST['password'])) {
        $e = mysqli_real_escape_string($dbcon, $_POST['email']);
        $p = mysqli_real_escape_string($dbcon, $_POST['password']);
        $q = "SELECT uid,mail,psword,unm FROM pics WHERE (mail='$e' AND psword=SHA1('$p'))";
        $result = mysqli_query($dbcon,$q);
            if(mysqli_num_rows($result) == 1){
                session_start();
                $uid = mysqli_fetch_array ($result, MYSQLI_ASSOC);
                $_SESSION['uid'] = $uid['uid'];
                header("location: members.php");
                exit();
                mysqli_free_result($result);
                mysqli_close($dbcon);
            }else{
                echo 'no match';
            }
    }else{
        echo 'Empty fields...';
    }
}
?>

这是在“受保护”页面之上

<?php
session_start();
if(!isset($_SESSION['uid'])){
    header("Location:index.php");
}
?>

会话信息

session
Session Support     enabled
Registered save handlers    files user
Registered serializer handlers  php_serialize php php_binary wddx
Directive   Local Value Master Value
session.auto_start  Off Off
session.cache_expire    180 180
session.cache_limiter   nocache nocache
session.cookie_domain   no value    no value
session.cookie_httponly Off Off
session.cookie_lifetime 0   0
session.cookie_path /   /
session.cookie_secure   Off Off
session.entropy_file    no value    no value
session.entropy_length  0   0
session.gc_divisor  1000    1000
session.gc_maxlifetime  1440    1440
session.gc_probability  1   1
session.hash_bits_per_character 5   5
session.hash_function   0   0
session.name    PHPSESSID   PHPSESSID
session.referer_check   no value    no value
session.save_handler    files   files
session.save_path   C:\xampp\tmp    C:\xampp\tmp
session.serialize_handler   php php
session.upload_progress.cleanup On  On
session.upload_progress.enabled On  On
session.upload_progress.freq    1%  1%
session.upload_progress.min_freq    1   1
session.upload_progress.name    PHP_SESSION_UPLOAD_PROGRESS PHP_SESSION_UPLOAD_PROGRESS
session.upload_progress.prefix  upload_progress_    upload_progress_
session.use_cookies On  On
session.use_only_cookies    On  On
session.use_strict_mode Off Off
session.use_trans_sid   0   0

3 个答案:

答案 0 :(得分:1)

我做出的假设没有说明的假设:

  • 表单数据以POST类型提交,并且字符集正确(因此uuu

  • 问题中显示的所有代码都在标题中引用的文件中,并且不在包含和其他“#34;隐藏的角落”中。

一些代码改进

<?php
session_start(); //at the start.
error_reporting(E_ALL); //as suggested by others add error logging
ini_set('display_errors',1); //and debugging to tell you info. 
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    require 'dbcon.php'; //no need for brackets here.
    if (!empty($_POST['email']) && !empty($_POST['password'])) {
        // you had a syntax error here. Also use empty() rather than
        // isset as POSTED forms will still send the data containers
        // even if it contains nothing.
        $e = mysqli_real_escape_string($dbcon, $_POST['email']);
        $p = mysqli_real_escape_string($dbcon, $_POST['password']);
        $q = "SELECT uid,mail,psword,unm FROM pics WHERE mail='$e' AND psword=SHA1('$p')"; //no need for brackets here.
        $result = mysqli_query($dbcon,$q);
            if(mysqli_num_rows($result) == 1){
                $uid = mysqli_fetch_array ($result, MYSQLI_ASSOC);
                if(is_array($uid) && count($uid) > 0){
                    //added a further debug qualifier here 
                    // to check that your SQL result is as expected.
                    $_SESSION['uid'] = $uid['uid'];
                    mysqli_free_result($result); //These occur AFTER the 
                    mysqli_close($dbcon); // exit statement which stops the script. 
                    //so put them before hand. but it's pretty worthless as
                    //mysqli will stop the connection anyway unless 
                    //specifically told otherwise.
                    header("location: members.php");
                     exit();
                      }
                 else {
                  die("your SQL returned an empty result");
                  }
             }else{
                echo 'no match';
            }
    }else{
        echo 'Empty fields...';
    }
}
// removed PHP closing marker.  Unneeded.  

作为一个注释,当你只使用一个值时,为什么要从表中选择4个值?

目标网页

所以现在你已经向我们保证,这些值正被SQL ok抓取并被保存到SESSION ok,所以问题在于在目标页面上找到会话?

首先,开始会议:

然后,正如其他人所说 - 错误日志和调试:

然后看看已将传递给会话处理程序:

session_start(); //always at the start!!!
error_reporting(E_ALL); //always use for error reporting in development
ini_set('display_errors',1); //always!!! 
print_r($_SESSION);

如果此处没有显示任何错误,那么您需要返回登录页面并检查会话是否正确保存,所以:

           $uid = mysqli_fetch_array ($result, MYSQLI_ASSOC);
           $_SESSION['uid'] = $uid['uid'];
           $_SESSION['sausages'] = "roasted";
           ...
           header("location: members.php");
           exit();

然后返回查看此members.php页面上是否显示此静态变量字符串

  • 如果是,那表明您的SQL查询而不是您的会话无效且失败,我不打算进入此处,但足以说明会话不是问题。这里可能的错误是您没有在数据库中正确存储散列值(SHA1)。但是,如果发生SQL错误,我们需要更多信息来提供具体的帮助。

  • 如果没有出现那么确实表明会话问题或文件处理问题,主要是你需要有一个明确的路径,代码在文件结构中,是&#34;受保护的& #34;您在页眉中引用的页面中实际显示的页面代码,此页面与登录页面位于同一目录中(而不是任何mod_rewrite jibjag等)?

告诉我这对于确定问题的确切位置有何启发。

在其他说明中,值得注意的是您的密码系统不符合生产质量,应采用不同的方法。请研究StackOverflow。

修改

会议详情:

  • session.cookie_httponly转为on
  • 检查文件夹会话是否存储在(C:\xampp\tmp)中是否具有所有读写和执行设置(chmod 0777)。
  • session.use_strict_mode更改为on
  • session.auto_start设为on

虽然我必须承认,除了绝对确定PHP已经允许读取和写入指定的会话目录外,您的会话信息中没有任何内容对我来说是一个可能的原因。

您的服务器日志(在您的计算机上运行PHP的程序)是否有任何错误/警告?

你可以找到一个好的explanation of chmod here

THIS POST也可能给你很多帮助。

答案 1 :(得分:0)

这是行标题(&#34; location:members.php&#34;);工作?

我真的不需要以下几行:

exit();
mysqli_free_result($result);
mysqli_close($dbcon);

因为您的网页已被重定向。

现在,你究竟在members.php页面写了什么? 如果我的想法是正确的,您是否已将此受保护的页面包含在members.php之上?

答案 2 :(得分:0)

我是html5锅炉板,打开了一个新项目,我开始逐个添加html文件。在我开始编码登录之前,我有一个网站的备份。然后我复制了php代码。然后css和js files。到目前为止,只要我不更改文件夹的名称,登录就可以使用相同的代码。我希望它能保持这种状态。谢谢你的时间和帮助。我很感激