为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
当年话下 2022-06-17 10:54:01
我有一个带有隐私同意复选框的联系表,用户必须检查它。如果他们不这样做,则应出现必需的错误消息,就像其他字段一样。问题是如果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,但我想更多地依赖服务器验证。我也想学习这些东西,而不是屈服于变通方法。
查看完整描述

3 回答

?
呼唤远方

TA贡献1856条经验 获得超11个赞

你有一些选择。

  1. 假设如果缺少该人没有选中该框。

  2. 确保你总是得到一些东西,无论是假的还是真的,或者你可以控制的一些已知值。

对于解决方案 #1:检查 $_POST 使用array_key_exists. 如果它返回 false,那么“privacy”的值为 false。

对于解决方案 #2:这是复选框的常见问题。解决方案是添加一个与复选框同名的隐藏输入,并将其设置为 false 或 0。在 HTML 中,确保隐藏输入位于实际复选框之前。当该人输入表单但未选中该框时,将发送隐藏输入的值。如果他们确实选中了该框,则复选框值将覆盖隐藏的输入值。这样你总能得到一些东西。

...

<input type="hidden" name="privacy" value="0" />

<input type="checkbox" name="privacy" />

...


查看完整回答
反对 回复 2022-06-17
?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

甚至在您检查它是否已设置之前validatePrivacy()就打电话$this->data['privacy']给您,这就是给您带来Undefined index: privacy错误的原因。


您可以尝试将validatePrivacy()功能更改为:


private function validatePrivacy()

    {

        if (empty($this->data['privacy']) {

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

        }

    }


查看完整回答
反对 回复 2022-06-17
?
心有法竹

TA贡献1866条经验 获得超5个赞

目前尚不清楚您希望保持什么价值$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');


查看完整回答
反对 回复 2022-06-17
  • 3 回答
  • 0 关注
  • 85 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信