【问题标题】:it does not display correct option details from drop down menu它不会从下拉菜单中显示正确的选项详细信息
【发布时间】:2012-10-15 22:29:05
【问题描述】:

我正在尝试检索从课程下拉模块中选择的课程的详细信息,然后显示一个模块下拉菜单,其中列出了属于该课程的所有模块。

我遇到的问题是,可以说我的课程下拉菜单中有这两个选项:

INFO101 - Business
INFO102 - ICT

出于某种奇怪的原因,每次我从下拉菜单中选择顶部选项(INFO101)并单击提交按钮时,它总是显示其他课程详细信息(INFO102),从而显示属于该课程的模块和不是其他课程。

我的问题是,当我从下拉菜单中提交(INFO101)选项时,为什么会显示其他课程的信息?

下面是mysqli代码

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

$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="courses" 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>'; 
$courseHTML .= '</form>'; 

?>

<?php
include('noscript.php');
?>

<h1>CREATING A NEW ASSESSMENT</h1>

<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 = (isset($_POST['courses']));

$query = "
SELECT cm.CourseId, cm.ModuleId, 
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,$dbCourseName,$dbModuleName);

$qrystmt->store_result();

$num = $qrystmt->num_rows();

if($num ==0){
echo "<p>Sorry, No Course was found with this Course ID '$course'</p>";
} else { 

$dataArray = array();

while ( $qrystmt->fetch() ) { 
// data array
$dataArray[$dbCourseId]['CourseName'] = $dbCourseName; 
$dataArray[$dbCourseId]['Modules'][$dbModuleId]['ModuleName'] = $dbModuleName; 
// session data
$_SESSION['idcourse'] = $dbCourseId;
$_SESSION['namecourse'] = $dbCourseName;

}

foreach ($dataArray as $foundCourse => $courseData) {

$output = ""; 

$output .= "<p><strong>Course:</strong> " . $foundCourse .  " - "  . $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'>" . $moduleId . " - " . $moduleData['ModuleName'] ."</option>".PHP_EOL;        
} 
}
$moduleHTML .= '</select>';

echo $output;

更新:

下面是视图页面源显示的内容:

        <form action="/u0000000/Mobile_app/create_session.php" method="post">
        <table>
        <tr>
        <th>Course: <select name="courses" id="coursesDrop">
<option value="">Please Select</option>
<option value='INFO101'>INFO101 - Bsc Information Communication Technology</option>
<option value='INFO102'>INFO102 - Bsc Computing</option>
</select></form><input id="courseSubmit" type="submit" value="Submit" name="submit" /></th>
        </tr>
        </table>
        </form>

        <p>Sorry, No Course was found with this Course ID 'INFO102'</p>  

【问题讨论】:

  • 调试的第一步应该是回显进入该查询(绑定)的值,然后向后跟踪,直到找到问题。查询是用错误的数据做正确的事,还是用正确的数据做错事?似乎是后者。
  • 我不确定查询是否有问题,最上面的查询显示所有课程,这里就是这一行(我将在上面的代码中注释$output .= "&lt;p&gt;&lt;strong&gt;Course:&lt;/strong&gt; " . $course . " - " . $courseData['CourseName'] . "&lt;/p&gt;"; 它显示的是INFO102 - ICT 而不是比INFO101 - Business
  • @MartinLyne 为了开始调试,我应该回显什么?
  • 我只是在寻找要回显的值,但意识到它不存在,我将在下面扩展我的答案..

标签: php pdo mysqli


【解决方案1】:

尝试交换: foreach ($dataArray as $course =&gt; $courseData) 为了 foreach ($dataArray as $foundCourse =&gt; $courseData)

然后foreach 中的所有$courses 也应该重命名。您在页面顶部使用变量$course,即使它不能解决问题,它也会使代码更易于理解。

您还应该考虑使用 PDO 将您的数据库提供程序抽象出来 http://www.php.net/manual/en/faq.databases.php#faq.databases.mysql.deprecated

编辑:

代码说“这里是所有课程,现在如果你提交使用 $course 并获取它的详细信息”

但是您永远不会得到发布的课程,所以它会(碰巧)使用与脚本顶部的foreach“剩余”相同的命名变量。

我建议按照我上面说的那样做 if(isset($_POST['submit'])) 添加 $submittedCourseId = $_POST['coursesDrop'];

然后将 THAT 添加到您的绑定中 $qrystmt-&gt;bind_param("s",$submittedCourseId);

我认为这应该解决问题。

【讨论】:

  • 嗨,我会这样做并回复你,由于大学服务器的版本,我不能使用 PDO(即使我希望我可以)
  • 嗨,我试过你的回答和编辑,我现在唯一的问题是提交下拉菜单后找不到课程,你能看到我有什么吗做错了还是错过了?
  • 我会看一下源和 POST 值(在浏览器中按 F12 并查找网络选项卡(或使用 Firebug),然后提交表单并查找它实际发布的值,然后将该回显放在查询之前,并确保 $submittedCourseId 与该值匹配。
  • 其实,首先,尝试给select标签一个name="coursesDrop"
  • 我将 $_POST 更改为 $_POST['courses']; 但没有更改。我会上萤火虫,看看它发布了什么,我会评论它发布的内容
猜你喜欢
  • 1970-01-01
  • 2023-01-15
  • 1970-01-01
  • 1970-01-01
  • 2020-08-18
  • 1970-01-01
  • 2023-04-10
  • 2019-06-23
相关资源
最近更新 更多