2016-11-06 35 views
0

因此,我創建了一個小的在線測試門戶。本質上,用戶點擊他們認爲是此測試正確答案旁邊的單選按鈕。然後代碼將字符串與他們點擊的答案進行比較,並與實際答案進行比較。如果字符串不同,則表示它們錯誤。帶有「奇怪」字符的PHP POST

我有幾個問題,我在問題中有「怪異」的字符。東西像破折號一樣,或者甚至像雙引號一樣簡單。看起來,當用戶點擊其中一個答案時,怪異的字符不會正確地發佈到我的評分頁面,因此字符串比較不起作用,並且標記它們不正確。

有什麼我做錯了嗎?

這裏的代碼,我使用的一個片段:

//Question 4 
 
$question[$i] \t = 'When are steel or composite toe boots required in the field?'; 
 
$answer[$i][1] \t = 'Always-unless... actually, there is no “unless”'; 
 
$answer[$i][2] \t = 'Never-crocs are truly a groundbreaking innovation appropriate in all settings.'; 
 
$correct[$i] \t = $answer[$i][1]; 
 
$explanation[$i] = ''; 
 
$i++;

代碼 「休息」 的ldquo;線。

比較代碼是在這裏:

//Find incorrect answers and print them out with correct answers formatted for the browser. 
 
\t for($i=1; $i<=$totalquest; $i++){ 
 
\t \t if($_POST[$i]!=$correct[$i]){ 
 
\t \t \t $WrongAnswers .= "<b>You answered Question $i incorrectly:</b><br>$question[$i]<br>You answered: $_POST[$i]<br>The correct answer is: $correct[$i]<p>"; 
 
\t \t \t $score=$score-1; 
 
\t \t } 
 
\t } 
 
echo $WrongAnswers;

以及創建測試的代碼是在這裏:

for($i=1; $i<=$totalquest; $i++) 
 
{ 
 
\t echo $i.'. '.$question[$i]."<br>"; 
 
\t $totalans=count($answer[$i]); 
 
\t for($j=1; $j<=$totalans; $j++) 
 
\t { 
 
\t \t echo '<input type="radio" name="'.$i.'" value="'.$answer[$i][$j].'" required>'.$answer[$i][$j].'<br>'; 
 
\t } 
 
\t echo '<p>'; 
 
\t 
 
}

+0

你是什麼意思'休息'?比較發生在哪裏?如果您通過GET發送實體,則需要對其進行網址編碼。 – chris85

+0

我想看看錶格除了比較php –

+0

我編輯了原始文章添加比較代碼以及生成測試的代碼。 – Trevzilla

回答

0

您引用的具體問題是使用字符的HTML字符編碼。

例如你是&ldquo;應該替換爲可比較的人類可讀的字符。要做到這一點,你可以html_entity_decode()字符串,因爲這樣的:通過POST ED變量發送

$var = "Always-unless... actually, there is no &ldquo;unless&rdquo;"; 
$string = html_entity_decode($var, ENT_QUOTES); 

字符串數據(表單數據應該是),是不是默認HTML編碼的,所以你需要解碼的比較字符串 html 編碼提交的值。

也有可能是字符集是次要問題,你需要把它添加到您的窗體:

<head> 
<meta charset="UTF-8"> /* HTML-5 */ 
</head> 
<body> 
<form ... accept-charset='UTF-8'> 
... 

而且還研究PHP mb_string,讓您可以拿出這樣的:

PHP頁(在此情況下接收到所述形狀數據):

mb_internal_encoding('UTF-8'); 
mb_http_output('UTF-8'); 
mb_http_input('UTF-8'); 

    ... 

$string = html_entity_decode($var, ENT_QUOTES, "UTF-8"); 
/*** 
    Or alternatively you encode the $_POSTed value. 
    ***/ 

if($_POST['radiochoice'] == $string){ 
     //... correct. 
} 

作爲一種邏輯的觀點,最好是不需要在頁面之間來回傳遞整個文本值,而只是一個參考,單選按鈕value=""是傳遞到下一頁的值,所以你可以簡單地將該值設置爲一個獨特的屬性,如一個號碼,然後只需檢查:

if((int)$_POST['radiochoice']) == 4){ 
    //open 4 picked, this is correct! 
    } 

用戶仍然閱讀網頁上的文字一樣,從他們的觀點沒什麼Point的改變。

(int)用於強制輸入是一個整數,以最小化和防止CSRF和其他安全困境(這只是一個更廣泛的形式安全主題的一個側面)。

+0

太棒了!感謝您的迴應!我必須仔細閱讀並全面瞭解。這對我來說很新,所以學習會很有趣。 就邏輯角度而言,我發佈整個字符串的原因是因爲我想記錄用戶選擇的內容,以便我可以根據正確的答案顯示他們選擇的答案。例如。 「你選擇的答案是」Never-Crocs ....「,而正確的答案是」Always--除非......「 – Trevzilla

+0

兩件事情要拿走,@Trevzilla *字符集*不同於HTML *特殊字符*。儘可能所有你使用的應該[使用UTF-8](http://stackoverflow.com/questions/279170/utf-8-all-the-way-through),也檢查安全問題與HTML表單和使用[CSRF預防](http://stackoverflow.com/questions/1780687/preventing-csrf-in-php)。祝你好運:) – Martin

+0

@Trevzilla如果他們選擇的答案是從單選按鈕那麼答案已經定義好了,所以回答'value = 1'是'Never Crocs ...',然後回答'value = 2'是'Always Croc'等等。他們選擇的內容不會改變,但你可以簡單的將數字引用傳遞給下一頁,而不是整個文本(只要用戶不輸入自己的答案) – Martin