Php 循环仅通过一组数据

Php 循环仅通过一组数据,php,mysqli,Php,Mysqli,在一个或两个相关下拉菜单中选择All选项时,我在循环数据时遇到问题。它不是遍历所有记录并显示它们,它只是遍历一组数据。假设它显示每个学生及其参与的每个问题的详细信息。但它只展示了一个学生和一个问题,仅此而已 下面是它应该显示的内容: 但现在它只是展示了这一点: 我相信造成这个问题的原因是我设置的动态WHERE子句。下面是动态WHERE子句的工作原理: q.SessionId=? 如果用户从student下拉菜单中选择single student,则将和sa.StudentId=?添加到WH

在一个或两个相关下拉菜单中选择
All
选项时,我在循环数据时遇到问题。它不是遍历所有记录并显示它们,它只是遍历一组数据。假设它显示每个学生及其参与的每个问题的详细信息。但它只展示了一个学生和一个问题,仅此而已

下面是它应该显示的内容:

但现在它只是展示了这一点:

我相信造成这个问题的原因是我设置的动态WHERE子句。下面是动态WHERE子句的工作原理:

  • q.SessionId=?
  • 如果用户从student下拉菜单中选择single student,则将
    和sa.StudentId=?
    添加到WHERE子句中
  • 如果用户从学生下拉菜单中选择
    All
    students选项,则从WHERE子句中删除或不显示
    和sa.StudentId=?
  • 如果用户从问题下拉菜单中选择单个问题,则将
    和q.QuestionId=?
    添加到WHERE子句中
  • 如果用户从问题下拉菜单中选择
    All
    questions选项,则从WHERE子句中删除或不显示
    和q.QuestionId=?
我有三个下拉菜单(下面是示例数据的外观):

会话:

<select name="session" id="sessionsDrop">
<option value="26">POKUB1</option>
<option value="27">POKUB2</option>
</select>
<select name="student" id="studentsDrop">
<option value="0">All</option>
<option value="39">Luke Mcfadzen</option>
<option value="40">Chris Tucker</option>
</select>
<select name="question" id="questionsDrop">
<option value="0">All</option>
<option value="72">1</option>
<option value="73">2</option>
</select>
以下是
$\u POST['student']
$\u POST['question']
可能的变量转储:

单个学生和单个问题:

<select name="session" id="sessionsDrop">
<option value="26">POKUB1</option>
<option value="27">POKUB2</option>
</select>
<select name="student" id="studentsDrop">
<option value="0">All</option>
<option value="39">Luke Mcfadzen</option>
<option value="40">Chris Tucker</option>
</select>
<select name="question" id="questionsDrop">
<option value="0">All</option>
<option value="72">1</option>
<option value="73">2</option>
</select>
  • 学生:克里斯·塔克-弦乐(2)“40”
  • 问题:1-字串(2)“72”
单个学生和所有问题:

<select name="session" id="sessionsDrop">
<option value="26">POKUB1</option>
<option value="27">POKUB2</option>
</select>
<select name="student" id="studentsDrop">
<option value="0">All</option>
<option value="39">Luke Mcfadzen</option>
<option value="40">Chris Tucker</option>
</select>
<select name="question" id="questionsDrop">
<option value="0">All</option>
<option value="72">1</option>
<option value="73">2</option>
</select>
  • 学生:克里斯·塔克-弦乐(2)“40”
  • 问题:全部-字符串(1)“0”
所有学生和单个问题:

<select name="session" id="sessionsDrop">
<option value="26">POKUB1</option>
<option value="27">POKUB2</option>
</select>
<select name="student" id="studentsDrop">
<option value="0">All</option>
<option value="39">Luke Mcfadzen</option>
<option value="40">Chris Tucker</option>
</select>
<select name="question" id="questionsDrop">
<option value="0">All</option>
<option value="72">1</option>
<option value="73">2</option>
</select>
  • 学生:全部-字符串(1)“0”
  • 问题:1-字串(1)“72”
所有学生和所有问题:

<select name="session" id="sessionsDrop">
<option value="26">POKUB1</option>
<option value="27">POKUB2</option>
</select>
<select name="student" id="studentsDrop">
<option value="0">All</option>
<option value="39">Luke Mcfadzen</option>
<option value="40">Chris Tucker</option>
</select>
<select name="question" id="questionsDrop">
<option value="0">All</option>
<option value="72">1</option>
<option value="73">2</option>
</select>
  • 学生:全部-字符串(1)“0”
  • 问题:全部-字符串(1)“0”
下面是示例
var\u dump($questions)如果我选择
All
学生和
All
问题:

array(1) { 
[39]=> array(4) { 
["studentalias"]=> string(8) "u4838229" 
["studentforename"]=> string(5) "Chris" 
["studentsurname"]=> string(6) "Tucker" 
["questions"]=> array(1) { 
[72]=> array(11) { 
["questionno"]=> int(1) 
["content"]=> string(14) "What is a RAM?" 
["optiontype"]=> string(3) "A-E" 
["noofanswers"]=> int(1) 
["answer"]=> string(7) "B,C,D,E" 
["replytype"]=> string(6) "Single" 
["questionmarks"]=> int(5) 
["studentanswer"]=> string(9) "A,B,C,D,E" 
["responsetime"]=> string(8) "00:00:07" 
["mouseclick"]=> int(1) 
["studentmark"]=> string(1) "2" } } } }
更新:

