0

私は調査であるページを持っています-以前の質問に対するあなたの回答に基づいて、jqueryを使用して他の質問を表示および非表示にします(これらの質問はすべての入力タイプによって異なります)保存機能と保存および送信機能があります-保存および送信時非表示になっていないすべての質問に回答済みであることを確認する必要があります - 構文をテストするための出力を使用してこれをプロトタイピングする際に、実行している大量の mysqli クエリがページの速度を低下させることに気付きました (300 以上の質問または10)

以下は、この調査に割り当てられている質問の数を調べるためのクエリ (sid、$surveyid) です。$qcountup は、1 から最大の質問番号 ($qtotal) までのすべての番号に while ステートメントをアクセスさせる私の方法でした。データベース内の各数値に対して回答が存在するかどうかを確認するクエリを実行している間に、1 から $qtotal までのすべての数値に対して再動作する while ステートメントに行き着きます (回答されていない場合は存在しません)。繰り返しになりますが、これが現在どのようにコーディングされているかというと、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"

数値のみに関心がある場合は、すべての列を取得する必要はありません。この結果の列に設定$qtotalします。qtotal

2 番目の部分では、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 に答える