0

以下に、学生用と質問用の 2 つの HTML ドロップダウン メニューがあります。

<select name="question" id="questionsDrop">
<option value="0">All</option>
<option value="2">What is 2+2</option>
<option value="34">What is 3+3</option>
<option value="42">What is 4+4</option>
<option value="51">What is 5+5/option>

</select>  


 <select name="student" id="studentsDrop">
    <option value="0">All</option>
    <option value="23">Jay Hart</option>
    <option value="32">Bubba Wright</option>
    <option value="43">Tim Grey</option>
    <option value="52">Mary Pine</option>
    </select>

以下は、上記の 2 つのドロップダウン メニューから選択したオプションに応じて結果を出力する mysqli クエリです。

 $selectedstudentanswerqry = "
    SELECT
    sa.StudentId, StudentAlias, StudentForename, StudentSurname, q.SessionId, 
    QuestionNo, QuestionContent, o.OptionType, q.NoofAnswers, 
    GROUP_CONCAT( DISTINCT Answer ORDER BY Answer SEPARATOR ',' ) AS Answer, r.ReplyType, QuestionMarks, 
    GROUP_CONCAT(DISTINCT StudentAnswer ORDER BY StudentAnswer SEPARATOR ',') AS StudentAnswer, ResponseTime, MouseClick, StudentMark
    FROM Student st
    INNER JOIN Student_Answer sa ON (st.StudentId = sa.StudentId)
    INNER JOIN Student_Response sr ON (sa.StudentId = sr.StudentId)
    INNER JOIN Question q ON (sa.QuestionId = q.QuestionId)
    INNER JOIN Answer an ON q.QuestionId = an.QuestionId
    LEFT JOIN Reply r ON q.ReplyId = r.ReplyId
    LEFT JOIN Option_Table o ON q.OptionId = o.OptionId
    ";

    // Initially empty
    $where = array('q.SessionId = ?');
    $parameters = array($_POST["session"]);
    $parameterTypes = 'i';

    // Check whether a specific student was selected
    if($_POST["student"] != '0') {
        $where[] = 'sa.StudentId = ?';
        $parameters[] .= $_POST["student"];
        $parameterTypes .= 'i';
    }

    // Check whether a specific question was selected
    // NB: This is not an else if!
    if($_POST["question"] != '0') {
        $where[] = 'q.QuestionId = ?';
        $parameters[] .= $_POST["question"];
        $parameterTypes .= 'i';
    }

    // If we added to $where in any of the conditionals, we need a WHERE clause in
    // our query
    if(!empty($where)) {
        $selectedstudentanswerqry .= ' WHERE ' . implode(' AND ', $where);
        global $mysqli;
        $selectedstudentanswerstmt=$mysqli->prepare($selectedstudentanswerqry);
        // You only need to call bind_param once

        if (count($where) == 1) {
        $selectedstudentanswerstmt->bind_param($parameterTypes, $parameters[0]);
    }
    else if (count($where) == 2) {
        $selectedstudentanswerstmt->bind_param($parameterTypes, $parameters[0], $parameters[1]);
    }
    else if (count($where) == 3) {
        $selectedstudentanswerstmt->bind_param($parameterTypes, $parameters[0], $parameters[1], $parameters[2]);
    }

    }

    $selectedstudentanswerqry .= "
      GROUP BY sa.StudentId, q.QuestionId
      ORDER BY StudentAlias, q.SessionId, QuestionNo
    ";

.......................................................................................

    $arrStudentId = array();
    $arrStudentAlias = array();
    $arrStudentForename = array();
    $arrStudentSurname = array();
    $arrQuestionNo = array();
    $arrQuestionContent = array();


    while ($selectedstudentanswerstmt->fetch()) {
    $arrStudentId[ $detailsStudentId ] = $detailsStudentId;
    $arrStudentAlias[ $detailsStudentId ] = $detailsStudentAlias;
    $arrStudentForename[ $detailsStudentId ] = $detailsStudentForename;
    $arrStudentSurname[ $detailsStudentId ] = $detailsStudentSurname;
    $arrQuestionNo[ $detailsStudentId ] = $detailsQuestionNo;
    $arrQuestionContent[ $detailsStudentId ] = $detailsQuestonContent;

}

          foreach ($arrStudentId as $key=>$student) {

echo '<p><strong>Question:</strong> ' .htmlspecialchars($arrQuestionNo[$key]). ': ' .htmlspecialchars($arrQuestionContent[$key]). '</p>' . PHP_EOL;


}

