1

以下に動的な where 句を使用したクエリがありますが、GROUP BY 句と ORDER BY 句を配置する場所に問題があります。準備ステートメントがこれらの句の前にあるため、まったくトリガーされていないと思います。しかし、prepare ステートメントの上に句行を配置することを単純に許可するわけではありません。または、まったく別の行に未定義の質問を示すエラーが表示されます。私の質問は、GROUP BY AND ORDER BY CLAUSE をどこに正しく配置する必要があるかということです。

コード:

$selectedstudentanswerqry = "
        SELECT
        sa.StudentId, StudentAlias, StudentForename, StudentSurname, q.SessionId, 
    ...
        FROM Student st
    ...
        ";

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


        //check if POST is empty

        // Check whether a specific student was selected

        $p_student = empty($_POST["student"])?0:$_POST["student"];  // Now if $_POST['student'] is either 0 or empty $p_student will be 0
    echo $p_student;
        switch($p_student){
        case 0:
            //dont' add where filters
            break;
        default:
            $where[] = 'sa.StudentId = ?';
            $parameters[] .= $_POST["student"];
            $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]);
        }

        }

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

1 に答える 1

1

準備ステートメントと、bind_param() を含む if ステートメントを GROUP BY/ORDER BY 句の下に移動します。}すぐ上$selectedstudentanswerqryに上に移動できるクロージングがありますif (count($where) == 1)

于 2013-02-18T16:38:31.140 に答える