首页 > 解决方案 > 部分 PHP 仅在表单提交两次时运行

问题描述

在一个非常基本的登录页面中,我设置了一个错误状态,以显示表单是使用空 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';
    }
}

?>

标签: phphtml

解决方案


您检查和设置状态的 php 位于 HTML 之后,这意味着页面提交返回的 HTML 直到下次提交时才会更新状态。

因此,将您的 PHP 代码移到 HTML 之上。

header()另外,打印完之后就不能使用了。


推荐阅读