【问题标题】:Have to reload page for if statement to be parsed必须重新加载页面才能解析 if 语句
【发布时间】:2015-06-05 00:43:17
【问题描述】:

首先:代码!

loginform.html

<form action="" method="post" id="loginform">

                <h3>Login</h3>
                <input type="text" name="username" placeholder="Username">
                <br>
                <br>
                <input type="password" name="password" placeholder="Password">
                <br>
                <input type="submit" name="logsubmit" value="Login" class="registerbutton">
            </form>

login.php

<?php 
require_once("../resources/config.php");
require_once("../resources/library/dbconnect.php");

function checkUser($con) {

   if (isset($_POST['username']) && isset($_POST['password'])){
            $username = $_POST['username'];
            $pw       = md5($_POST['password']);

$sql="SELECT * FROM `users` WHERE username='$username' and pw='$pw'";

       $result = mysqli_query($con, $sql);
       $row    = mysqli_fetch_assoc($result);

    if ($result==true && $username == $row["username"] && $pw==$row["pw"]) {


            $_SESSION["logged_in"] = 1;
            $_SESSION["admin"] = $row["admin"];
            $_SESSION["username"] = $row["username"];
        }

        else {

        $msg = "Das war nichts! Passwort oder Username falsch? <br>".mysqli_error($con);
        unset($_SESSION["logged_in"]);

        }
    }
}
checkUser($connection);
header('location: ../public_html/index.php');
exit;
?>

index.php

<?php
session_start();
?>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Barstone</title>
    <link rel="stylesheet" href="css/default.php" type="text/css">
    <link href='http://fonts.googleapis.com/css?family=Bitter:700&subset=latin,latin-ext' rel='stylesheet' type='text/css'>
</head>
<body>
    <?php require_once("../resources/config.php");
          require_once("../resources/library/header_nav.php");?>
    <div class="pagewrapper">

        <div class="register-container">

            <?php if(!isset($_SESSION['logged_in']) || !isset($_POST['regsubmit']))           
            {require_once("../resources/library/registerform.php");}

             if (isset($_POST['regsubmit']) && $_SESSION['register_check']==true) {printf("Success! Welcome %s!",$_POST['username']);}

            ?>

        </div>


        <div class="login-container">
            <?php if (isset($_SESSION['logged_in'])) { printf ("<form action='../resources/library/logout.php' method='post' id='loginform'><h3> Hello %s!                           </h3> Nice to see you!<input type='submit' class='logoutbutton' value='logout'>                                         </form>",$_SESSION["username"]);
       }?>
             <?php if (isset($_POST["logsubmit"])) {require_once("../resources/library/login.php"); 
                        }
else { if (!isset($_SESSION['username'])) {require_once("../resources/library/loginform.html");}}
                ?>

        </div>
        <div class="content">
        <?php require_once("../resources/library/articles.php");?>
        </div>
    </div>
</body>

</html>

