我遇到了一些麻烦。我正在研究一个小型的cms。当我登录一切都很好。但如果我坐在那里会议似乎要求我在3分钟后再次登录。所以我试着实现一个记住我的功能。而且也没有运气。它还需要我登录。
在我的函数中,我有以下代码片段。
function logged_in(){
if(isset($_SESSION['email']) || isset($_COOKIE['email'])){
return true;
} else {
return false;
}
}
然后我创建了另一个函数,如果页面需要登录而你没有登录。它将重定向。
function require_loggin(){
if (logged_in()) {} else {
redirect(ROOT_URI);
}
}
现在在需要登录的所有页面上,我都在页面的标题中有这个。
<?php require_loggin(); ?>
这是我登录页面的发布数据。
$email = clean($_POST['email']);
$password = clean($_POST['password']);
$remember = isset($_POST['remember']);
最后我的登录。
function login_user($email, $password, $remember){
$active = 1;
$connection = dbconnect();
$stmt = $connection->prepare('SELECT user_pwd, user_email, uid, username FROM users WHERE user_email = ? AND active= ?');
$stmt->bind_param('ss', $email, $active);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows == 1) {
$row = $result->fetch_array();
$db_password = $row['user_pwd'];
if (password_verify($password, $db_password)) {
if($remember == "on") {
setcookie('email', $email, time() + 86400);
}
$_SESSION['uid'] = $row['uid'];
$_SESSION['email'] = $row['user_email'];
$_SESSION['username'] = $row['username'];
return true;
} else {
return false;
}
return true;
} else {
return false;
}
}
一切正常,没有错误。登录和注销都很好..
问题是,一旦他们登录,默认会话将在大约4分钟内消失,如果他们没有点击链接。并记住我的功能不会工作..我读了一些默认会话应该持续约30分钟的地方。但会议要求在4分钟后不通过网站登录。
有人向我提到垃圾收集,但我不得不承认我完全迷失了它。
我仍然是相当新的PHP,我想学习正确的方法,而不是错误的方式。我的项目工作得很好,我无法让用户登录或让我记住我的功能。
答案 0 :(得分:6)
我建议创建一个应用程序配置文件..将其命名为config.php
并将其包含在页面顶部。就像您的应用程序一样简单,我假设您没有使用自动加载程序。在其中包含以下snippit:
<?php
/**
* File: config.php
* This file should be included in every php script to configure the session. Like this:
* require_once('config.php');
*/
/*
* This is 30 minutes. The length only depends on the requirements of
* your application.
*/
$sessionLength = 30 * 60;
ini_set(’session.gc_maxlifetime’, $sessionLength);
ini_set(‘session.gc_maxlifetime’,30);
session_set_cookie_params($sessionLength , "/", "yourdomain.com")
session_name('PHPSESSION');
session_start();
//This will force the cookie to reset with a new timeout on every page load.
setcookie( session_name(), session_id(), time() + $sessionLength );
?>
答案 1 :(得分:4)
更新
编辑问题的第9号已经非常显着地改变了这个问题,这个答案(以及大多数其他答案)已不再适用。
这个答案是对问题的第7号编辑的回应(当赏金开始时)。
将此留在此处,以便访问者知道为什么有这么多的答案和评论与会话长度&#34;当问题,就目前而言,并未引用它。在结束时会删除答案。
在浏览器中运行以下php文件:
<?php
echo 'Session Cookie Lifetime: '. ini_get('session.gc_maxlifetime') . ' (The number of seconds after which data will be seen as \'garbage\' and potentially cleaned up.)<br>';
echo 'Session Cookie Lifetime: '. ini_get('session.cookie_lifetime') . ' ( the lifetime of the cookie in seconds which is sent to the browser. The value 0 means "until the browser is closed.")<br>';
phpinfo();
?>
如果顶部的两个值中的任何一个是&#34;大约4分钟&#34; (240秒)然后你需要在PHP配置中调整它们。
如果失败,下面的phpinfo()
输出应该告诉您需要查找的所有信息:例如:
答案 2 :(得分:3)
基于您的问题的最新编辑(9),以及现在的代码框(请停止编辑问题和代码 - 如果它发生了很大变化,请创建一个新问题!)
您对login_user($email, $password)
的调用未按照声明中的预期传递$remember
变量
function login_user($email, $password, $remember)
所以它永远不会设置cookie。
提示:
echo $remember . "<br>";
或echo "I'm Here<br>;
或echo "I'm at " . __FILE__ . "/" . __LINE__ . "<br>";
或类似内容,以便了解其跟踪的位置。你会发现它永远不会进入“setcookie”行error_reporting(E_ALL);
和ini_set('display_errors', 'on');
因为这会显示您的问题session_start()
会话并自己完成所有这些)但是如果你不是100%确定你的逻辑和安全性,并且考虑到base64_decode问题,那么建议你应该使用库。希望你的verify_password
不是自编的,而是商业的?非常适合学习,但如果您希望它能够上线,请让人在启动之前检查代码。(请不要再改变问题了!没有人愿意帮助你。)
答案 3 :(得分:2)
首先尝试在您的&#39; session_start()&#39;之前添加此行。语句:
session_set_cookie_params(3600,"/");
如果这不起作用,您有3个选项:
1)将php.ini中此行的值更改为1800
session.gc_maxlifetime
2)将它放在.htaccess文件中:
php_value session.cookie_lifetime 1800
php_value session.gc_maxlifetime 1800
1800秒,所以它是半小时。
3)如果您无法访问.htaccess,可以将其放入标题中:
ini_set('session.cookie_lifetime','1800');
Debian有一个cron作业,可以自动使安全措施的会话失效。如果你使用Debian检查/etc/cron.d/php *
资源:
http://php.net/manual/en/session.configuration.php#ini.session.cookie-lifetime http://php.net/manual/en/function.session-set-cookie-params.php
答案 4 :(得分:0)
你还没有提到你如何使用logged_in函数?
当您关闭浏览器时,您的会话将被销毁,因此用户ID,用户名,电子邮件值将为空
检查cookie值是否基于cookie值设置后,您必须从数据库中获取相应的值并在会话中设置值。你必须遵循这种流程来实现持久登录系统。
我希望这个答案可以帮助你理解这个登录系统。
答案 5 :(得分:0)
检查罗比的回答。
如果您无法调整PHP配置,您也可以使用HTTP Auth。它不会过期。但是,在这种情况下,每次访问者请求网页时都会传输密码。
答案 6 :(得分:-3)
这是处理此问题的错误方法。 为了实现cookie自动登录,您应该将所有必需的登录数据存储在cookie中。但是你必须加密它们以防止以后出现问题。
示例Cookie:
toke = USER_ID:USER_NAME:HASHED_PASSWORD
冒号是分隔符,因此您可以使用explode来获取登录令牌的组件。然后,您可以使用数据库条目检查这些信息。
祝你好运!