2011-06-21 46 views
4

我想弄清楚如何解决这个问题,因为表单的后期参数是:answer1 [2]和answer2 [4]。括号内的数字代表它所属问题的编号。我需要知道如何做到这一点的原因是,当它的空表单提交时,它不会为答案返回错误。错误的表单提交没有返回错误

if((empty($_POST['answer1'])) || (trim($_POST['answer1'])=="") || ($_POST['answer1'] == NULL) || (!isset($_POST['answer1']))){$errors = "yes";} 
if((empty($_POST['answer2'])) || (trim($_POST['answer2'])=="") || ($_POST['answer2'] == NULL) || (!isset($_POST['answer2']))){$errors = "yes";} 

// Error checking, make sure all form fields have input 
if ($errors == "yes") { 

    // Not all fields were entered error 
    $message = "You must enter values to all of the form fields!"; 

    $output = array('errorsExist' => true, 'message' => $message); 

} 
+0

使用标志像'yes'和'no'脱身,使用'真/ FALSE'因为它的目的,那么你会降低你的'如果()'FN这个:'if($ errors)'(这意味着如果$ errors是TRUE,不需要做比较或==检查)。 – Jakub

回答

4

你写道,你有问题要了解发生了什么事。因此,让我们检查,如果子句中的一个深度:

if((empty($_POST['answer1'])) || (trim($_POST['answer1'])=="") || ($_POST['answer1'] == NULL) || (!isset($_POST['answer1']))) { ... 

这可能是更简单写成:

if (empty($_POST['answer1']) || trim($_POST['answer1'])=="") { ... 

这是因为NULLempty()!isset(...)值空为好。你已经在第一个检查过了,所以不需要再检查一次。

然后没有必要在所有内容都加上括号。只有在实际需要时添加它们,才能使代码更易于阅读。

让我们修改基于这样的代码:

if (empty($_POST['answer1']) || trim($_POST['answer1'])=="") {$errors = "yes";} 
if (empty($_POST['answer2']) || trim($_POST['answer2'])=="") {$errors = "yes";} 

// Error checking, make sure all form fields have input 
if ($errors == "yes") { 

接下来的部分是$errors变量。没有必要说是和否,而你的意思是truefalse。接下来,变量应该初始化为一切正常的情况。让我们更多地更改代码:

$errors = false; 
if (empty($_POST['answer1']) || trim($_POST['answer1'])=="") {$errors = true;} 
if (empty($_POST['answer2']) || trim($_POST['answer2'])=="") {$errors = true;} 

// Error checking, make sure all form fields have input 
if ($errors) {  
    // Not all fields were entered error 
    $message = "You must enter values to all of the form fields!"; 

    $output = array('errorsExist' => true, 'message' => $message); 

} 

所以现在代码看起来好一点,可以找到您的实际错误。为了找出错误,你需要检查哪些值实际上是提交表单:

echo '<pre>', htmlspecialchars(print_r($_POST, true)), '</pre>'; die(); 

请求页面再次,你会看到您所提交的数据,所以你可以检查你是否错误,请检查正确的领域。

另一种方法是期望所有提交都有错误。所以默认值是true。那么只有在所有字段都有效的情况下,$errors设置为false

因此,在你的情况下,如果你没有做正确的错误检查,你的回应将永远不会返回任何错误,即使是在实践中的形式。这就是为什么你应该控制你的错误检查是否真正起作用。


根据意见的反馈,很明显,你需要引用answer1answer2后场里面的物品。你只是检查了错误的领域。

所以只要用$_POST['answer1'][2]代替$_POST['answer1'],其他答案也一样。这是例如,如果子句answer1

if (empty($_POST['answer1'][2]) || trim($_POST['answer1'][2])=="") { ... 
          ^^^       ^^^ 

就始终测试正确的变量,它应该像预期。

相关:How do I create a server-side form submission script that has client-side characteristics?

+0

这就是我得到的。

Array ( [answer1] => Array ( [2] => ) [answer2] => Array ( [4] => ) [userID] => 10001 [submit] => Enter ) 

+1

@Jeff:好的,你检查错误的变量。我已经为答案添加了更多信息。 – hakre

+0

但唯一不同的是括号内的数字并不知道。 questionID将与每个用户的答案不同。 –

3

不太确定变量在PHP中的作用范围,但我的猜测是你应该在做第一个IF之前定义$ errors。另外,我不认为这么多的检查是必要的,if(空($ _ POST [...]))就足够了。

0
if([email protected]$_POST['answer1']) $errors = "yes"; 
+1

为什么-1?试试看,给我这个问题。 – user809145

+0

Yuck。避免使用'@'错误抑制运算符。这是一种便宜的捷径,你可能会错过意想不到的,甚至是重要的错误。 (-1不是来自我,顺便说一句) – Wiseguy

+1

为什么你会建议对'empty()'进行错误抑制?在PHP中使用错误抑制是一个好主意,而且这不是其中之一。 –

2

家伙,你只需要这样做。你有多余的代码。请干(不要重复自己)

<? 
    if (empty($_POST['answer1']) || empty($_POST['answer2'])) 
     $errors = "yes" 

    if ($errors == "yes") 
    {   
     $message = "You must enter values to all of the form fields!"; 
     $output = array('errorsExist' => true, 'message' => $message); 

    } 
?> 
+0

虽然这只适用于第一个答案。你留下了答案2。 –

+1

@Jeff:这留给你练习。 – hakre

+1

@杰夫:对不起。我做了修改。但我认为,你需要用PHP来玩更多。只是试验人。实验然后在堆栈溢出过程中进行这个过程要少得多。这可能会花费你相当多的时间,而且效率不高。 – FinalForm