会话user_name将无法启动或工作

时间:2015-12-04 14:10:55

标签: php session

我是StackOverflow的新手,所以如果我需要对我的文章做一些更新,请通知我。

我的问题是echo $row_settings['user_name']; 要么 echo $_SESSION['user_name'];正在回复。我已经搜索了一段时间,似乎无法找到问题。

这是我的DBC.php脚本

<?php

define ("DB_HOST", "fomo.no.mysql"); // set database host
define ("DB_USER", "fomo_no"); // set database user
define ("DB_PASS","******"); // set database password
define ("DB_NAME","fomo_no"); // set database name

$link = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die("Couldn't make connection.");
$db = mysql_select_db(DB_NAME, $link) or die("Couldn't select database");


$user_registration = 1;  // set 0 or 1

define("COOKIE_TIME_OUT", 10); //specify cookie timeout in days (default is 10 days)
define('SALT_LENGTH', 9); // salt for password

//define ("ADMIN_NAME", "admin"); // sp

/* Specify user levels */
define ("ADMIN_LEVEL", 5);
define ("USER_LEVEL", 1);
define ("GUEST_LEVEL", 0);


/**** PAGE PROTECT CODE  ********************************
This code protects pages to only logged in users. If users have not logged in then it will redirect to login page.
If you want to add a new page and want to login protect, COPY this from this to END marker.
Remember this code must be placed on very top of any html or php page.
 ********************************************************/

function page_protect() {
    session_start();
    $user = $_SESSION['user_name'];
    global $db;

    /* Secure against Session Hijacking by checking user agent */
    if (isset($_SESSION['HTTP_USER_AGENT']))
    {
        if ($_SESSION['HTTP_USER_AGENT'] != md5($_SERVER['HTTP_USER_AGENT']))
        {
            logout();
            exit;
        }
    }

// before we allow sessions, we need to check authentication key - ckey and ctime stored in database

    /* If session not set, check for cookies set by Remember me */
    if (!isset($_SESSION['user_id']) && !isset($_SESSION['user_name']) )
    {
        if(isset($_COOKIE['user_id']) && isset($_COOKIE['user_key'])){
            /* we double check cookie expiry time against stored in database */

            $cookie_user_id  = filter($_COOKIE['user_id']);
            $rs_ctime = mysql_query("select `ckey`,`ctime` from `users` where `id` ='$cookie_user_id'") or die(mysql_error());
            list($ckey,$ctime) = mysql_fetch_row($rs_ctime);
            // coookie expiry
            if( (time() - $ctime) > 60*60*24*COOKIE_TIME_OUT) {

                logout();
            }
            /* Security check with untrusted cookies - dont trust value stored in cookie.
            /* We also do authentication check of the `ckey` stored in cookie matches that stored in database during login*/

            if( !empty($ckey) && is_numeric($_COOKIE['user_id']) && isUserID($_COOKIE['user_name']) && $_COOKIE['user_key'] == sha1($ckey)  ) {
                session_regenerate_id(); //against session fixation attacks.

                $_SESSION['user_id'] = $_COOKIE['user_id'];
                $_SESSION['user_name'] = $_COOKIE['user_name'];
                /* query user level from database instead of storing in cookies */
                list($user_level) = mysql_fetch_row(mysql_query("select user_level from users where id='$_SESSION[user_id]'"));

                $_SESSION['user_level'] = $user_level;
                $_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);

            } else {
                logout();
            }

        } else {
            header("Location: login.php");
            exit();
        }
    }
}

function logout()
{
    global $db;
    session_start();

    $sess_user_id = strip_tags(mysql_real_escape_string($_SESSION['user_id']));
    $cook_user_id = strip_tags(mysql_real_escape_string($_COOKIE['user_id']));

    if(isset($sess_user_id) || isset($cook_user_id)) {
        mysql_query("update `users`
            set `ckey`= '', `ctime`= ''
            where `id`='$sess_user_id' OR  `id` = '$cook_user_id'") or die(mysql_error());
    }

    /************ Delete the sessions****************/
    unset($_SESSION['user_id']);
    unset($_SESSION['user_name']);
    unset($_SESSION['user_level']);
    unset($_SESSION['HTTP_USER_AGENT']);
    session_unset();
    session_destroy();

    /* Delete the cookies*******************/
    setcookie("user_id", '', time()-60*60*24*COOKIE_TIME_OUT, "/");
    setcookie("user_name", '', time()-60*60*24*COOKIE_TIME_OUT, "/");
    setcookie("user_key", '', time()-60*60*24*COOKIE_TIME_OUT, "/");

    header("Location: login.php");
}


?>  

我的代码错了吗?它仅用于显示来自数据库的其他信息,而不是使用$_SESSION['user_name']。它就像会话用户名尚未启动或者什么?

非常感谢您的时间和帮助

2 个答案:

答案 0 :(得分:1)

您网页上实际发生的一切似乎都发生在多个功能中,但您的功能 实际上并没有被调用以在页面加载时运行

session_start需要在任何会话引用之前和生成任何浏览器输出之前运行。通常位于代码页的最顶层。

其他注释:

  • session_start();应该在其所在的函数之外(page_protect),否则你已经设置了要求必须首先在页面上运行的要求加载。

  • 您的header()重定向后应紧跟dieexit语句,以停止脚本处理。

  • 请使用 MySQLi 而不是MySQL进行研究,因为后者已弃用。也开始探索PDO /而不是。

  • 代码的各个方面都非常陈旧(2010)并且确实应该进行改进,例如设置salt(尽可能自动完成而不是在用户函数中。

  • 避免使用globals

  • 避免使用['HTTP_USER_AGENT'],因为这些值并不总是从浏览器传递到服务器。

您能否在页面上显示实际调用函数的位置(具体为page_protect())?

答案 1 :(得分:0)

1。)session_start()应该是php中代码的第一行,无论如何session_start()必须在你尝试检查任何会话变量之前出现。

2。)你将session_start()放在一个函数中,该函数在被调用之前不会运行。从这一行上的该功能开始

if (isset($_SESSION['HTTP_USER_AGENT'])) 您尝试开始检查会话变量,但是session_start()尚未启动,因为它在您未调用的函数内部。因此,所有那些$ _SESSION检查你的行为可能都会失败。

3。)如果你要保留这个结构,那么只需将session_start()添加到代码的第一行并将其从函数中取出。

<?php session_start(); ----&gt;其余的代码。

在更改之后,你仍然需要在某处调用page_protect(),你的代码不会显示被调用的函数。