下面我有一个PHP脚本,它显示“课程”下拉菜单和“模块”下拉菜单。假设发生的是用户首先从“课程”下拉菜单中选择一个课程,然后属于所选课程的模块列表将出现在“模块”下拉菜单中。以下是此代码:
create_session.php
$sql = "SELECT CourseId, CourseNo, CourseName FROM Course";
$sqlstmt=$mysqli->prepare($sql);
$sqlstmt->execute();
$sqlstmt->bind_result($dbCourseId, $dbCourseNo, $dbCourseName);
$courses = array(); // easier if you don't use generic names for data
$courseHTML = "";
$courseHTML .= '<select name="courses" id="coursesDrop">'.PHP_EOL;
$courseHTML .= '<option value="">Please Select</option>'.PHP_EOL;
while($sqlstmt->fetch())
{
$courseno = $dbCourseNo;
$course = $dbCourseId;
$coursename = $dbCourseName;
$courseHTML .= "<option value='".$course."'>" . $courseno . " - " . $coursename . "</option>".PHP_EOL;
}
$courseHTML .= '</select>';
?>
<form action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post">
<table>
<tr>
<th>Course: <?php echo $courseHTML; ?>
<input id="courseSubmit" type="submit" value="Submit" name="submit" />
</th>
</tr>
</table>
</form>
<?php
if (isset($_POST['submit'])) {
$submittedCourseId = $_POST['courses'];
$query = "SELECT cm.CourseId, cm.ModuleId, c.CourseNo, m.ModuleNo,
c.CourseName,
m.ModuleName
FROM Course c
INNER JOIN Course_Module cm ON c.CourseId = cm.CourseId
JOIN Module m ON cm.ModuleId = m.ModuleId
WHERE
(c.CourseId = ?)
ORDER BY c.CourseName, m.ModuleId";
$qrystmt=$mysqli->prepare($query);
// You only need to call bind_param once
$qrystmt->bind_param("s",$submittedCourseId);
// get result and assign variables (prefix with db)
$qrystmt->execute();
$qrystmt->bind_result($dbCourseId,$dbModuleId,$dbCourseNo,$dbModuleNo,$dbCourseName,$dbModuleName);
$qrystmt->store_result();
$num = $qrystmt->num_rows();
if($num ==0){
echo "<p style='color: red'>Please Select a Course</p>";
} else {
$dataArray = array();
while ( $qrystmt->fetch() ) {
// data array
$dataArray[$dbCourseId]['CourseName'] = $dbCourseName;
$dataArray[$dbCourseId]['CourseNo'] = $dbCourseNo;
$dataArray[$dbCourseId]['Modules'][$dbModuleId]['ModuleName'] = $dbModuleName;
$dataArray[$dbCourseId]['Modules'][$dbModuleId]['ModuleNo'] = $dbModuleNo;
}
foreach ($dataArray as $foundCourse => $courseData) {
$output = "";
$output .= "<p><strong>Course:</strong> " . $courseData['CourseNo'] . " - " . $courseData['CourseName'] . "</p>";
$moduleHTML = "";
$moduleHTML .= '<select name="module" id="modulesDrop">'.PHP_EOL;
$moduleHTML .= '<option value="">Please Select</option>'.PHP_EOL;
foreach ($courseData['Modules'] as $moduleId => $moduleData) {
$moduleHTML .= "<option value='$moduleId'>" . $moduleData['ModuleNo'] . " - " . $moduleData['ModuleName'] ."</option>".PHP_EOL;
}
}
$moduleHTML .= '</select>';
echo $output;
?>
<form action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post">
<table>
<tr>
<th>Course: <?php echo $moduleHTML; ?>
<input id="courseSubmit" type="submit" value="Submit" name="submit" />
</th>
</tr>
</table>
</form>
因此,我想在“课程”下拉菜单中选择课程INFO101 - Information Communication Technology
,它会在下面的“模块”下拉菜单中显示以下模块,这些模块与该课程相对应:
CHI2520 - Advanced Web Programming
CHI2220 - Systems Strategy
CHI2350 - Interactive Systems
现在我想做的是我希望用户从下拉菜单中选择一个模块,然后提交下面的表单以导航到QandATable.php页面。但我想知道如何从下拉菜单中检索模块编号和名称并将其显示在QandATable.php页面中?我知道我应该使用$ _SESSION变量如何以及在哪里编写两个页面中的$ _SESSION变量?我还需要使用isset
所以我没有得到未定义的变量吗?
下面是导航到QandATable.php的表单:
<form action="QandATable.php" method="post" id="sessionForm">
<table><tr><th>6: Module:</th>
<td><?php echo $moduleHTML; ?></td>
</tr>
</table>
<p><strong>11: </strong><input class="questionBtn" type="submit" value="Prepare Questions" name="prequestion" /></p>
</form>
答案 0 :(得分:0)
回答你的问题。是的,最好在最初发布的变量上使用isset或is_null,以确保您具有有效值。在将其写入会话变量的情况下,尽管无关紧要。您可以为会话变量分配空值,但如果您尝试使用期望有效值的会话变量,则最终可能会导致意外结果。
要设置会话变量,您可以执行以下操作。您可以随时设置此项以更新变量。在收集用户的数据后,我通常会在帖子页面上分配这些内容。
$_SESSION['variableName'] = $_POST['postedVariable'];
请记住,您还需要在每个页面的最顶部使用以下代码,这些代码将使用会话或者可以使用已建立的会话变量进行命中。如果您没有在页面上设置此代码并且用户访问该代码,您将失去会话跟踪。
session_start();
要稍后引用存储的会话变量,您可以这样做:
echo $_SESSION['variableName'];
希望我能正确理解你的问题。
答案 1 :(得分:0)
但我想知道如何从下拉菜单中检索模块编号和名称并将其显示在QandATable.php页面中?我知道我应该使用$ _SESSION变量如何以及在哪里编写两个页面中的$ _SESSION变量?
在此PHP代码的末尾,您可以保存$ dataArray的全部或任何部分,例如
if (!isset($_SESSION)) {
session_start();
}
$_SESSION['dataArray'] = $dataArray;
加载QandATable.php页面时,请致电:
if (!isset($_SESSION)) {
session_start();
}
if (isset($_SESSION['dataArray'])){
$dataArray = $_SESSION['dataArray'];
}
然后,您可以使用您选择的选项(来自$ _POST)作为数组的索引,以获取您想要的信息。