当两个<option>具有相同的值时,无法提交我的表单

时间:2018-11-15 16:47:22

标签: php html

编辑:我错误地分析了问题,所有等于0的值都有问题。是的,问题似乎出在功能上,您知道如何改进该功能吗?

我的网站有问题。

要进行上下文化,我创建了一个网页,允许管理员将新成员添加到数据库。我们可以自定义字段(姓名,名字,年龄等)。

但是我的选择选项字段有问题。

    <form id="contact-form" method="post" autocomplete="off">

        <!-- other input type text fields -->

        <label for="ban">Banissement</label>
        <select name="ban">
            <option value="0" selected>Non</option>
            <option value="1">Oui</option>
        </select>

        <label for="role">Rôle</label>
        <select name="role">
            <option value="0" selected>Aucun (membre classique)</option>
            <option value="1">Modérateur</option>
            <option value="2">Administrateur</option>
        </select>

        <input type="submit" name="register_new_user" value="Créer ce membre" />
    </form>

通过验证表单,我检查“ ban”和“ role”字段是否已填写。但是,如果这两个值相同(如果 $ _ POST ['ban'] == 1 ,并且如果 $ _ POST ['role'] == 1 ),则我的页面就像没有填写这两个字段一样。

但是,如果两个字段不同( $ _ POST ['ban'] == 0 $ _ POST ['role'] == 1 ),则存在没问题,两个字段填满,代码仍在运行...

在这里您可以看到PHP代码:

if(isset($_POST['register_new_user'])) {
    if(not_empty(['firstname','lastname','pseudo','email','password','password_confirm','code','city','score','banque','sortPref','notimeout','ban','role'])) {

        // Sending to the database

    }
}

...具有函数 not_empty()的功能,我用来检查字段是否已填充。

if(!function_exists('not_empty')){
    function not_empty($fields = []){
        if(count($fields) != 0){
            foreach($fields as $field){
                if(empty($_POST[$field]) || trim($_POST[$field]) == ""){
                    return false;
                }
            }
            return true;
        }
    }
}

我是否必须对整个表格使用不同的值?

2 个答案:

答案 0 :(得分:3)

empty的主要优点在于,它可以在检查变量/键的值是否等于false(包括“ 0”;请参见{{ 3}}),而不会引起未定义的通知。通过此处的操作,您应该可以只使用isset。这将检查该变量是否已设置,如果没有设置该变量,则将防止下一部分引发通知,并且下一部分将确保该变量具有值(包括零)。

if (!isset($_POST[$field]) || trim($_POST[$field]) == "") {

答案 1 :(得分:1)

function not_empty($fields = []) {

    foreach($fields AS $key) {

        // Check is set
        if(!isset($_REQUEST[$key]))
            return false;

        $input = $_REQUEST[$key];

        // Check not null value
        if(is_null($input))
            return false;

        // If is array of list items check at least one is selected
        if(is_array($input) && count($input) === 0)
            return false;

        // Must be string or number, trim white sapce
        $input = trim($input);

        // If is valid number continue iteration
        if(is_numeric($input))
            continue;

        // Must be a string, check length is more than zero
        if(strlen($input) === 0)
            return false;

    }

    return true;

}

为什么empty()isset()会自己与您对抗

函数为空会在以下情况下返回 true

  • 未声明变量,数组键,对象键。
  • 为空
  • 为空/零长度字符串(''
  • false
  • 0 (零)

在您的用例中,选择值为整数零的选择选项将被错误地评估为空true。

如果完全声明了变量,数组键,对象键,则

已设置的函数 isset 将返回 true ,即使其值在函数empty()中返回true时也是如此。

  • 如果
  • 为真
  • 如果为空/零长度字符串(''),则为true
  • 如果 false
  • true
  • 如果 0 (零)
  • ,则为true

因此,这使得检查值是否为不希望的空白值非常棘手。 您可以通过考虑这些事实来抑制这些复杂性,并选择更明智的值来使用不太复杂的代码。

还请注意,我没有费心检查 $ fields 的数组中是否有任何项目,只要循环为空,就不会运行for每个循环,也不会抛出错误通过。

您在代码中放入的条件更少的 if 声明表现得越好,请始终尝试一下。

始终最好将值作为预期类型传递,即使它是空数组,而不是将值设置为NULL。

  

NULL检查对您的代码不利,并且NULL设置并非总是如此