2016-11-06 38 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