0

我有一个调查页面-根据您对以前问题的回答显示和隐藏使用 jquery 的其他问题(这些问题因所有输入类型而异)我有一个保存功能,然后是一个保存和提交功能 - 保存和提交时我需要验证所有尚未隐藏的问题都已得到回答 - 在使用输出进行原型设计以测试语法时,我意识到我正在运行的大量 mysqli 查询会减慢页面速度(可能超过 300 个问题或短于10)

下面是一个查询,以找出分配给该调查的问题数量(sid,$surveyid),$qcountup 是我让 while 语句访问 1 到最高问题编号($qtotal)之间的每个数字的方法我们下到 while 语句,它对从 1 到 $qtotal 的每个数字进行重新操作,而我们运行查询以找出数据库中每个数字是否存在答案(如果没有回答 - 它不会存在。再次,目前如何编码可能意味着 300 多个 mysqli 查询 (LAG)。关于如何压缩或写得更好的任何建议?

    $qquery = "SELECT * FROM question WHERE (sid = ".$surveyid.");";
$qresult = mysqli_query($dbc, $qquery);
$qtotal = mysqli_num_rows($qresult);
$qcountup = 1;
while($qcountup <= $qtotal){
$squery = "SELECT * FROM answers WHERE sid='".$SID."' AND question='".$qcountup."';";
$sresult = mysqli_query($dbc, $squery) or die(mysql_error());
if (mysqli_num_rows($sresult) )
{
echo("<br>row existed");
} else {
echo("<br>row doesn't exist");
}     
$qcountup = $qcountup + 1;    
}
4

1 回答 1

1

首先,由于您使用的是 mysqli,因此您应该使用准备好的查询,而不是将变量直接插入到查询字符串中。

第一个查询应该是:

SELECT COUNT(*) qtotal FROM question WHERE sid = "$surveyid"

如果您只对数字感兴趣,则无需获取所有列。设置为此结果$qtotalqtotal列。

对于第二部分,您可以使用 LEFT JOIN 将问题与答案进行匹配,并查看缺少哪些答案:

SELECT * FROM questions q LEFT JOIN answers a USING (question, sid)
WHERE q.sid = $SID
ORDER BY q.question

如果缺少答案,则该行中的 a.question 将为 NULL。

我不确定我是否应该在那里使用 $SID 或 $surveyid;您在不同查询中使用的原始代码。

于 2012-10-20T06:53:45.097 回答