为什么我的代码返回多个回显字符串

时间:2019-07-17 15:36:22

标签: php oop

每当我提交表单时,它都会以“ Good”返回“ GoodGoodGood”三倍,而我试图找出原因。我所知道的唯一的事情是,它必须对数组做一些事情。

check.php检查所有3个输入是否都不为空,如果一切正常,则回显为“ Good”。

class Check {
    public function mty() {
        global $required;
        global $field;

        foreach($required as $field) {
            if (empty($_POST[$field])) {
                //Code...
            } else {
                echo "Good";
            }
        }
    }
}

submit.php

$check = new Check;

//Gets names of inputs
$required = array('name', 'price', 'id');

if(isset($_POST['submit'])) {
    $check->mty();
}

我是OOP的新手,只想找到解决问题的方法。我有什么需要改进的代码吗?

2 个答案:

答案 0 :(得分:2)

问题是您在循环的每次迭代中都回显“好”。

您可以创建一个保存状态的变量,然后检查并在循环后回显:

// The variable that keeps the state
$success = true;

foreach($required as $field) {
    if (empty($_POST[$field])) {
        // Set the state as false
        $success = false;
    }
}

// If state is true, no value was empty and we echo 'Good'... once.
if ($success) {
    echo 'Good';
}

正如其他人所提到的那样,应尽可能避免使用global(如果您的结构是健全的,则总是这样)。

还有一个问题,就是您同时在global $field;循环中使用$field的同时使用foreach。如果您打算使用$field,并且已经通过global $field;导入了该方法,则应在foreach中使用另一个名称。如果您不打算使用它,请删除global $field;

答案 1 :(得分:0)

我更喜欢使用array_filter()来获取非空值,并将其计数与原始$_POST计数进行比较

<?php
    # pretend like this was what was posted
    $posted = [
        'foo' => 'bar',
        'bar' => 'foo',
        'treybake' => 'is awesome?'
    ];

    # your GLOBALS
    $required = ['foo', 'treybake'];

    # compare the count of the array without any empty elements 
    # vs original post count
    if (count(array_filter($posted, function($el){return (!empty($el));})) === count($posted)) {
        echo 'good';
    } else {
        echo 'something bad';
    }