1

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

    <Edit>

这里只有三个目标:

  1. 防止已登录的用户尝试注册。
  2. 只要浏览器中没有运行活动的用户帐户,首先确保没有空字段和
  3. 发送表单数据进行处理。

对于#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>

我错过了什么?请记住,这是我正在尝试清理的工作流程。原始代码现在已经如此完善,以至于我不想在这里公开它 - 很可能我会得到很多关于输入卫生和输出转义的建议!在这个只有我可以访问表单和数据库的开发环境中,我故意省略了这些部分。在这一点上,消毒和转义只会增加混乱。

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

4

3 回答 3

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
    }
}
于 2013-08-08T14:08:29.177 回答
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>
于 2013-08-08T14:02:35.287 回答
0

你是对的,我会这样做的方式是

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

}else {

    if isset($_POST['submit'])) {
         //Check errors here
    }
}
于 2013-08-08T14:03:02.650 回答