2012-10-20 68 views
0

我有一个网页,根据您的回答前面的问题显示了一个调查 - 和使用jquery(这些问题与所有的输入类型不同)我有一个保存隐藏其他问题函数,然后保存并提交功能 - 保存和提交我需要验证没有被隐藏已回答所有的问题的时候 - 与输出的测试,我意识到,我正在运行的mysqli querys的大规模量减缓语法原型本页面向下(可以是300个问题或10个简短的问题)的mysqli - 多少是太多了(很慢)

我们下面的查询是查询有多少问题分配给这个调查(sid,$ surveyid),$ qcountup是我的方式使用while语句访问1和最高问题号($ q)之间的每一个数字总) 我们踏踏实实地是从1翻修术,每数while语句 - 的同时里面我们运行一个查询以了解是否有答案存在于数据库中的每个号码(如果它没有回答$ QTOTAL) - 它不存在。 再怎么这是目前编码可能意味着300+ mysqli的querys(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;  
} 

回答

1

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

第一个查询应该是:

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

如果你只在一些感兴趣的,就没有必要把所有的列。设置$qtotal这一结果的qtotal列。

对于第二部分中,您可以使用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那里。您的原始代码都用于不同的查询。

+0

遗憾没能澄清 - 我需要的问题太多,以确定条款是否得到满足来隐藏的问题 - 但我的另一个问题是,我可以匹配的问题数(以QID识别问题表)的答复号,也有没有办法在发言后选择由其编号的答案,就好像它是一个数组 - (如果我需要从#23或某事的答案提交的答案[23]) –

+1

'$ dbc'仅仅是数据库联接被'mysqli_connect()'返回,它不包含任何信息。我会很快用一个新的查询来更新我的答案,这个查询将答案与问题进行匹配。 – Barmar

+0

是的,我看到了$ DBC参考刚过,我打添加注释 - 我欣赏的帮助 - 这真是一个话题,我失去了 –