所以,我创建了一个小的在线测试门户网站。基本上,用户单击他们认为是此测试的正确答案旁边的单选按钮。然后代码与他们点击的答案进行字符串比较,与实际答案应该是什么进行比较。如果字符串不同,则标记错误。
我有几个问题,我在问题中有“奇怪”的字符。就像em破折号,甚至像双引号一样简单。似乎当用户点击其中一个答案时,奇怪的字符没有正确地发布到我的评分页面,因此字符串比较不起作用,并且标记它们不正确。
我有什么问题吗?
这是我使用的一段代码......
//Question 4
$question[$i] = 'When are steel or composite toe boots required in the field?';
$answer[$i][1] = 'Always-unless... actually, there is no “unless”';
$answer[$i][2] = 'Never-crocs are truly a groundbreaking innovation appropriate in all settings.';
$correct[$i] = $answer[$i][1];
$explanation[$i] = '';
$i++;
代码“打破”ldquo;线。
比较代码在这里:
//Find incorrect answers and print them out with correct answers formatted for the browser.
for($i=1; $i<=$totalquest; $i++){
if($_POST[$i]!=$correct[$i]){
$WrongAnswers .= "<b>You answered Question $i incorrectly:</b><br>$question[$i]<br>You answered: $_POST[$i]<br>The correct answer is: $correct[$i]<p>";
$score=$score-1;
}
}
echo $WrongAnswers;
创建测试的代码在这里:
for($i=1; $i<=$totalquest; $i++)
{
echo $i.'. '.$question[$i]."<br>";
$totalans=count($answer[$i]);
for($j=1; $j<=$totalans; $j++)
{
echo '<input type="radio" name="'.$i.'" value="'.$answer[$i][$j].'" required>'.$answer[$i][$j].'<br>';
}
echo '<p>';
}
答案 0 :(得分:0)
您引用的具体问题是对字符的HTML字符编码。
例如,你应该用人类可读的字符代替“
进行比较。为此,您可以html_entity_decode()
字符串,因此:
$var = "Always-unless... actually, there is no “unless”";
$string = html_entity_decode($var, ENT_QUOTES);
通过POST
ed变量发送的字符串数据(作为表单数据应该是),默认情况下不是html编码的,因此您需要解码比较字符串 OR < / strong> 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和其他安全困境(这只是形式安全性更广泛主题的一个侧点)。