未返回错误表单提交的错误


Not returning error for false form submission

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

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);
}

您写道,您在理解发生的事情时遇到了问题。因此,让我们深入检查其中一个if子句:

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

这可以更简单地写成:

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

这是因为NULL的值是empty(),而!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']替换为$_POST['answer1'][2],其他答案也是如此。这是answer1的if子句示例:

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

只要总是测试正确的变量,它就会像预期的那样工作。

相关:如何创建具有客户端特征的服务器端表单提交脚本?

不太确定变量在PHP中的作用域,但我猜你应该在做第一个IF之前定义$errors。此外,我认为没有必要进行这么多检查,IF(空($_POST[…]))就足够了。

伙计,你只需要这样做。您有多余的代码。请干燥(不要重复)

<?
    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);
    }
?>
if(!@$_POST['answer1']) $errors = "yes";