我正在为一个大学项目制作登录屏幕。现在我有这两个文件。
索引.php
<html>
<head>
<meta charset = 'UTF-8'>
<link rel="shortcut icon" href="images/favicon.ico"/>
<title>Sistema de Estágios - UFMS - Login</title>
<link href = "css/bootstrap.css" rel = "stylesheet" >
<link href = "css/index.css" rel = "stylesheet" >
<script src="js/jquery-1.11.1.min.js"></script>
<?php
session_start(); // start session
if(isset($_SESSION["sessioname"]))
{
if($_SESSION["session_time"] >= time()) //time hasn't expired
{
$_SESSION["session_time"] = time() + 60;
header("Location:users.php"); /* Redirect browser */
exit();
}
}
?>
<script type="text/javascript">
$(document).ready(function()
{
$("input").blur(function() // This makes the container's border turn red when it is empty
{
if($(this).val() == "")
{
$(this).css({"border" : "1px solid #F00"});
}
});
$("#botao").click(function()
{
var cont = 0;
$("#form input").each(function()
{
if($(this).val() == "")
{
$(this).css({"border" : "1px solid #F00"});
cont++;
}
});
if(cont == 0)
{
$("#form").submit();
}
});
});
</script>
</head>
<body>
<center>
<center>
<div class = "container">
<div class = "principal">
<form id="form" name="form" method="post" action="entra.php">
<p>
<label for="a">Nome de Usuário:</label>
<input id="a" type ="text" name="username" class="form-control"/><br/>
<label id="name_null" hidden="hidden">O campo deve ser preenchido</label>
</p>
<p>
<label for="b">Password:</label>
<input id="b" type="password" name="password" class="form-control"/><br/>
<label id="pass_null" hidden="hidden">O campo deve ser preenchido</label>
</p>
<buttom id="botao" name="Entrar" value="login" class="btn btn-primary" style="width: 100%;">Login</buttom>
</form>
<label> <a href="register.php"><button class="btn">Cadastre-se</button></a> </label>
</div>
</div>
</center>
</center>
</body>
恩特拉.php
<html>
<head>
<script src="js/jquery-1.11.1.min.js"></script>
</head>
<?php
require_once "config.php"; // include conection to database
$mysqli = new mysqli("localhost", "root", "", "sistema");
// verify if there is a person with the recived name
$Tipo = $_POST['tipo'];
$user_info = mysqli_query($mysqli,"SELECT * FROM users WHERE username='".addslashes($_POST['username'])."'");
if(mysqli_num_rows($user_info) != 0)
{
$result = mysqli_fetch_array($user_info); // put the informations in an array
if($result['password'] == sha1($_POST['password']))// if the password matches
{
session_start(); // começa a seesion
header("Cache-control: private");
$_SESSION["sessioname"] = $_POST['username'];
$_SESSION["auto"] = $result["Tipo"];
$_SESSION["id"]= $result["id"];
$_SESSION["session_time"] = time() + 60;// expiration timne
header("Location: users.php");
die();
}
else
{ // else show an alert
?>
<script type="text/javascript">
alert("Senha incorreta");
</script>
<?php
header("Location: index.php");
die();
}
}
header("Location: index.php");
?>
我正在寻找一种方法来使登录操作发生在index.php
而不是entra.php
上。我还在寻找一种更好的方法来管理会话过期时间。类似于全局变量的东西,因此每当我想更改它进行测试时,我就不必在每个文件上更改它。
我对PHP很陌生,所以我很乐意从你们那里得到一些帮助。
只需将entra.php
代码移动到index.php
文件中,并将表单的Post action
更改为index.php
<form id="form" name="form" method="post" action="index.php">
会话:首先,使用 session_start()
启动会话并存储用户上次发出请求的时间
<?php
$_SESSION['timeout'] = time();
?>
在后续请求中,检查他们发出上一个请求的时间(在本例中为 10 分钟)
<?php
if ($_SESSION['timeout'] + 10 * 60 < time()) {
// session timed out
} else {
// session ok
}
?>
最好的解决方案是实现自己的会话超时。使用一个简单的时间戳来表示上次活动(即请求)的时间,并随每个请求进行更新。
通常管理设置的一个好方法是添加一个像config.php
这样的文件,并将所有这些文件都存储在那里。由于您已经拥有它,因此您可以将所有内容存储在其中。
$_CONFIG["SESSION_EXPIRATION_TIME"] = 86400;
然后,您可以require_once
它或将其包含在 lib 类中。配置文件和不做define("VAR", [val])
的好处是,如果您需要自定义配置,您可以修改变量(假设您有一个测试服务器和一个生产服务器,并且与它们关联的不同数据库 - 您可以轻松地覆盖$_CONFIG
。你不能做很多关于define
)。
此外,有点困难(但有用)的是有一个名为 index.php
的通用文件,并在那里包含所有其他 php 文件(在某种程度上将逻辑与视图(html 代码)分开)。
此外,请mysqli_real_escape_string
以防止用户名上的 SQL 注入。
作为一般规则,最好将逻辑放在单独的文件中并包含它,而不是将其内联到 HTML 中。
如果您希望它是一个文件,您可以随时检查用户是否已记录以及您的变量是否存在。类似的东西。
if(isset($_SESSION["sessioname"]) && $_POST['password'] !== NULL) {
//login code
}
然后将action='entra.php'
更改为action='index.php'
(或者,但最好是完全省略它)。
当然,如果上述内容让您眯眼,您可以随时添加具有一些值的隐藏输入字段:)
哦,总是在你做header('...')
.php后做一个exit()
- 我应该在调用 Location: header 后调用 exit() 吗?
我希望这有所帮助!