2014-02-24 56 views
0

嵌套CASE語句我有測驗例如嵌套的SQL查詢來更新多個表。它包含兩個case語句,該語句在對數據庫執行查詢時檢查特定條件。下面是代碼:UDATE查詢與PHP和MySQL

// form data 
$edit_qid = isset($_POST['editqid']); 
$edit_question = isset($_POST['editquestion']); 
$edit_ans1 = isset($_POST['editanswer1']); 
$edit_ans2 = isset($_POST['editanswer2']); 
$edit_ans3 = isset($_POST['editanswer3']); 
$edit_correct = isset($_POST['editcorrect']); 

// answer ids (comes from another query and it's valid) 
while ($rows = mysqli_fetch_assoc($result_aid)) { 
    $aid[] = $rows['aid']; 
} 

// update of chosen question and answer options to DB 
$upd_question = "UPDATE `question_bank` qtbl INNER JOIN `answer_bank` atbl 
         SET qtbl.`question`='".$edit_question."', 
          atbl.`answer`= CASE WHEN atbl.`aid`='".$aid[0]."' THEN '".$edit_ans1."' 
               WHEN atbl.`aid`='".$aid[1]."' THEN '".$edit_ans2."' 
               WHEN atbl.`aid`='".$aid[2]."' THEN '".$edit_ans3."' 
              END 
          atbl.`correct` = CASE WHEN ".$edit_correct."=='1' THEN '1' 
                WHEN ".$edit_correct."=='2' THEN '1' 
                WHEN ".$edit_correct."=='3' THEN '1' 
                ELSE '0' 
              END 
        WHERE qtbl.`qid`=atbl.`question_id` AND qtbl.`qid`='".$edit_qid."'"; 
mysqli_query($mysqli, $upd_question) or die ("<b>Update of question failed:</b> " . mysqli_error($mysqli)); 

可變$edit_correct包含任一值1,2或3相對於回答字符串和根據上述查詢到DB那裏將被保存的1或0(真/假),這意味着該如果值是1,那麼真正的將被保存爲第1個答案選項等這段代碼的

跑步給了我以下錯誤:

Update of question failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'atbl.`correct` = CASE WHEN 2=='1' THEN '1' WHEN 2=='2' THEN '1' ' at line 7 

任何想法來解決這個問題?提前致謝。

UPDATE

而且,我有以下條件檢查:

,atbl.`correct` = CASE WHEN '". if($edit_correct=='1') {echo 1;} ."' THEN '1' 
         WHEN '". if($edit_correct=='2') {echo 1;} ."' THEN '1' 
         WHEN '". if($edit_correct=='3') {echo 1;} ."' THEN '1' 
         ELSE '0' 
       END 

,並得到這個錯誤:Parse error: syntax error, unexpected 'if' (T_IF)

+0

@RyanVincent但我要檢查'$ edit_correct'無論是1或2或3的值,然後保存在'DB的correct'領域適當真/假值。因此我在case語句中使用了'==',但是我不確定它是否正確。 – Dozent

回答

1

你必須把逗號介乎兩列,試試這個代碼:

$upd_question = "UPDATE `question_bank` qtbl INNER JOIN `answer_bank` atbl 
         SET qtbl.`question`='".$edit_question."', 
          atbl.`answer`= CASE WHEN atbl.`aid`='".$aid[0]."' THEN '".$edit_ans1."' 
               WHEN atbl.`aid`='".$aid[1]."' THEN '".$edit_ans2."' 
               WHEN atbl.`aid`='".$aid[2]."' THEN '".$edit_ans3."' 
              END 
          ,atbl.`correct` = CASE WHEN ".$edit_correct."=='1' THEN '1' 
                WHEN ".$edit_correct."=='2' THEN '1' 
                WHEN ".$edit_correct."=='3' THEN '1' 
                ELSE '0' 
              END 
        WHERE qtbl.`qid`=atbl.`question_id` AND qtbl.`qid`='".$edit_qid."'"; 
mysqli_query($mysqli, $upd_question) or die ("<b>Update of question failed:</b> " . mysqli_error($mysqli)); 

在第二種情況下你可以使用IF()語句,使用IF會得到更多可讀的代碼。

+0

我認爲在這裏添加逗號對條件部分沒有意義,即'==',但是您使用IF()語句的建議使我想到另一種方法(請查看UPDATE部分的問題),但即使是那個打印錯誤,即解析錯誤。有任何想法嗎? – Dozent

+1

您在更新中發佈了它的逗號的第一個錯誤,當您更新多個列時,它們將用逗號分隔,您在'atbl.answer'和'atbl.correct'之間留下了一個。 關於如果在第二種情況下使用,請嘗試以下操作: ,atbl.'correct' = IF(「。$ edit_correct。」in('1','2','3'),'1',' 0') – iubema

+0

但現在它爲所有三個答案選項保存1(真),這是不正確的。我嘗試將IF()句子分成3個句子,即'('1'),'1','0'''中的IF(「。$ edit_correct。」)等,它再次打印語法錯誤消息。如何解決這個問題? – Dozent