【问题标题】:Part of PHP only runs if the form is submitted twice部分 PHP 仅在表单提交两次时运行
【发布时间】:2021-09-20 10:06:14
【问题描述】:

在一个非常基本的登录页面中,我设置了一个错误状态,以显示表单是使用空 pin 提交还是输入了无效 pin,但它仅在我提交表单两次并出现相同错误时才起作用。

我哪里错了? 否则有什么更好的方法来实现这一点?

<?php

if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

?>

<html>
<head>
<title>Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="style.css">
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="manifest" href="/site.webmanifest">
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5">
<meta name="msapplication-TileColor" content="#da532c">
</head>
<body>
<h1>Page Title</h1>

<div class="smallcontainer">
  <form method="post" action="">
    
    <div class="row">
        
        <div class="col-20">
        <label for="id">Driver Pin</label>
        </div>
        <div class="col-80">
        <input type="text" name="id" >
        </div>
    </div>
    
    <div class="row">
        <div class="col-100 error">
            <?= @$_SESSION['status'] ?>
        </div>
        <div class="col-100">
            <input type="submit" value="Submit" name="submit">
        </div>
    </div>
    
  </form>
</div>

</body>
</html>

<?php

if (isset($_POST['submit'])) {
    
    $id = trim($_POST['id']);
        
    if (empty($_POST['id'])){
    $_SESSION['status'] = 'Enter a Driver Pin';
    }
    
    // if (!strlen($id)) {
    // $_SESSION['status'] = 'Enter a Driver Pin';
    // //die('Please enter Driver Pin');
    // }
    
    $success = false;
        
    $handle = fopen("users.csv", "r");
        
    while (($data = fgetcsv($handle)) !== FALSE) {
        if ($data[0] == $id) {
        $success = true;
        $_SESSION['displayname'] = $data[1];
        break;
        } 
    }
    
    fclose($handle);
    
    if ($success) {
        $_SESSION['allow'] = '';
        header('Location: ./');
    } else {
        $_SESSION['status'] = 'Invalid Driver Pin - Try again';
    }
}

?>

【问题讨论】:

  • 可能是您的会话检查。尝试改用session_status() != PHP_SESSION_ACTIVE

标签: php html


【解决方案1】:

首先,您需要将 php 放在表单之前(如前所述),这是您的代码,并进行了一些修复:

<?php

if (session_status() === PHP_SESSION_NONE) {
        session_start();
}



if (isset($_POST['submit'])) {

        $id = trim($_POST['id']);

        $success = false;

        $handle = fopen("users.csv", "r");

        while (($data = fgetcsv($handle)) !== FALSE) {
                if ($data[0] == $id) {
                $success = true;
                $_SESSION['displayname'] = $data[1];
                break;
                }
        }

        fclose($handle);

        if ($success) {
                $_SESSION['allow'] = '';
                $_SESSION['status'] = 'Success!';
                /*header('Location: ./');*/
        } else {
                if (empty($_POST['id'])){
                    $_SESSION['status'] = 'Enter a Driver Pin';
                } else {
                    $_SESSION['status'] = 'Invalid Driver Pin - Try again';
                }

        }
} else {
    $_SESSION['status'] = 'Enter a Driver Pin';
}

?>

<html>
<head>
<title>Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="style.css">
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">

<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5">
<meta name="msapplication-TileColor" content="#da532c">
</head>
<body>
<h1>Page Title</h1>

<div class="smallcontainer">
    <form method="post" action="">

        <div class="row">

                <div class="col-20">
                <label for="id">Driver Pin</label>
                </div>
                <div class="col-80">
                <input type="text" name="id" >
                </div>
        </div>

        <div class="row">
                <div class="col-100 error">
                        <?= @$_SESSION['status'] ?>
                </div>
                <div class="col-100">
                        <input type="submit" value="Submit" name="submit">
                </div>
        </div>

    </form>
</div>

</body>
</html>

这会起作用 - 请注意,如果没有关于新加载的帖子,您需要重置 $_SESSION['status'];

【讨论】:

    【解决方案2】:

    检查和设置状态的php位于HTML之后,这意味着页面提交返回的HTML在下次提交之前不会更新状态。

    所以,把你的 PHP 代码移到 HTML 之上。

    另外,在打印出任何内容后,您不能使用header()

    【讨论】:

      猜你喜欢
      • 2017-11-13
      • 1970-01-01
      • 1970-01-01
      • 2016-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 2014-08-04
      相关资源
      最近更新 更多