如何使用$_SESSION变量检索数据并将其显示在另一个页面中



下面我有一个php脚本,它显示了一个"Course"下拉菜单和一个"Module"下拉菜单。假设用户首先从"课程"下拉菜单中选择一门课程,然后"模块"下拉菜单中将显示属于所选课程的模块列表。以下是代码:

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>

回答您的问题。是的,最好对最初发布的变量使用isset或is_null,以确保您有一个有效的值。在将其写入会话变量的情况下,尽管这并不重要。您可以为会话变量分配一个null值,但如果您尝试使用期望有效值的会话变量,则可能会在以后导致意外的结果。

要设置会话变量,可以执行以下操作。为了更新变量,您可以随时进行设置。我通常会在从用户那里收集数据后,在帖子页面的某个地方分配这些数据。

$_SESSION['variableName'] = $_POST['postedVariable'];

请记住,您还需要在每个将使用会话或可能被建立的会话变量击中的页面的顶部使用以下代码。如果您在页面上没有设置此代码,而用户访问了它,您将丢失会话跟踪。

session_start();

要稍后引用存储的会话变量,您可以这样做:

echo $_SESSION['variableName'];

希望我能正确理解你的问题。

但我想知道如何从下拉菜单中检索模块编号和名称,并将其显示在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)作为数组的索引来获取所需信息。

最新更新