<select name="session" id="sessionsDrop">
<option value="26">POKUB1</option>
<option value="27">POKUB2</option>
</select>
<select name="student" id="studentsDrop">
<option value="0">All</option>
<option value="39">Luke Mcfadzen</option>
<option value="40">Chris Tucker</option>
</select>
<select name="question" id="questionsDrop">
<option value="0">All</option>
<option value="72">1</option>
<option value="73">2</option>
</select>
如果我在仅检查
q.SessionId=?
时使用静态WHERE子句保留mysqli查询,那么当我在etiher或两个下拉菜单中选择
All
选项时,它会输出结果,没有问题,只有删除动态where子句,我需要将其作为我的用户包括在内,才能选择一个单独的学生和/或所有
选项不能正常工作的单独问题。下面是在使用静态WHERE子句时使用mysqli代码:

$selectedstudentanswerqry = "
    SELECT
    sa.StudentId, StudentAlias, StudentForename, StudentSurname, q.SessionId, 
    q.QuestionId, 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, 
    (
    SELECT sum( StudentMark )
    FROM Student_Answer sta
    WHERE sa.StudentId = sta.StudentId
    AND sa.QuestionId = sta.QuestionId
    )StudentMark
    FROM Student st
    INNER JOIN Student_Answer sa ON (st.StudentId = sa.StudentId)
    INNER JOIN Student_Response sr ON (sa.StudentId = sr.StudentId) AND sa.QuestionId = sr.QuestionId
    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
    LEFT JOIN Session_Taken sta ON (st.StudentId = sta.StudentId)
      WHERE q.SessionId = ?
      GROUP BY sa.StudentId, q.QuestionId
      ORDER BY StudentAlias, q.SessionId, QuestionNo
    ";
    global $mysqli;
$selectedstudentanswerstmt=$mysqli->prepare($selectedstudentanswerqry);
$selectedstudentanswerstmt->bind_param('i',$_POST['session']);
// get result and assign variables (prefix with db)
$selectedstudentanswerstmt->execute(); 
$selectedstudentanswerstmt->bind_result($detailsStudentId,$detailsStudentAlias,$detailsStudentForename,$detailsStudentSurname,$detailsSessionId,
$detailsQuestionId,$detailsQuestionNo,$detailsQuestionContent,$detailsOptionType,$detailsNoofAnswers,$detailsAnswer,$detailsReplyType,$detailsQuestionMarks,
$detailsStudentAnswer,$detailsResponseTime,$detailsMouseClick,$detailsStudentMark); 

我相信你问题的根源在于:

    // Check whether a specific student was selected
    $p_student = empty($_POST["student"])?'':$_POST["student"];

    switch($p_student){
    case 0:
        //dont' add where filters
        break;
    default:
        $where[] = 'sa.StudentId = ?';
        $parameters[] .= $_POST["student"];
        $parameterTypes .= 'i';
    }
将学生添加到where子句的代码只执行一次,不支持选择多个学生

假设您修改代码以从表单中传递一个学生ID数组,则类似的操作应该有效:

if (!empty($_POST['student'])) {

    $students = filter_input_array(INPUT_POST, 'student', FILTER_SANITIZE_NUMBER_INT);

    if ($students !== false) {
        $num_students = count($students);
        $where[]      = 'sa.StudentId IN (' . rtrim(str_repeat('?,', $num_students), ',') . ')';
        $parameters   = array_merge($parameters, $students);
    }
}
有几件事:

  • 永远不要信任未清理的数据,在使用前始终清理/筛选
  • 如果将
    []
    添加到表单字段的名称中(即:
    PHP将在$\u POST中将其解释为数组)
  • 这将使SQL查询返回多个结果,这意味着
    $questions
    将保存所有这些结果
empty()将“0”视为空, 所以在
$p_student=empty($_POST[“student”])?“”:$_POST[“student”];
$p_student在$_POST[“student”]为“0”时为真……因此,下面的情况始终是“默认”,所以如果为空,您应该将$p_student设置为“0”,这应该是可以的……我认为……(当然,这是针对$p_student和$p_问题的)。 `


我想你错过了一个结尾}

// You only need to call bind_param once
现在你的

if(!empty($where)) {

不是在应该结束的地方结束它应该结束在…

按照编码正常工作…你的垃圾堆中只有一个学生/问题…检查$questions是如何建立的,看看为什么只有一个学生进入。另一个骗取代表分数的悬赏。我真的需要帮助,有人有什么想法吗?下面的答案不是一个解决方案,真的你非常需要我给你的同学一个解决方案。这是获得帮助的唯一途径。@YourCommonSense+1,因为你指出了旧问题和廉价技巧…嗨,谢谢你的尝试,但它没有起作用。在尝试你的代码时,该查询不正确,它无法识别我选择了单个学生还是单个问题,它仍然在做同样的事情输出当从下拉菜单中选择所有学生和所有问题时,它根本不起作用,但这仍然是一个很好的尝试?您确定通过$\u POST传入了多个学生ID吗?我知道的是,使用动态where子句,它不会在where子句中为学生生成条件('sa.StudentId=?
)如果student selected为
All`哪个值为0。这同样适用于问题,如果为问题选择了All,则没有(q.QuestionId=?)如果我只是保持查询的原样,您会看到在动态where子句前面(只需忽略上面代码中的动态WHERE子句,想象WHERE子句只是
q.SessionId=?
,然后它显示了所有学生以及他们按照我的要求正确回答的问题。但是添加一个动态WHERE子句会出现一些错误。我不确定是否传递了多个学生ID,是否有办法进行检查。)我很高兴知道如何检查它做一个
var_dump($\u POST['student'])
,你就可以看到它包含了什么。你能给我看一下代码片段吗,bounty快用完了,所以需要一个快速的解决方案,这样我就可以在bounty用完之前奖励它了嗨,谢谢你的代码片段,但运气不好,它仍然在做同样的事情,有什么问题吗