Php 仅在第二次尝试时提交表单

Php 仅在第二次尝试时提交表单,php,forms,web,Php,Forms,Web,我已经为一个测验创建了一个表单,在这里你必须输入答案,一个PHP脚本将把它们合计起来,发送到电子邮件地址,并将它们保存到一个文件中。但是,用户仅在第二次尝试(提交)表单时被重定向。结果汇总并在第一次提交时发送,但不会重定向。在第二次提交时,结果不会合计,但会发送一封电子邮件,并将用户重定向到完成页面 这是我的密码:- <!DOCTYPE html> <head> <title>Quiz</title> <link rel="styleshee

我已经为一个测验创建了一个表单,在这里你必须输入答案,一个PHP脚本将把它们合计起来,发送到电子邮件地址,并将它们保存到一个文件中。但是,用户仅在第二次尝试(提交)表单时被重定向。结果汇总并在第一次提交时发送,但不会重定向。在第二次提交时,结果不会合计,但会发送一封电子邮件,并将用户重定向到完成页面

这是我的密码:-

<!DOCTYPE html>
<head>
<title>Quiz</title>
<link rel="stylesheet" type="text/css" href="../styles.css" />
<link rel="shortcut icon" href="../img/favicon.ico" type="image/x-icon" />
</head>

<?php
error_reporting (E_ALL ^ E_NOTICE);
session_start();
if (isset($_SESSION['username'])) $username = $_SESSION['username'];
else header("Location: http://quiz.dibdibguy.com/client/index");

include_once($_SERVER['DOCUMENT_ROOT']."/scripts/sql.php");
$qid = $_SESSION['quiz'];
$con = connect();
$data = mysqli_query($con, "SELECT * FROM `qs` WHERE `id`='$qid' LIMIT 1");
$qinfo = mysqli_fetch_array($data, MYSQLI_ASSOC);
?>
<body><div id="white">&nbsp; </div>
<div id="content" class="text">
<div class="header">Quizzes</div>
<div class="subheader">Quiz: <?php echo($qinfo['name']); ?></div>


<table width="85%" class="menu text" align="center">
  <tr>
    <td>
    <div align="center"><?php if ($qinfo['desc'] == NULL) echo($qinfo['name'] . ", has no description available."); else echo($qinfo['desc']); ?></div>
    </td>
  </tr>
</table>

<br>
<?php
$table = $qinfo['table'];
$questionsTable = mysqli_query($con, "SELECT * FROM `$table`");
?>
<table width="85%" class="menu text" align="center">
  <tr>
    <td>
    <div align="left"><b>Please Remember:</b> For questions that require you to type an answer, you must spell it correctly, as the system cannot detect spelling errors.<br>
    <b>Playing as: <i><?php echo($_SESSION['username']); ?></i></b></div>
    </td>
  </tr>
</table>

<br>

<table width="85%" class="menu text" align="center">
  <tr>
    <td>
    <form method="post" name="quiz" action="">
    <?php
    $amt = mysqli_num_rows($questionsTable);
    $count = 1;
    echo($questions['que']);
    while($ques = mysqli_fetch_array($questionsTable)){
        echo("Question: " . $ques['que'] . "<br>");
        echo("Answer: <input type=\"text\" name=\"$count\"><br><br>");
        $count = $count + 1;
    }
    ?>
    <input type="submit" name="submit" value="Submit Answers" id="btn">
    </form>
    </td>
  </tr>
</table>
<?php
if (isset($_POST['submit'])){
    $answers = mysqli_query($con, "SELECT `ans` FROM `$table`");
    $u_answers = $_POST;
    $correct = 0;
    while($answer = mysqli_fetch_assoc($answers)){
        echo("Hi");
        foreach($u_answers as $u_ans){
            if ($answer['ans'] == strtolower($u_ans)) $correct = $correct + 1;
            $count = $count + 1;
        }
    }
    header("Location: http://quiz.dibdibguy.com/client/index");
    #WRITE DATA TO FILE
    $file = fopen("../results/" . strtoupper($_SESSION['username']) . "_" . date("d-m-Y_h:i_sa") . "_" .  strtoupper($_SESSION['quiz'] . ".txt"), 'w');
    fwrite($file, ($correct) . "/" . ($amt));
    fclose($file);

    mail("aaron@dibdibguy.com", $_SESSION['username'] . "quiz results", $correct . "/" . $amt);
    $_SESSION['quiz'] = $qinfo['name'];
}
close($con);
?>

<br>
<?php include "../footer.php"; ?>

<br>
<br>&nbsp;
</div>
</body>
</html>

测验

请记住:对于需要您键入答案的问题,您必须正确拼写,因为系统无法检测拼写错误。
扮演:



在第一次尝试时,如果我答对了一个问题,我会收到一封电子邮件,说明:1/39',这是应该发生的,但在第二次尝试时,我收到一封电子邮件,说明“0/”,即使我得到了一些正确的答案

提前感谢您的帮助。如果你还需要什么,请发电子邮件给我(aaron@dibdibguy.com),或就此问题发表评论

Web主机:未限制的Web主机

PHP版本:5.5

我发现两个问题

首先-在发送任何内容之前必须发送HTML标题。如果查看错误日志,可能会有关于此的警告。在您的位置标题用于重定向之前,您会将大量html打印到页面中。因为对标题来说太晚了,所以它被忽略了(你不会被重定向)。若要解决此问题,请在任何输出之前将重定向逻辑进一步向上移动(纯HTML也算作输出),或者使用以防止输出发送到浏览器,直到发送完所有标题

第二,“0/”电子邮件似乎是您的逻辑错误。如果你看看这个街区:

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

    ... Other Stuff

    mail("aaron@dibdibguy.com", $_SESSION['username'] . "quiz results", $correct . "/" . $amt);

    ... More Stuff
}

你写的逻辑是,只要按下提交按钮,电子邮件就会被发送。你从来没有先做过“理智检查”以查看表单中是否有任何有效信息。

没关系。别担心。这根本不是登录表单……如果用户没有登录(没有会话),你尝试重定向用户也会因为同样的原因而失败。谢谢,这是一个很好的答案:)我自己修复了它,因此,我将使用我使用的方法包括您的答案。