1

确认用户登录后,应该如何显示只有会员才能看到的页面?

例如

<?php
    start_session();
    if(isset($_SESSION[userLoggedIn]))
        echo 'welcome to the members area!';
    else
        echo 'You must log in first';
?>

或者

<?php
    start_session();
    if(!isset($_SESSION[userLoggedIn]))
        goto notLoggedIn;
?>
    welcome to the members area!
<?php
    notLoggedIn:
        echo 'You must log in first';
?>

或者

<?php
    start_session();
    if(isset($_SESSION[userLoggedIn]))
        include members.html;
    else
        include public.html
?>

我不喜欢在 PHP 中有太多的 HTML。

使用include/require解决方案时,如何使人们不能直接访问 html 文件?例如include members.html;,是什么阻止用户输入 url ~/members.html?ATM 我正在​​使用 WAMP,但我猜服务器上有设置?

编辑:好的,这就是我的计划:创建两个目录public并创建privatewebroot public。我将有 1 个页面来检查用户是否已登录,如果是,来自 $_GET['destination'] 的值将用于包含private目录中的正确页面。有什么我没有想到的陷阱吗?

4

3 回答 3

2

我建议不要goto,在这种情况下真的没有必要。includes如果您有多个页面并且不想混合使用 HTML 和 PHP,那么使用是一个不错的方法。

如果您希望所有内容都包含在一个页面上,您可以设置一个变量:

<?php
    start_session();
    $logged_in = ($_SESSION['isLoggedIn'] == true);
    // Whatever else you need...
?>

然后,稍后在页面上(可能在最后),使用替代语法,您可以执行以下操作:

<?php if( $logged_in): ?>
    <p>Welcome to the member's area!</p>
<?php else: ?>
    <p>You must log in first!</p>
<?php endif; ?>
于 2013-01-22T21:46:45.127 回答
2

我不喜欢在 PHP 中有太多的 HTML。

好的。然后将您的 HTML 移动到处理演示逻辑的 HTML 模板中:

 start_session();
 if(isset($_SESSION['userLoggedIn'])){
    require 'public_html/logged_in.php';

 }else{
    require 'public_html/public_area.php';
 }

更好的是,创建一个加载这些模板的函数,例如:

function load_template($file, array $vars){
  extract($vars);
  unset($file, $vars);
  require func_get_arg(0);
}

使用 include/require 解决方案时,我该如何做才能让人们不能直接访问 html 文件?

几种方法:

  • 在主脚本中定义一个常量;检查此常量是否在您的模板中定义,如果没有则退出
  • 或将变量传递给执行相同操作的模板
  • 或将这些模板放在 Web 根目录之外
  • 或使用 .htaccess 规则保护它们

我在这里假设这些模板也是 PHP 脚本。但是当然你也可以在 PHP 之上使用某种模板系统,或者创建你自己的......

于 2013-01-22T21:50:40.043 回答
2

如果访问者未登录,则通过将访问者重定向离开来保持您的 PHP 文件干净:

if (empty($_SESSION['user_id'])
{
    header('Location: /not_logged_in_page'); // Redirect to another page!
    exit;
}

// Continue with the loggedin user page...
于 2013-01-22T21:52:30.913 回答