在同一页面上进行PHP表单验证 - 这个逻辑是否正确?

时间:2013-08-08 13:52:04

标签: php forms validation post self

我正在尝试构建一个简单的注册表单,该表单通过一些检查,然后将数据保存到数据库中。最初,只有注册表单和处理表单以及未经验证的表单数据被保存在数据库中。当我试图对流程进行一些验证时,麻烦就开始了。

    <Edit>

这里只有三个目标:

  1. 防止登录用户尝试注册。
  2. 只要浏览器中没有活动的用户帐户,首先要确保没有空字段
  3. 发送表单数据以进行处理。
  4. 对于#1,发布到php self看起来很理想,因为它为我避免了大量的额外编码,并且对于不必再次输入所有内容的用户而言具有优势。

    对于#2,验证仅限于立即检查空字段而不是其他任何内容。这是一个注册表单,正在收集用户数据 - 根本不对用户进行身份验证。

    对于#3,我设计了一种将数据发送到另一个php的方法,这不再是一个问题。

    问题在于逻辑。放在一起时,为什么单独工作的部件会失效?在我应用于该过程的逻辑中是否存在一些错误?

    其中一条评论说了一些关于elseif的内容,我也试过了。我没有在代码中得到任何错误 - 没有解析错误,没有语法错误,没有致命错误 - 但也没有发生任何事情 - 只是注册表单刷新。系统的各个部分在测试页面上单独工作,但是当与完整表单放在一起时,它不起作用。

        </Edit>
    

    在SE上我找到了将表单发布到php self的方法,并在帖子中使用示例代码进行了尝试。它按预期工作,似乎都很好,所以我把它添加到我的表单页面。但是除了重新加载它之外,它在实际的表单页面上什么都不做。

    再一次,在SE上我发现了一篇文章,展示了如何在数组中捕获并显示所有错误。它似乎适用于一个示例文件,我将代码添加了适当的变量名称更改到我的注册页面。如果没有用户登录且用户单击“提交”,则应显示捕获的空字段错误。它没有。即使所有字段都留空,也会显示任何错误。 之后一切都崩溃了。

    现在发生的一切都是注册表重新加载 - 错误或没有错误!

    我已经尝试了很多这样的事情,我不再确定自从昨晚以来我试图做的是现在代码正在做什么。所以我只是从逻辑和相关问题开始。

    以下是每个阶段的逻辑和问题......

        <php session_start() ;?>
        <?php
        //check if the user is logged in
        if (isset($_SESSION['validuser'])) {
              //catch this first - before user spends time filling out the 12 fields!
              //send to message page saying "you cannot register - you are already a member and     logged in"
              //WORKING PERFECTLY - CONFIRMS FORM POSTING TO SAME PAGE CORRECTLY!
              //time for other checks....
        }
        else (!isset($_SESSION['validuser']) && isset($_POST['submit'])) {
    
              //if there is no logged in user and form has been submitted, start checking the      fields to see if any fields are empty
              //collect all errors in array and display?
              //direct back to the form with appropriate messages, form fields retained
              //exit here? or no?
              //focus  now has to pass to the form again - need any code for this? or will it happen automatically?
        }
        if isset($_POST['submit'])) {
              //Should this part be within the else block?
              //If it is out side, will it get rendered on load?
              //if there are no errors proceed to process the form
              //there are further checks that need talking to the database
              //once those checks and approvals are over the data gets saved to the database
    
        }
    
    
        ?>
        <html>
           <body>
            <form action="<?=$_SERVER['PHP_SELF']?>" method = "POST">
                <!--  12 fields to be filled out by user     -->
                <input type = "submit" name = "submit" value = "submit" />
            </form>
            </body>
        </html>
    

    我错过了什么?请记住,这是我正在尝试清理的工作流程。原始代码现在已经过时了,我不想在这里公开它 - 很可能我会得到很多关于输入的卫生和输出的逃避的建议!我故意在这个只能访问表单和数据库的开发环境中遗漏了这些内容。消毒和逃逸只是在这一点上增加了混乱。

    也就是说,一旦我拥有正确的工作流程,我也会添加这些内容: - )

3 个答案:

答案 0 :(得分:1)

我将其重组如下:

if (isset($_SESSION['validuser'])) 
{
    //user is authenticated
}
elseif (!isset($_SESSION['validuser']) && isset($_POST['submit'])) 
{
    //user is not authenticated, proceed
    if (isset($_POST['submit'])) //checking if form was submitted
    {
        //process 12 input fields
    }
    else
    {
        //form wasn't submitted, display error
    }
}

答案 1 :(得分:0)

这是一个应该根据你所描述的内容工作的解决方案。

<?php
    session_start();

    // If we have a "valid users"
    if (isset($_SESSION['validuser']))
    {
        // Display stuff for registered users
    }
    else // If we don't have a valid user
    {
        // If there was data submitted to the server
        if (isset($_POST))
        {
            // Handle validation for ... whatever
            // print_r($_POST); To see data
        }
    }
?>

<html>
     <body>
        <!-- Don't display the form to "valid users". -->
        <?php if (!isset($_SESSION['validuser'])): ?>
             <form action="<?=$_SERVER['PHP_SELF']?>" method = "POST">
                 <!--  12 fields to be filled out by user     -->
                 <input type = "submit" name = "submit" value = "submit" />
             </form>
        <?php endif; ?>
     </body>
</html>

答案 2 :(得分:0)

你是最正确的,我会这样做

 if (isset($_SESSION['validuser'])) {

}else {

    if isset($_POST['submit'])) {
         //Check errors here
    }
}