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; 

            // session data
            $_SESSION['idcourse'] = $dbCourseNo;
            $_SESSION['namecourse'] = $dbCourseName;
            $_SESSION['idmodule'] = $dbModuleNo;
            $_SESSION['namemodule'] = $dbModuleName;

            }

        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

今、これは私が抱えている問題です。モジュールを選択してからCHI2520 - Advanced Web Programming下のページにアクセスすると、代わりにこのモジュールが表示されますCHI2350 - Interactive Systems

QandATable.php:

    <?php

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

        $_SESSION['idmodule'] = $_POST['idmodule'];

    }

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

        $_SESSION['namemodule'] = $_POST['namemodule'];

    }

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

$_SESSION['idcourse'] = $_POST['idcourse'];

}

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

$_SESSION['namecourse'] = $_POST['namecourse'];

}


    $outputDetails = "";
    $outputDetails .= "
    <table id='sessionDetails' border='1'>
    <tr>
    <th>Course:</th> 
    <th>{$_SESSION['idcourse']}  {$_SESSION['namecourse']}</th>
    </tr>
<tr>
<th>Module:</th> 
<th>{$_SESSION['idmodule']}  {$_SESSION['namemodule']}</th>
</tr>
    </table>
    ";

    echo $outputDetails;

    ?>

私の質問は、なぜ他のページに間違ったモジュール番号と名前が表示されるのですか?両方のページに含まれていますsession_start();

以下は、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

1

ページがすでに読み込まれると、phpセッションを割り当てることはできません。ええと、php自体だけではありません!説明させてください:

  • 最初のリクエスト(フォームがダウンロードされます-モジュールは表示されません)

  • 2番目のリクエスト(新しいフォームがダウンロードされます-送信されたコースIDに基づいて、適切なモジュールを表示します)

  • 3番目のリクエスト(送信されたmoduleidに基づいて、後で使用するためにphpセッションにデータを入力する必要があります)

あなたがやろうとしていたのは、2番目のリクエスト中にセッション変数を設定することです...しかし、そうすることで正しいモジュールIDを取得する方法はありません!ページがブラウザのすぐ内側にある特定の時点で何が選択されているかを知っているのは、ブラウザと最終的にはjavascriptだけです。

私が今言ったように、あなたが実際にしたことは、2番目のリクエストであなたのセッションを書くことです。これは、ユーザーがモジュールを選択する前にセッション変数を作成したことを意味します。そして、あなたがセッションに入れたのは、ループ内の最後にフェッチされた結果行にすぎませんでした!これが、セッションの最後のモジュールを常に持っていた理由です。あなたの場合は、それがInteractive Systems

今すぐ解決策を見つけましょう

コース/モジュールセレクターが適切に機能し、ユーザーがコースを選択すると適切なモジュールが表示される場合は、3番目のリクエストを行うだけです。

<form name="moduleid" [...] >

    <option value="[moduleid]> [moduleno] - [modulename] </option>
    
    [...]
    
</form>

このような構造に基づいて...モジュールフォームは次のようになります...モジュールを追加する場合と同じように、サーバーに対して3番目のリクエストを実行する必要があります。選択するか、別のものを選択してください!ここでの手がかりコードは以下のようなものです...出力を生成する必要さえありません;)

if ( isset($_POST['moduleid']) )
{
    $stmt = $mysqli->prepare('select moduleno, modulename from  module where moduleid = ?');
    
    $stmt->bind_param('s', $_POST['moduleid'] );
    
    if ( $stmt->execute() )
    {   
            $stmt->bind_result($moduleno, $modulename); $stmt->fetch();

        $_SESSION['moduleid'] = $_POST['moduleid'];
        $_SESSION['moduleno'] = $moduleno;
        $_SESSION['modulename'] = $modulename;
    }
}

コース/モジュールセレクターが正しく機能しない場合...他の回答を参照してください;)

于 2012-11-28T20:47:22.453 に答える
0

ここで元のスクリプトから何を省略したかはわかりませんが、適切に実行しないと、セッションと投稿変数の使用が難しい可能性があることを問題が強調しているようです。ここで読むことができるように、2つの方法のそれぞれには本当に特定の目的があります。あなたが私たちに提供した情報については、投稿変数は十分すぎるでしょう:)

スクリプトのどこかに、ループが繰り返されるたびにセッション変数を再割り当てする場所があります。つまり、最後の「モジュール」のみがセッションに保存されます。

$_SESSION['idcourse'] = $dbCourseNo;
$_SESSION['namecourse'] = $dbCourseName;
$_SESSION['idmodule'] = $dbModuleNo;
$_SESSION['namemodule'] = $dbModuleName;

ただし、一方で、このコードのどこでもセッションを使用していないため、(少なくともこのページでは)役に立たないか、無関係である可能性があります。

それ以外は、あなたの行動で奇妙なことをする必要はありません!

<form action="" method="post">

それはまったく同じことをします;)そしてphpを含みません!

他に何が...問題はクエリにもある可能性があり、データベースから破損した情報を取得します!


これが簡単な解決策です

いくつかのエラーがあるかもしれません...私はまだスクリプトを実行していません!私には利用可能なWebサーバーがありません、私の悪い...しかし、あなたはこのメントが行われる方法の1つを捕まえるかもしれません!それはあなたにアイデアを与えるためだけです、なぜならあなたはそのためにそのセッション全体のオーバーヘッドを本当に必要としないからです;)私はあなたの2番目のクエリを少し変更しました...あなたも3つのテーブルを結合する必要がない可能性が非常に高いです!実際、 course_modulesmoduleは、前のフォーム送信からコースIDを取得した場合に、必要なすべての情報を提供します。

毎回最初のクエリを実行するだけです...3つのテーブルを結合することは、より簡単なクエリを作成するよりも速くはありません。

<?php $_courseid = isset($_POST['courseid']) ? $_POST['courseid'] : null; ?>

<!-- action filled only for validation purpose, all browsers will reload the same page by default -->

<form method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>">

    <!-- you should be using tables for tabular data only -->

    Course: 

    <!-- using onchange is user friendly -->

    <select name="courseid" id="coursesDrop" onchange="this.form.submit()">

    <?php if ( !isset($_courseid) ): ?>

        <option selected>Please Select</option>

    <?php endif; 

    $result = $mysqli->query('select courseid, courseno, coursename from course');

    while( list($courseid, $courseno, $coursename) = $result->fetch_array() ): ?>

        <option value="<?php echo $courseid ?>" <?php if ($_courseid == $courseid) echo "selected" ?>>

            <?php echo "{$courseno} - {$coursename}" ?>

        </option>

    <?php endwhile; $result->free(); ?> 

    </select>            

    <?php if ( isset($_courseid) ): ?>

    <select name="module" id="modulesDrop">   

        <option selected>Please Select</option>         

        <?php $stmt = $mysqli->prepare('select m.moduleid, moduleno, modulename form `course_module` join `module` m using(moduleid) where courseid = ? order by m.moduleid');

        $stmt->bind_param('s', $_courseid);

        $stmt->execute();

        $result = $stmt->store_result();

        while( list($moduleid, $moduleno, $modulename) = $result->fetch_array() ): ?>

            <option value="<?php echo $moduleid ?>"><?php echo "{$moduleno} - {$modulename}" ?></option>

        <?php endwhile; $result->free(); $stmt->close(); ?>

        </select>

    <? endif; ?>

</form> 
于 2012-11-25T00:27:10.060 に答える