亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

即使使用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 關注
  • 108 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號