【问题标题】:drop down menu goes back to Please Select option after validation message appears出现验证消息后,下拉菜单返回“请选择”选项
【发布时间】:2012-11-11 09:10:42
【问题描述】:

下面我有一个表单,其中包含几个文本输入、一个下拉菜单以及用于验证和成功的消息:

<?php

$getyear = (isset($_POST['year'])) ? $_POST['year'] : '';

$sql = "SELECT CourseId, CourseName FROM Course ORDER BY CourseId";

$sqlstmt=$mysqli->prepare($sql);

$sqlstmt->execute();

$sqlstmt->bind_result($dbCourseId, $dbCourseName);

$courses = array(); // easier if you don't use generic names for data

$courseHTML = "";
$courseHTML .= '<select name="course" id="coursesDrop">'.PHP_EOL;
$courseHTML .= '<option value="">Please Select</option>'.PHP_EOL;

while($sqlstmt->fetch())
{
    $course = $dbCourseId;
    $coursename = $dbCourseName;
    $courseHTML .= "<option value='".$course."'>" . $course . " - " . $coursename . "</option>".PHP_EOL;

}

$courseHTML .= '</select>';

if((isset($_POST['registerbtn'])))
{
    $getfirstname = $_POST['firstname'];
    $getsurname = $_POST['surname'];
    $getcourse = $_POST['course'];


    if ($getfirstname)
    {
        if ($getsurname)
        {
            if ($getcourse)
            {
                // don't use $mysqli->prepare here
                $query = "SELECT StudentUsername FROM Student WHERE StudentUsername = ?";
                // prepare query
                $stmt=$mysqli->prepare($query);
                // You only need to call bind_param once
                $stmt->bind_param("s",$getid);
                // execute query
                $stmt->execute();
                // get result and assign variables (prefix with db)
                $stmt->bind_result($dbStudentUsername);
                //get number of rows
                $stmt->store_result();
                $numrows = $stmt->num_rows();


                if ($numrows == 1)
                {
                    $errormsg = "<span style='color: green'>Student has been Registered</span>";
                    $getfirstname = "";
                    $getsurname = "";
                    $getcourse = "";
                }
                else
                {
                    $errormsg = "An error has occured, Student has not been Registered";
                }
            }
            else
            {
                $errormsg = "You must select the Student's Course to Register";
            }
        }
        else
        {
            $errormsg = "You must enter in Student's Surname to Register";
        }

    }
    else
    {
        $errormsg = "You must enter in Student's First Name to Register";
    }
}

$form = "
<form action='" . htmlentities($_SERVER["PHP_SELF"]) . "' method='post'>
<table>
<tr>
<td></td>
<td id='errormsg'>$errormsg</td>
</tr>
<tr>
<td>First Name:</td>
<td><input type='text' name='firstname' value='$getfirstname' /></td>
</tr>
<tr>
<td>Surname:</td>
<td><input type='text' name='surname' value='$getsurname' /></td>
</tr>
<tr>
<td>Course:</td>
<td>{$courseHTML}</td>
</tr>
<tr>
<td></td>
<td><input type='submit' value='Register' name='registerbtn' /></td>
</tr>
</table>
</form>";

echo $form;

?>

现在我遇到的问题实际上是下拉菜单。

如果出现成功消息,那么它会显示课程下拉菜单的“请选择”选项,这很好,但如果用户提交表单并出现验证消息,下拉菜单会返回“请选择”选项。我希望它保留用户选择的最后一个选项。用上面的代码怎么实现呢?

【问题讨论】:

    标签: php html


    【解决方案1】:

    更改以下行:

    $courseHTML .= "<option value='".$course."'>" . $course . " - " . $coursename . "</option>".PHP_EOL;
    

    对此:

    if (isset($_POST['course']) && $course == $_POST['course'])
    {
        $courseHTML .= "<option value='".$course."' selected='selected'>" . $course . " - " . $coursename . "</option>".PHP_EOL;
    }
    else
    {
        $courseHTML .= "<option value='".$course."'>" . $course . " - " . $coursename . "</option>".PHP_EOL;
    }
    

    它的作用是检查当前的$course 是否等于$_POST['course']。如果是,则将选项设置为selected。

    编辑 1

    您可以通过以下方式检查您提交的表单是否有效,以及该表单将在稍后通过:

    $validSubmission = isset($_POST['registerbtn']) && $_POST['firstname'] && $_POST['surname'] && $_POST['course'];
    
    while($sqlstmt->fetch())
    {
        $course = $dbCourseId;
        $coursename = $dbCourseName;
        if (!$validSubmission && isset($_POST['course']) && $course == $_POST['course'])
        {
            $courseHTML .= "<option value='".$course."' selected='selected'>" . $course . " - " . $coursename . "</option>".PHP_EOL;
        }
        else
        {
            $courseHTML .= "<option value='".$course."'>" . $course . " - " . $coursename . "</option>".PHP_EOL;
        }
    }
    

    【讨论】:

    • 我在代码的顶部添加了一行,但我忘记包含了。无论如何,我尝试了您的代码并且它有效,除了问题是如果出现成功消息,那么它应该返回显示“请选择”选项,但它没有这样做,我还需要更改什么?
    • 可以检查表单提交是否有效,如果有效,不要添加selected属性。我已经更新了我的答案来做到这一点。
    猜你喜欢
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-28
    相关资源
    最近更新 更多