0

我的代码有两种形式,为用户名和密码创建一个文本字段。php 脚本获取表单信息并将其发送到服务器以决定表单数据中的字符串是否与我想要的用户名和密码相对应。我还有一个注销按钮表单,该表单用于将用户注销的 logout.php 脚本。如果我单击注销按钮,它会将用户发送到我的 login.php 脚本并结束会话。如果我访问具有 logout.php 的站点,我无法让用户登录网站,也无法让用户访问 login.php 页面。这是我的代码:

登录php代码:

   <?php
               session_start();
               if($_SESSION['login'] == true)
               {
                header("Location:index.php");
               }
               else
               {
               if($_POST['username'] == 'username')
               {
                   if($_POST['pass'] == 'password')
                   {

                      $_SESSION['login'] = true;
                      header('Location:index.php');

                    }
               }
               }
       ?>

登录表格:

        <form action="login.php" method="post">
        Username: <input type="text" name="username" /> </br>
        Password: <input type="password" name="pass" /> 
        <input type="submit" value="submit"/>
        </form>

注销PHP代码:

    <?php 
     session_start();
     session_destroy();
     header('Location:index.php');
     ?>

索引php代码:

    <?php
      session_start();
      if($_SESSION['login'] =! true || $_SESSION['login'] == "")
      {
          header('Location:login.php');
      }
    ?>

索引表格代码:

         <form action="logout.php" method="post">
         <input type="submit" name="logout" value="logout" />
         </form>

PHP 代码在显示任何内容之前列在 html 代码上方,因此某些表单操作会再次回调页面。谢谢

4

4 回答 4

2

您的主要问题是不正确的运算符=!-index.php正确使用!=“不等于”。查看更多: http: //php.net/manual/en/language.operators.comparison.php

您可以稍微清理一下 login.php 文件:

登录.php

session_start();
$redirect = false;
if($_SESSION['login'] == true) {
    $redirect = true;
} elseif (
    isset($_POST['username']) && 
    $_POST['username'] == 'username' && 
    $_POST['pass'] == 'password'
){
    $_SESSION['login'] = true;
    $redirect = true;
}
if ($redirect) {
    header("location:http://www.mydomain.com/index.php");
    die();
}

您的登录表单很好,除了您:用于属性的地方。所有 HTML 元素属性都是name="value"-- 注意等号。所以你的表格:

<form action="login.php" method="post">

您在注销表单中正确设置了它。

您的目标之一是减少您使用的代码量。因此,如果您要多次执行相同的操作,您应该尝试将那段代码隔离为一个类、一个函数,或者只是在您包含的另一个文件中。为此,您可以将登录检查放在单独的文件中:

安全.php

session_start();
if(!isset($_SESSION['login']) || $_SESSION['login'] !== true) {
    header('location:http://www.mydomain.com/login.php');
    die();
}

...然后用于require_once在您要求用户登录的任何页面上将其拉入:

索引.php

require_once('security.php');
// the rest of your index.php code here

文档

于 2012-07-13T15:08:10.697 回答
1

登录表单的表单字段不好。

它应该是:

<form action="login.php" method="post">
    Username: <input type="text" name="username" /> </br>
    Password: <input type="password" name="pass" /> 
    <input type="submit" value="submit"/>
</form>

我也认为你的布尔条件

if($_SESSION['login'] =! true || $_SESSION['login'] == "")

应该

if($_SESSION['login'] != true || $_SESSION['login'] == "")

试试看,如果不行,我们再看看。

于 2012-07-13T15:03:40.517 回答
1

让我们再试一次:)

编辑:需要 die()(或 exit()),否则 PHP 会继续处理。

登录.php

if (empty($_SESSION['login']))
{
   // checking if username is transmitted and matching (same for password)
   if (   ( !empty($_POST['username']) && $_POST['username'] === 'username')
       && ( !empty($_POST['password']) && $_POST['password'] === 'password')
      )
   {
      $_SESSION['login'] = TRUE;
      header('Location:index.php');
      die();
   }      
}
else
{
 // if this matches, we are already loggged in.
 header('Location:index.php');
 die();
}

header('Location:login.php');
die();

注销.php

// check if Session exists, otherwise there is nothing to destroy
if (!empty($_SESSION))
{
unset($_SESSION);
}

header('Location:login.php');
die();

索引.php

  session_start();

  // if session doesn't exist we redirect to login
  if(empty($_SESSION['login']))
  {
      header('Location:login.php');
  }
于 2012-07-13T15:23:31.590 回答
0

据我所知,您的“登录表单”不正确,您需要使用 '=' 而不是 ':'。(编辑:负评级是什么?)

此外,AFAIR Location 必须像Location: http://www.example.com/index.php

于 2012-07-13T14:57:48.690 回答