我是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']
。它就像会话用户名尚未启动或者什么?
非常感谢您的时间和帮助
答案 0 :(得分:1)
您网页上实际发生的一切似乎都发生在多个功能中,但您的功能 实际上并没有被调用以在页面加载时运行 。
session_start
需要在任何会话引用之前和生成任何浏览器输出之前运行。通常位于代码页的最顶层。
session_start();
应该在其所在的函数之外(page_protect
),否则你已经设置了要求必须首先在页面上运行的要求加载。
您的header()
重定向后应紧跟die
或exit
语句,以停止脚本处理。
请使用 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(),你的代码不会显示被调用的函数。