1

以下に、「コース」ドロップダウンメニューと「モジュール」ドロップダウンメニューを表示する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

ここでやりたいことは、ユーザーがドロップダウン メニューからモジュールの 1 つを選択し、以下のフォームを送信して 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>
4

2 に答える 2

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 から) を配列のインデックスとして使用して、必要な情報を取得できます。

于 2012-11-26T02:37:10.123 に答える
0

ご質問にお答えします。はい、最初にポストされる変数に isset または is_null を使用して、有効な値があることを確認することをお勧めします。セッション変数に書き込む状況では問題ありませんが。セッション変数に null 値を割り当てることはできますが、有効な値を期待してセッション変数を使用しようとすると、後で意図しない結果が生じる可能性があります。

セッション変数を設定するには、次のようにします。これは、変数を更新するために必要なときにいつでも設定できます。私は通常、ユーザーからデータを収集した後、投稿ページのどこかにこれらを割り当てます。

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

セッションを使用するか、確立されたセッション変数でヒットする可能性のあるすべてのページの最上部に、次のコードも必要であることを忘れないでください。このコードがページに設定されておらず、ユーザーがそのページにアクセスすると、セッション トラッキングが失われます。

session_start();

保存されたセッション変数を後で参照するには、次のようにします。

echo $_SESSION['variableName'];

あなたの質問を正しく理解できたことを願っています。

于 2012-11-26T01:14:18.247 に答える