relevant index.php part

    {printf ("<form action='../resources/library/logout.php' method='post' id='loginform'>
   <h3> Hello %s!</h3> Nice to see you!
   <input type='submit' class='logoutbutton' value='logout'>
   </form>",$_SESSION["username"]);}
    ?>

   <?php if (isset($_POST["logsubmit"])) {require_once("../resources/library/login.php");}
        else {if (!isset($_SESSION['username'])) 
               {require_once("../resources/library/loginform.html");}
                 }?>
 </div>

这应该做什么:

如果用户未登录,则显示loginform.html。 如果登录按钮被按下,请使用login.php 让用户登录。

在有人使用登录表单登录网站后,它会显示一条欢迎消息和一个用于注销的新按钮。

这是做什么的:

显示登录表单工作正常。

有人登录后,它什么也不显示。但是在重新加载页面后,按钮就在那里并且工作正常。

$_SESSION['logged_in'] 变量是在登录时设置的,但为什么页面需要再次重新加载才能正确解释此语句?

我承认我的做法不一定是“最佳实践”,我愿意接受任何建议。还在学习。 :)

用于测试:http://hsturnierv2.pixelpioniere.net/public_html/index.php 以“test”身份登录,密码为“test”

【问题讨论】:

  • 你应该添加来自login.phplogin.html的代码以获得正确答案
  • 添加代码并将删除我的 cmets。
  • 您的代码中是否有session_start()
  • index.php 包含什么?它与 input.php 有什么关系?
  • 是的。在 index.php 之上,但也许我在 login.php 中忘记了它 - 试试这个!

标签: php html session login


【解决方案1】:

你基本上在做什么:

<?php if (isset($_SESSION['logged_in'])) 
    // output something
?> 
<?php 
if (isset($_POST["logsubmit"])) { 
     // process login with login.php
} else {
     if (!isset($_SESSION['username'])) {
        //display login form   
     }
?>

好吧,这里发生了什么......

  1. 用户第一次访问网站。 (未登录且未提交登录表单)

    $_SESSION['logged_in'] 未设置并且 // 输出未达到的内容

    $_POST['logsubmit'] 未设置,$_SESSION ['username'] 也未设置 这样登录表单就会显示出来

  2. 用户提交登录表单 $_SESSION['logged_in'] 未设置并且 // 输出未达到的内容

    $_POST['logsubmit'] 已设置并调用 login.php 如果您在 login.php 中没有输出,则页面保持空白。 我假设您在 login.php 中设置会话变量

  3. 用户登录后重新加载页面 $_SESSION['logged_in'] 现在设置了 -> 你达到了 // 输出一些东西

我个人会在单独的文件中处理登录:

<?php 
if(!isset($_SESSION['logged_in'])) {
    // redirect to login.php
}
?>
// here comes the content when user is logged in

在 login.php 中:

<?php 
    if(isset($_POST['logsubmit']) {
         // handle login and redirect to page that needs login if successfull 
    }

    if($loginError) { // print login errors }

    // print login form 
?>

编辑:不要忘记 session_start() (在包含的文件中 session_start() 不是必需的)

【讨论】:

  • 第一:感谢您的解释。我会仔细考虑并尝试一下。之后我会告诉你它是否有效。
【解决方案2】:

问题很可能是你有这个事实

header('location: ../public_html/index.php');

代替:

header('Location: ../public_html/index.php');

在 login.php 中。它应该有一个大写的 L。它没有,你没有重定向,因此空白页......

更新

所以你重定向好了,但你的脚本由于某种原因而死了。这不是一个逻辑错误,而是一个致命的脚本错误,它会在你的脚本输出更多内容之前杀死你的脚本...... 你的代码是:

<?php if (isset($_SESSION['logged_in'])) 
{ 
    printf ("<form action='../resources/library/logout.php' method='post' id='loginform'>
    <h3> Hello %s!</h3> Nice to see you!
    <input type='submit' class='logoutbutton' value='logout'>                                          
    </form>",$_SESSION["username"]);
   }
?>
<?php if (isset($_POST["logsubmit"])) 
{
    require_once("../resources/library/login.php"); 
}else 
{ 
    if (!isset($_SESSION['username'])) {require_once("../resources/library/loginform.html");
    }
}
?>

所以我明白了。当有人实际登录 index.php 时,需要一个 login.php,它在完成后会发送一个重定位标头并退出。但是输出已经开始了!你已经有一半的页面了! 因此,标头发出错误(可能由于 php.ini 设置而未显示)然后退出。因此你得到了半页。

您应该将 index.php 代码更改为:

<?php
session_start();
if (isset($_POST["logsubmit"])) 
{
    require_once("../resources/library/login.php"); 
}
?>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Barstone</title>
    <link rel="stylesheet" href="css/default.php" type="text/css">
    <link href='http://fonts.googleapis.com/css?family=Bitter:700&subset=latin,latin-ext' rel='stylesheet' type='text/css'>
</head>
<body>
    <?php require_once("../resources/config.php");
          require_once("../resources/library/header_nav.php");?>
    <div class="pagewrapper">

        <div class="register-container">

            <?php if(!isset($_SESSION['logged_in']) || !isset($_POST['regsubmit']))           
            {
                 if (isset($msg)) echo $msg .'<br>';
                 require_once("../resources/library/registerform.php");}

             if (isset($_POST['regsubmit']) && $_SESSION['register_check']==true) {printf("Success! Welcome %s!",$_POST['username']);}

            ?>

        </div>


        <div class="login-container">
            <?php if (isset($_SESSION['logged_in'])) { printf ("<form action='../resources/library/logout.php' method='post' id='loginform'><h3> Hello %s!                           </h3> Nice to see you!<input type='submit' class='logoutbutton' value='logout'>                                         </form>",$_SESSION["username"]);
       }else { if (!isset($_SESSION['username'])) {require_once("../resources/library/loginform.html");}}
                ?>

        </div>
        <div class="content">
        <?php require_once("../resources/library/articles.php");?>
        </div>
    </div>
</body>

</html>

这可以防止在标题之前输出,并且如果您输入错误的凭据也会显示错误。然后您还应该更改您的 login.php 文件,以便它不会每次都重定向,而只有在登录成功时才重定向,如下所示:

<?php 
require_once("../resources/config.php");
require_once("../resources/library/dbconnect.php");

function checkUser($con) {

   if (isset($_POST['username']) && isset($_POST['password'])){
            $username = $_POST['username'];
            $pw       = md5($_POST['password']);

$sql="SELECT * FROM `users` WHERE username='$username' and pw='$pw'";

       $result = mysqli_query($con, $sql);
       $row    = mysqli_fetch_assoc($result);

    if ($result==true && $username == $row["username"] && $pw==$row["pw"]) {


            $_SESSION["logged_in"] = 1;
            $_SESSION["admin"] = $row["admin"];
            $_SESSION["username"] = $row["username"];
            $msg='OK';
        }

        else {

        $msg = "Das war nichts! Passwort oder Username falsch? <br>".mysqli_error($con);
        unset($_SESSION["logged_in"]);

        }
    }
    return $msg
}
$result = checkUser($connection);
if ($msg=='OK')
{
    header('location: ../public_html/index.php');
    exit;
}
?>

【讨论】:

  • 不是显示空白页。只是容器不在。
  • 你可以在这里测试:hsturnierv2.pixelpioniere.net/public_html/index.php (user: test, pw: test)
  • 请粘贴 index.php 的代码。它与您在上面粘贴的 input.php 有什么关系?
  • 这是一个错字,应该是 index.php - 粘贴整个文件并在我的问题中解决这个问题
  • 哇。谢谢!我现在没有时间尝试这个,但我会在预约后尝试。
猜你喜欢
  • 2017-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-12
  • 2013-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多