iT邦幫忙

0

選擇題 PHP

想請問一下,我想寫一個有關選擇題的程式碼,但是選擇題的選項卻不一定只有四個甚至有可能到五個六個這樣,如果先在資料庫中先新增(如下)
https://ithelp.ithome.com.tw/upload/images/20180115/20108339Gj1oN1GbSw.png
他就會跑出這樣的畫面(如下)
https://ithelp.ithome.com.tw/upload/images/20180115/20108339Csd1cKBjAu.png

請問這要怎麼改比較好呢?求大大能開個頭,讓我研究OAO謝謝!

程式碼(如下)


<?php 
	// 建立MySQL的資料庫連接  
	$link = mysqli_connect("localhost","root", 
	                       "1234","learning") 
	        or die("無法開啟MySQL資料庫連接!<br/>"); 
	//echo "資料庫clasesgg開啟成功!<br/>"; 
	$sql = "SELECT topic.topic_id , topic.number , topic.topic ,topic.ans, choose.optionA, choose.optionB,choose.optionC,choose.optionD,choose.optionE from topic,choose WHERE topic.topic_id=choose.topic_id"; // 
	mysqli_query($link, 'SET NAMES utf8');

	if ( $result = mysqli_query($link, $sql) ) {  
	   echo "<b>學生資料:  </b><br/>";  // 顯示查詢結果 
	   while( $row = mysqli_fetch_assoc($result) ){  

	      echo "題號 ". $row["topic_id"].""."<h4>問題 ".$row["topic"]."</h4><br/>"; 
	  

	      echo "<p>". "<input type='radio' name='radio[]'/>"."  A)".$row["optionA"]."</p>"."<BR>"; 

	      echo "<p>". "<input type='radio' name='radio[]'/>"."  B)".$row["optionB"]."</p>"."<BR>"; 

	      echo "<p>". "<input type='radio' name='radio[]'/>"."  C)".$row["optionC"]."</p>"."<BR>"; 

	      echo "<p>". "<input type='radio' name='radio[]'/>"."  D)".$row["optionD"]."</p>"."<BR>"; 
	      

	      echo "<p>". "<input type='radio' name='radio[]'/>"."  E)".$row["optionE"]."</p>"."<BR>"; 
	      }


   
	   mysqli_free_result($result); // 釋放佔用記憶體 
	}  
	mysqli_close($link);  // 關閉資料庫連接 
	?> 
	</tbody>
	</tbody>
</table>
	</div> 
看更多先前的討論...收起先前的討論...
Luis-Chen iT邦新手 5 級 ‧ 2018-01-15 14:29:34 檢舉
while 裡面在加判斷式 只要 欄位是空的 就不要echo
資料表定義要把選項拆分成另外一各表
這樣才能彈性增加選項
如果要更彈性可以定義如下,把標準答案列一張表,虛假答案設另一張表
把答案題目類型分好,之後產生題目跟答案時,可以列出正確答案與亂數選取虛假答案個數,然後亂數排列選項
這樣也能做到樓主要的功能
虛假答案除了用題目類型分,也可以用題目關聯字搜尋,這樣答案就會更似是而非了
同樓上,把選項拉出去做一張表吧!在一個資料表內放好幾個意義一樣的欄位不是好的做法
先調整好資料表,程式面在抓出問題的每一個選項再用 foreach 輸出 HTML 就可以了

2 個回答

0
r567tw
iT邦新手 5 級 ‧ 2018-01-15 16:56:52

如果是我我會這樣寫,不見得正確,僅供參考,如果有大大歡迎來指教

<?php 
	// 建立MySQL的資料庫連接  
	$link = mysqli_connect("localhost","root", 
	                       "1234","learning") 
	        or die("無法開啟MySQL資料庫連接!<br/>"); 
	//echo "資料庫clasesgg開啟成功!<br/>"; 
	$sql = "SELECT topic.topic_id , topic.number , topic.topic ,topic.ans, choose.optionA, choose.optionB,choose.optionC,choose.optionD,choose.optionE from topic,choose WHERE topic.topic_id=choose.topic_id"; // 
	mysqli_query($link, 'SET NAMES utf8');
    
     ##如果可以確定資料庫的選項option是固定的可以這樣寫,先宣告一個選項的array
     $optionArray= array('optionA','optionB','optionC','optionD','optionE');


	if ( $result = mysqli_query($link, $sql) ) {  
	   echo "<b>學生資料:  </b><br/>";  // 顯示查詢結果 
	   while( $row = mysqli_fetch_assoc($result) ){  

	      echo "題號 ". $row["topic_id"].""."<h4>問題 ".$row["topic"]."</h4><br/>"; 
          
          ##利用optionarray foreach 出來get 那些欄位名稱
          foreach($optionArray as $option)
          {
              if (!empty($row[$option]))
              {
              ##如同留言所說判斷是否為空
                  echo "<p>". "<input type='radio' name='radio[]'/>"."  A)".$row[$option]."</p>"."<BR>";
              }
          }

	      }


   
	   mysqli_free_result($result); // 釋放佔用記憶體 
	}  
	mysqli_close($link);  // 關閉資料庫連接 
	?> 
	</tbody>
	</tbody>
</table>
	</div> 

wiseguy iT邦超人 1 級 ‧ 2018-01-15 17:32:48 檢舉


foreach($optionArray as $option)
改為
foreach($optionArray as $i => $option)


echo "<p>". "<input type='radio' name='radio[]'/>"." A)".$row[$option]."</p>"."<BR>";
改為
echo "<p><input type='radio' name='radio[]'/> ",chr(65+$i),")",$row[$option],"</p><BR>";
就完美了。

PS1: 上面多個 $i 是為了取序號,給下面用
PS2: 原本 A), B), C), ... 的地方,用 chr(65+$i)產生
PS3: echo 參數無謂的 . 字串串接,改用 , 逗號即可(效率好)

r567tw iT邦新手 5 級 ‧ 2018-01-15 21:41:04 檢舉

謝謝指教,只是有點好奇用逗號串接與用.有什麼樣的差別?
然後啊忘記了ABC 也是foreach的範圍之一,用chr(65+i)這方法也很聰明!!

1
海綿寶寶
iT邦超人 1 級 ‧ 2018-01-16 10:52:35
<?php

$arr = array($row["optionA"],$row["optionB"],$row["optionC"],$row["optionD"],$row["optionE"]);
echo arrToOptions($arr);

function arrToOptions($arr) {
    $sRet = '';
    $sRet = $sRet . "==== Start of question ===<BR/>";
    $i=65;    //選項為 A,B,C
    //$i=49;    //選項為 1,2,3
    foreach ($arr as $one) {
        if (!empty($one)) {
            $sRet = $sRet . chr($i++) . ") $one<BR/>";
        }
    }
    $sRet = $sRet . "==== End of question ===<BR/>";
    return $sRet;
}

?>

我要發表回答

立即登入回答