带有“奇怪”字符的PHP POST

时间:2016-11-06 16:18:29

标签: php

所以,我创建了一个小的在线测试门户网站。基本上,用户单击他们认为是此测试的正确答案旁边的单选按钮。然后代码与他们点击的答案进行字符串比较,与实际答案应该是什么进行比较。如果字符串不同,则标记错误。

我有几个问题,我在问题中有“奇怪”的字符。就像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>';
	
}

1 个答案:

答案 0 :(得分:0)

您引用的具体问题是对字符的HTML字符编码。

例如,你应该用人类可读的字符代替&ldquo;进行比较。为此,您可以html_entity_decode()字符串,因此:

$var = "Always-unless... actually, there is no &ldquo;unless&rdquo;";
$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和其他安全困境(这只是形式安全性更广泛主题的一个侧点)。