PHP 登录系统 - 实现 HTML 的正确方法



我目前正在向我正在开发的网站添加一个登录系统,我必须为每个页面添加一个session_start((,以便未登录的用户无法访问它们。

这是"主要.php"的外观:

<?php 
session_start();
if(!isset($_SESSION['status']) || $_SESSION['status']=='false'){
echo '
<!DOCTYPE html>
<html><body style="background:url("img/404.png")"?></body></html>';
}
else{
// Very Long HTML ONLY code displaying the actual page 
} ?>

登录表单位于"index.php"中,并使用javascript进行处理。 注意:$users是由对数据库的 AJAX 调用填充的数组,包含与每个用户相关的所有数据。

$('#logForm').submit(function(){
var $user=document.forms["logForm"]["user"].value;
var $pass=document.forms["logForm"]["pass"].value;
for(var i=0;i<$users.length;i++){
if($users[i]['user'].trim() == $user.trim() && $users[i]['password'] == $pass.trim()){
if($users[i]['status']==1){
$_SESSION['status']=true;
$_SESSION['user']=$user[i]['user'];
return true;
}
else{
alert("Your registration is being processed")
return false;
}
}
}
alert("Wrong Logs");
return false;
});

我的问题非常简单: 对于"main.php",我不想将所有 HTML 代码复制到 php else 括号中,因为它使得更新甚至查看代码的未来更改或更新的情况变得非常不切实际(所有内容都以相同的颜色出现在文本编辑器的 echo 中,我使用的是 Sublime 文本(。 所以我想知道没有更优雅和专业的方式来处理这种情况?

您可以包含其他文件:

else{
// Very Long HTML ONLY code displaying the actual page 
include('index.php');
} ?>

要回答您的问题:是的,您可以将 HTML 添加到您的 PHP 脚本中。

要解决else子句中的问题(为了获得更动态且易于更新的内容(,您可以创建一个单独的文件并在合适的位置include

<?php 
session_start();
if(!isset($_SESSION['status']) || $_SESSION['status']=='false'){
echo '
<!DOCTYPE html>
<html><body style="background:url("img/404.png")"?></body></html>';
}
else {
include 'somepage.html';
}
?>

或者,如果您有autoloaderpreload文件,则可以添加一些规则来决定出现哪些内容。

我的建议是尝试将业务逻辑排除在显示文件之外,然后为您的模板使用 PHP 的替代语法或某种类型的模板引擎:

在业务逻辑中,您可能具有:

<?php
$status = true;
if(!isset($_SESSION['status']) || $_SESSION['status']=='false'){
$status = false;
}
include "template.php";
?>

在模板中,您可能有:

<!DOCTYPE html>
<html>
<?php if($status): ?>
<body>
<h1>Hello World</h1>
</body>
<?php else: ?>
<body style="background:url("img/404.png")"></body>
<?php endif; ?>
</html>

这种方法是关注点分离,由 MVC 框架使用。 这是一个非常基本的控制器和视图示例,但如果你被吸引,我建议你阅读MVC设计。

最新更新