需要两次提交PHP表单,然后才能通过正确的信息

时间:2018-07-12 18:35:16

标签: javascript php mysql forms

我正在使用下面的PHP,并将其用于确定用户是否已授权访问下一页的表单。

但是,我必须至少填写两次表格,以使信息通过。如果我在第一次尝试中输入正确的信息,它将说出我编写的相应错误语句,然后,如果我将字面意义上的任何内容放入表单中并点击Submit,它将通过。

我可以输入一百万次不正确的信息,但是不会通过,但是如果我输入一次正确的信息,我必须点击“提交”,然后再次填写任何信息,然后再次点击“提交”,然后我将转到下一页。我删除了if (isset ($_COOKIE) 完全阻止以查看它是否有所作为,但确实做了同样的事情。

<?php
include_once "database.php";
session_start();
if (isset($_POST['submit'])) {
    if (isset($_COOKIE['first'])){
        setcookie("first",'',time()-3600,"/");
        setcookie("last",'',time()-3600,"/");
        setcookie("city",'',time()-3600,"/");
    }
    $first=$_POST["first"];
    $last=$_POST["last"];
    $city=$_POST["city"];
    setcookie("first",$_POST["first"],0,"/");//cookie expires after browser closes
    setcookie("last",$_POST["last"],0,"/");//cookie expires after browser closes
    setcookie("city",$_POST["city"],0,"/");//cookie expires after browser closes
    clearstatcache();
    $sql="SELECT * FROM invited WHERE FIRSTNAME='".$_COOKIE['first']."' AND LASTNAME='".$_COOKIE['last']."' AND CITY='".$_COOKIE['city']."'";
    $found=mysqli_query($conn,$sql);
    echo "$first\n\n$last\n\n$city";
    if (mysqli_num_rows($found)){
        $success="<script>window.location.href='rsvp.php'</script>";
    }
    else{
        $fail="ERROR, Could not find";
    }
}
?>

HTML表单:

        <form action="" method="POST">
            <p>Enter Family Name (as it appears on your invitation): </p>
            <input class="entry" type="text" name="first" placeholder="FIRST NAME" required><br><br>
            <input class="entry" type="text" name="last" placeholder="LAST NAME" required><br><br>
            <input class="entry" type="text" name="city" placeholder="CITY (ONLY)" required><br><br>
            <input type="submit" onclick="getCookie()" name="submit">
        </form>

1 个答案:

答案 0 :(得分:0)

Sal,您一定不要着急。首先,让我们了解一下setcookie函数的实际作用:

它设置cookie,对不对?当然。

但是,如果您继续阅读第二段,您将会理解:

  

一旦设置了cookie,就可以使用$_COOKIE数组在下一页加载时访问它们。 Cookie值也可能存在于$_REQUEST中。

所以这两个代码块是浪费的代码重复:

if (isset($_COOKIE['first'])){
    setcookie("first",'',time()-3600,"/");
    setcookie("last",'',time()-3600,"/");
    setcookie("city",'',time()-3600,"/");
}

//...

setcookie("first",$_POST["first"],0,"/");//cookie expires after browser closes
setcookie("last",$_POST["last"],0,"/");//cookie expires after browser closes
setcookie("city",$_POST["city"],0,"/");//cookie expires after browser closes

由于它们在同一运行时实例中运行,因此在下一次加载或您请求的下一个POST之前,它们应该不可用。我相信这会在您的表单中引起怪异的“ bug”(如果您想称呼它)。

要设置Cookie,您可以使用setcookie()。但这不是您做的。您尝试做的是修改它们的值。这更简单:

$_COOKIE['first'] = $_POST['first'];
// ... and so on

如果您尝试unset() $_COOKIE,那么您的if子句就可以了。


但是,我可以建议一种更简单的方法吗?

您已经在使用$_SESSION。那么,当您可以通过PHP轻松管理会话时,为什么还要创建cookie管理的障碍呢?该值仍可以在您的rsvp.php页上访问,并且浏览器将在关闭时自动“忘记”会话(除非您另有说明)。我提到这是因为您的代码中的注释: // cookie在浏览器关闭后过期

要使用会话,只需分配值,它们毕竟是一个数组。

$_SESSION['first'] = $_POST['first'];

这将释放您当前拥有的9行代码。