2016-03-08 135 views
1

我有兩個要運行的查詢。結果應該是,困難/問題行列在問題下面的答案中。答案雖然通過JavaScript隱藏,直到我選擇按圖像按鈕,然後應顯示屬於所選問題的答案。子查詢返回多於1行錯誤

代碼:

$result = mysqli_query($mysqli,"SELECT rid, pid, qid, aid, points FROM result WHERE rid=$val"); 
$answertext = mysqli_query($mysqli, "SELECT answer FROM answer_det WHERE pid=(SELECT pid FROM result WHERE rid=$val) AND qid=(SELECT qid FROM result WHERE rid=$val) AND aid=(SELECT aid FROM result WHERE rid=$val)"); 

while($row = mysqli_fetch_array($result) AND $row2 = mysqli_fetch_array($answertext)) 
{ 
    $resultp = $row['points']; 
    $color = "#000000"; 

if (($resultp >= 1) && ($resultp <= 3)) 
    $color = "#FF0000"; 
else if (($resultp >= 3) && ($resultp <= 6)) 
    $color = "#FF9900"; 
else if (($resultp >= 6) && ($resultp <= 10)) 
    $color = "#07d407"; 

    echo "<div class='question-wrap'> 
    <b><small>Dilemma ".$row['qid']." - Answer ". $row['aid'].": </small><span style=\"color: $color\">". $resultp."</span></b> of <b>10 <small>Points</small></b> 
    <input type='image' class='answer-toggle' title='Information' src='img/down.png' width='13' height='10'> 
    <p class='answer'>". $row2['answertext']."</p></div>"; } 

我無法弄清楚什麼是錯的。這是我得到的消息:

Warning: mysqli_query(): (21000/1242): Subquery returns more than 1 row in D:\home\site\wwwroot\devlopment\respondent2.php on line 122 Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in D:\home\site\wwwroot\devlopment\respondent2.php on line 125 

這是行122:

$answertext = mysqli_query($mysqli, "SELECT answer FROM answer_det WHERE pid=(SELECT pid FROM result WHERE rid=$val) AND qid=(SELECT qid FROM result WHERE rid=$val) AND aid=(SELECT aid FROM result WHERE rid=$val)"); 

這是行125:

while($row = mysqli_fetch_array($result) AND $row2 = mysqli_fetch_array($answertext)) 
+3

** WARNING **:當使用'mysqli',你應該使用參數化查詢和['bind_param'](http://php.net/manual/en/mysqli-stmt.bind-param.php)將用戶數據添加到您的查詢。 **不要**使用字符串插值或連接來完成此操作,因爲您將創建嚴重的[SQL注入漏洞](http://bobby-tables.com/)。 **絕不**將'$ _POST'數據直接放入查詢中。 – tadman

回答

2

當你使用像

WHERE your_column = (SELECT ... WHERE ...) 

子選擇必須只返回一行的查詢;如果沒有,那麼你會看到你所看到的錯誤。

一個快速的解決辦法是將其更改爲

WHERE your_column = (SELECT ... WHERE ... LIMIT 1) 

,但我會用,而不是加入:

SELECT answer 
FROM answer_det 
JOIN result USING (pid, qid, aid) 
WHERE result.rid = $val 
+0

好吧,我會先嚐試「限制1」解決方案,但首先要解決一個問題。我是否必須將「限制1」放在所有三個子查詢的末尾? – Max

+0

是的,每一個必須返回最多一行。 –

+1

非常感謝。只要你知道你自己的好,你的JOIN解決方案的工作。第一個解決方案確實消除了所有錯誤,但是我只能看到第一個問題和答案! – Max

0

取出子查詢,並做了左連接上表結果 或做到這一點(你只會出現第一行):

$answertext = mysqli_query($mysqli, "SELECT answer FROM answer_det WHERE pid=(SELECT top 1 pid FROM result WHERE rid=$val) AND qid=(SELECT top 1 qid FROM result WHERE rid=$val) AND aid=(SELECT top 1 aid FROM result WHERE rid=$val)"); 

您的子查詢不能返回多個值來進行比較或其他任何值。

+1

請儘可能使用像「你」這樣的完整單詞,而不是像「ur」這樣的網絡速記。 – tadman

+0

@tadman好的,謝謝你的反饋。 – Lucas