データベース内の実際のIDであるため、DBはドロップダウンメニューから値を取得できるため、それぞれのドロップダウンメニューから特定の学生または特定の質問を選択すると、問題なく詳細が出力されます。

しかし問題は、Allどちらかのドロップダウン メニューからオプションを選択した場合です。All両方のドロップダウン メニューのオプションの値は です0。今0はIDとしてデータベースにありません。ユーザーがAllオプションを選択するAllと、学生のドロップダウンメニューで選択された場合は学生の詳細が 表示Allされ、質問のドロップダウンメニューで選択された場合は質問の詳細が表示されます。

現在、クエリは、適切な条件を含めるように構築された動的な WHERE 句を使用して、これを行うためのデータを収集しています。Allしかし、私の質問は、ユーザーが関連するドロップダウンメニューでオプションを選択した場合、学生/質問のすべての詳細を表示するにはどうすればよいですか?

RING0の回答を扱う更新:

Notice: Array to string conversion in ... on line 358

Warning: mysqli::prepare(): (42S22/1054): Unknown column 'Array' in 'where clause' in ... on line 360

Fatal error: Call to a member function bind_param() on a non-object in ... on line 370

コードの更新:

    $selectedstudentanswerqry = "
    SELECT
    sa.StudentId, StudentAlias, StudentForename, StudentSurname, q.SessionId, 
    QuestionNo, QuestionContent, o.OptionType, q.NoofAnswers, 
    GROUP_CONCAT( DISTINCT Answer ORDER BY Answer SEPARATOR ',' ) AS Answer, r.ReplyType, QuestionMarks, 
    GROUP_CONCAT(DISTINCT StudentAnswer ORDER BY StudentAnswer SEPARATOR ',') AS StudentAnswer, ResponseTime, MouseClick, StudentMark
    FROM Student st
    INNER JOIN Student_Answer sa ON (st.StudentId = sa.StudentId)
    INNER JOIN Student_Response sr ON (sa.StudentId = sr.StudentId)
    INNER JOIN Question q ON (sa.QuestionId = q.QuestionId)
    INNER JOIN Answer an ON q.QuestionId = an.QuestionId
    LEFT JOIN Reply r ON q.ReplyId = r.ReplyId
    LEFT JOIN Option_Table o ON q.OptionId = o.OptionId
    ";

    // Initially empty
    $where = array();
    $parameters = array();
    $parameterTypes = '';

    // Check whether a specific session was selected
    if($_POST["session"] != '0') {
      $where[] = array('q.SessionId = ?');
      $parameters[] = array($_POST["session"]);
      $parameterTypes .= 'i';
    }

    // Check whether a specific student was selected
    if($_POST["student"] != '0') {
        $where[] = 'sa.StudentId = ?';
        $parameters[] .= $_POST["student"];
        $parameterTypes .= 'i';
    }

    // Check whether a specific question was selected
    // NB: This is not an else if!
    if($_POST["question"] != '0') {
        $where[] = 'q.QuestionId = ?';
        $parameters[] .= $_POST["question"];
        $parameterTypes .= 'i';
    }

    // If we added to $where in any of the conditionals, we need a WHERE clause in
    // our query
   if(count($where) > 0) {
    $selectedstudentanswerqry .= ' WHERE ' . implode(' AND ', $where);
    global $mysqli;
    $selectedstudentanswerstmt=$mysqli->prepare($selectedstudentanswerqry);
    // You only need to call bind_param once

if (count($where) == 1) {
    $selectedstudentanswerstmt->bind_param($parameterTypes, $parameters[0]);
}
else if (count($where) == 2) {
    $selectedstudentanswerstmt->bind_param($parameterTypes, $parameters[0], $parameters[1]);
}
else if (count($where) == 3) {
    $selectedstudentanswerstmt->bind_param($parameterTypes, $parameters[0], $parameters[1], $parameters[2]);
}

スクリーンショット:

ここに画像の説明を入力

上記のように、学生を選択したことを示していますが、All質問を選択しています。ただし、見出しの下に表示される質問は 1 つだけStudent Answerです。この例では、括弧内に表示される質問の総数は2であるため、1 つの質問ではなく 2 つの質問が表示されます。

データベースのスクリーンショット:

通常のクエリのわずかに短縮されたバージョンですが、メインのクエリにも同じ数の行が表示されるため、これは影響しません。質問が 2 つあるため、2 行で表示されます。StudentId = 1以下の結果は、評価 26 ( ) のすべての質問である 1 人の学生の結果SessionId = 26です。

ここに画像の説明を入力

4

2 に答える 2

2

値がすべてまたは「0」の両方になる可能性がある場合は、切り替えを行うことができます

<?php

//check if POST is empty

$p_student = empty($_POST["student"])?'':$_POST["student"];

switch($p_student){
case 'All':
case '0':
    //dont' add where filters
    break;
default:
    $where[] = 'sa.StudentId = ?';
    $parameters[] .= $_POST["student"];
    $parameterTypes .= 'i';
}

$p_question = empty($_POST["question"])?'':$_POST["question"];

switch($p_question){
case 'All':
case '0':
    //dont' add where filters
    break;
default:
    $where[] = 'q.questionId = ?';
    $parameters[] .= $_POST["question"];
    $parameterTypes .= 'i';
}

ページが直接アクセスされたり、後で更新されたりすると、 GETになる場合があることに注意してください。

したがって、おそらく$_REQUEST ['student']が必要です

コード全体を配置し、私の答えを https://github.com/fedmich/StackOverflow-answers/blob/master/14610396/index.phpにマージしました

于 2013-02-04T02:32:32.953 に答える
1

提供されたコードを見て、次のことに気付きました。

  • オプションの「すべて」の値が「すべて」に設定されていますが、「0」である必要があります。
  • セッションは選択可能ですが、PHP コードはセッションが選択されているかどうかを確認しません
  • あなたが示したHTMLコードには質問の選択がありません

Selectsの「All」のを変更し、Sessionのコードを追加するだけでよいようです。そして、問題に合わせて「質問」を追加しました。

  • 「すべて」のオプション値をすべて変更し、「0」に設定します。

コード:

<select name="session" id="sessionsDrop">
<option value="0">All</option>
<option value="2">EOWOW</option>
<option value="34">EOWOW</option>
<option value="42">EEMOO</option>
<option value="51">EDOOS</option>
</select>  


<select name="student" id="studentsDrop">
<option value="0">All</option>
<option value="23">Jay Hart</option>
...

また、HTMLコードに表示されない「質問」についても

<select name="question" id="questionDrop">
<option value="0">All</option>
<option value="1">What is the 50th State?</option>
...
  • セッションのテスト コードを追加します。

空の配列にいくつかのコードを追加し、セッションが選択されているかどうかを確認します

// Initially empty
$where = array();
$parameters = array();
$parameterTypes = '';

// Check whether a specific session was selected
if($_POST["session"] != '0') {
  $where[] = 'q.SessionId = ?';
  $parameters[] = $_POST["session"];
  $parameterTypes .= 'i';
}

// then same code

// Check whether a specific student was selected
if($_POST["student"] != '0') {
    $where[] = 'sa.StudentId = ?';
    $parameters[] .= $_POST["student"];
    $parameterTypes .= 'i';
}
...

このようにして、PHP コードで 3 つの選択がチェックされ、「すべてが選択されている場合、それらの値は「0」になります。

どこにコードがあるべきか

if(count($where) > 0) {
    global $mysqli;

    $selectedstudentanswerqry .= ' WHERE ' . implode(' AND ', $where);
    $selectedstudentanswerstmt=$mysqli->prepare($selectedstudentanswerqry);
    // You only need to call bind_param once

    if (count($where) == 1) {
      $selectedstudentanswerstmt->bind_param($parameterTypes, $parameters[0]);
    }
    else if (count($where) == 2) {
      $selectedstudentanswerstmt->bind_param($parameterTypes, $parameters[0], $parameters[1]);
    }
    else if (count($where) == 3) {
       $selectedstudentanswerstmt->bind_param($parameterTypes, $parameters[0], $parameters[1], $parameters[2]);
    }
}

編集2

if($_POST["session"] != '0') {
  $where[] = array('q.SessionId = ?');
  $parameters[] = array($_POST["session"]);

arraysを削除します。

if($_POST["session"] != '0') {
  $where[] = 'q.SessionId = ?';
  $parameters[] = $_POST["session"];
于 2013-02-04T01:59:00.893 に答える