即使使用isset(),empty(),未选中复选框的未定义索引

我有一个带有隐私同意复选框的联系表,用户必须检查它。如果他们不这样做,则应出现必需的错误消息,就像其他字段一样。


问题是如果Undefined index: privacy复选框未选中,我会收到通知。如果我提交表单并检查它,那么它就可以工作。


我知道如果未选中该复选框,PHP 基本上不知道它存在,因此它不会将数据发送到 $_POST。


我读过的所有论坛帖子都提到了使用isset()或empty()解决这个问题,但我已经在使用它并以不同的方式使用它来尝试。


这可能是显而易见的,但在过去的几个小时里我无法弄清楚。


这是验证类的一部分:


class ValidateContactForm

{

    private $data;

    private $file;

    private static $fields = [

        'name',

        'email',

        'subject',

        'message',

        'privacy'

    ];

    private static $fileInput = 'file';

    private $errors = [];


    public function __construct($postData, $fileData)

    {

        $this->data = $postData;

        $this->file = $fileData;

    }


    public function validateForm()

    {

        // foreach (self::$fields as $field) {

        //     if (!array_key_exists($field, $this->data)) {

        //         trigger_error('An input key does not have a match in the array', E_USER_NOTICE);

        //         return;

        //     }

        // }


        if (!array_key_exists(self::$fileInput, $this->file)) {

            trigger_error('The file input key does not match', E_USER_NOTICE);

        }


        $this->validateName();

        $this->validateEmail();

        $this->validateSubject();

        $this->validateMessage();

        $this->validatePrivacy();

        $this->validateFile();


        return $this->errors;

    }


    private function validatePrivacy()

    {

        $val = $this->data['privacy'];


        if (empty($val)) {

            $this->addError('privacy', 'The privacy checkbox is required.');

        }

    }

该validatePrivacy()方法检查是否$_POST['privacy']为空。

我也试过isset($_POST['privacy'])和$_POST['privacy'] != ''。

如果我使用vard_dump它,它会返回null,但我认为这是预期的行为,因为除非选中复选框,否则它不存在。


我知道我可以使用 HTMLrequired属性(我也会使用它)或 JavaScript,但我想更多地依赖服务器验证。我也想学习这些东西,而不是屈服于变通方法。


当年话下
浏览 86回答 3
3回答

呼唤远方

你有一些选择。假设如果缺少该人没有选中该框。确保你总是得到一些东西,无论是假的还是真的,或者你可以控制的一些已知值。对于解决方案 #1:检查 $_POST 使用array_key_exists.&nbsp;如果它返回 false,那么“privacy”的值为 false。对于解决方案 #2:这是复选框的常见问题。解决方案是添加一个与复选框同名的隐藏输入,并将其设置为 false 或 0。在 HTML 中,确保隐藏输入位于实际复选框之前。当该人输入表单但未选中该框时,将发送隐藏输入的值。如果他们确实选中了该框,则复选框值将覆盖隐藏的输入值。这样你总能得到一些东西。...<input type="hidden" name="privacy" value="0" /><input type="checkbox" name="privacy" />...

侃侃尔雅

甚至在您检查它是否已设置之前validatePrivacy()就打电话$this->data['privacy']给您,这就是给您带来Undefined index: privacy错误的原因。您可以尝试将validatePrivacy()功能更改为:private function validatePrivacy()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; if (empty($this->data['privacy']) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $this->addError('privacy', 'The privacy checkbox is required.');&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }

心有法竹

目前尚不清楚您希望保持什么价值$privacy,最后应该是一个布尔值吗?如果是这样,试试这个:<?php// Will set to a bool (true if checked, false otherwise)$privacy = (!empty($_POST['privacy']));// Will set to a string ('Yes' if checked, 'No' otherwise)$privacy = (!empty($_POST['privacy']) ? 'Yes' : 'No');
打开App,查看更多内容
随时随地看视频慕课网APP