2016-11-06 10 views
0

私はちょっとしたオンラインテストポータルを作成しました。基本的に、ユーザーは、このテストで正解と思われるものの横にあるラジオボタンをクリックします。コードは、実際の回答の内容と比較して、クリックした回答と文字列を比較します。文字列が異なる場合、文字列は間違っています。"奇妙な"文字のPHP POST

質問に「奇妙な」文字がある場合は、いくつか質問があります。 emのようなもの、または二重引用符のような単純なものでも。ユーザーがこれらの回答の1つをクリックすると、奇妙な文字が正しくスコアページに投稿されないため、文字列比較が機能していないと思われ、正しくないとマークしているようです。

私が間違っていることはありますか?ここで

はldquoでコード "休憩" は

//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++;

...私が使用したコードの抜粋です。ライン。

比較コードはここにある:

//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経由で送信する場合は、URLエンコードする必要があります。 – 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! 
    } 

ビューの何もないの彼らのポイントが変わっていますから、ユーザはまだ、ページ上の同じテキストを読みます。

(int)は、CSRFやその他のセキュリティジレンマを最小限に抑え、防止するために、入力を強制的に行うために使用されます(これは、フォームセキュリティのより広いトピックに関する単なる側面です)。

+0

素晴らしい!レスポンスありがとう!私はそれを注意深く読んで、すべてを理解しなければならないでしょう。それは私にはかなり新しいので、学ぶのは楽しいでしょう。 論理的な観点からは、文字列全体を投稿するのは、ユーザーが選択したものを記録して、正しい回答に対して選択した回答を表示できるからです。例えば。あなたが選んだ答えは、「Never-Crocs ....」です。正解は「Always-unless ...」でした。 – Trevzilla

+0

*文字セット*は、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