0

以下のコードでは、ユーザーが「コース」と入力すると、その特定のコースに属する関連モジュールが表示され、選択したモジュールに属するドロップダウンメニューが表示されます。

問題は、その特定のモジュールの下に多くのセッションがあるにもかかわらず、モジュールに属するドロップダウンメニューに1つのセッションしか表示されないことです。

たとえば、データベースの「セッション」テーブルは次のとおりです。

セッションテーブル:

SessionId SessionDate SessionTime ModuleId
AAA       2012-10-19  09:00:00    CHI2513
AFD       2012-10-29  10:00:00    CHI2513
TPP       2012-09-11  09:00:00    CHI2513
NUM       2012-05-03  11:00:00    CHI2513

次に、ユーザーが[モジュール]ドロップダウンメニューから[モジュール"CHI2513]を選択すると、[セッション]ドロップダウンメニューに次のオプションが表示されます。

セッションドロップダウンメニュー:

AAA       2012-10-19  09:00:00
AFD       2012-10-29  10:00:00
TPP       2012-09-11  09:00:00
NUM       2012-05-03  11:00:00

ただし、代わりに、以下のようにドロップダウンメニューに1つのセッションのみが表示されます。

現在表示されているセッションドロップダウンメニュー:

TPP       2012-09-11  09:00:00

では、選択したモジュールに関連するすべてのセッションをドロップダウンメニューに表示するにはどうすればよいですか?

以下はコードです:

<?php
  if (isset($_POST['submit'])) {

    $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",$courseid);
// 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 '$courseid'</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 $courseId => $courseData) {

      $output = ""; 

      $output .= "<p><strong>Course:</strong> " . $courseId .  " - "  . $courseData['CourseName'] . "</p>";

   $moduleHTML = ""; 
   $moduleHTML .= '<select name="modulesDrop" 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="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post">
     <p>Module: <?php echo $moduleHTML; ?><input id="moduleSubmit" type="submit" value="Submit" name="modulesubmit" /></p>      
    </form> 



    <?php
}
}

$sessionnum = 0;

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

     if($_REQUEST['modulesDrop']==''){

         echo "Please Select a Module from the Drop Down Menu Above";

     }
     else{  

 var_dump($_POST['modulesDrop']);

        $sessionquery = "
             SELECT SessionId, SessionDate, SessionTime, ModuleId
             FROM Session
             WHERE
             (ModuleId = ?)
             ORDER BY SessionDate, SessionTime 
            ";

$sessionqrystmt=$mysqli->prepare($sessionquery);
// You only need to call bind_param once
$sessionqrystmt->bind_param("s",$_POST['modulesDrop']);
// get result and assign variables (prefix with db)

$sessionqrystmt->execute(); 

$sessionqrystmt->bind_result($dbSessionId,$dbSessionDate,$dbSessionTime, $dbModuleId);

 $sessionqrystmt->store_result();

$sessionnum = $sessionqrystmt->num_rows();   

    $dataArraySession = array();

 while ( $sessionqrystmt->fetch() ) { 

 $dataArraySession[$dbSessionId]['SessionDate'] = $dbSessionDate; 
 $dataArraySession[$dbSessionId]['SessionTime'] = $dbSessionTime;

}

foreach ($dataArraySession as $sessionId => $sessionData) {



   $sessionHTML = ""; 
   $sessionHTML .= '<select name="session" id="sessionsDrop">'.PHP_EOL;
   $sessionHTML .= '<option value="">Please Select</option>'.PHP_EOL;           
   $sessionHTML .= "<option value='$sessionId'>" . $sessionId . " - " . $sessionData['SessionDate']. " - " . $sessionData['SessionTime'] ."</option>".PHP_EOL;        

        }

   $sessionHTML .= '</select>';
}
 if ($sessionnum > 0) {

 ?>

     <form action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post">
     <p>Sessions: <?php echo $sessionHTML; ?><input id="sessionSubmit" type="submit" value="Submit" name="sesionsubmit" /></p>      
    </form>       

<?php

}
else {
 echo "<p>Sorry, You have No Sessions under this Module</p>";
}

}


    ?>
4

1 に答える 1

1

さて、あなたはORDER BYあなたのクエリに句を適用しています、それは私にデータのTPP行がクエリによって出力されるデータの最後のビットであると言います。次に、HTML出力を構築するループを確認するように指示されます。

そのループ$output = "";では、ループの最初にあります。これは、ループのパスごとにリセットされます。そして、あなたは同じことをします$moduleHTML

$outputしたがって、すべてのループの最後にエコーされると、結果が正しく表示されることがわかります。しかし、以下の形式ではmodelHTML、結果をループするたびにリセットされるため、.=それに追加するという概念が否定されます。あなたがすべきことは

$moduleHTMLforeachの外側にあるため、最初にそこで定義され、それ以外はすべて同じに保ちます。

例えば:

$moduleHTML = "";
foreach(....){.....}

それ以外の

foreach(....){....$moduleHTML = "";....}

現在行っているのは、ウィジェット、モジュール、フォームなどの出力のループを介して、いわば最後の実行を保存することだけです。

于 2012-10-18T23:12:02.547 に答える