PHP 脱离 'if' 状态继续下一部分

PHP getting out of 'if' condition and continue the next part

我现在正在实现 Ajax,服务器端编程语言是 PHP。 我需要为我的网络应用程序创建一个 Ajax 表单验证和输入系统。

$redirectPage = $redirectTime = '';

if($a == 'register') {
    $data = array('name', 'username', 'password', 'gender', 'emailaddress');
    $required = array('name', 'username', 'password');

    foreach($data as $field) {
        if(in_array($field, $required) && (!isset($_POST[$field]) || $_POST[$field] == '')) {
            $type = 'danger';
            $message = 'Please enter all required fields.';
            // *1
        } else {
            $$field = $_POST[$field];
        }
    }

    // Continue with register process
    // Set the redirectPage and redirectTime for JavaScript setTimeout here
} else {
    $type = 'warning';
    $message = 'You usually won\'t be able to see this. But if you did, that means you are trying to hack my website!';
    return;
}

$retval = json_encode(
    array(
        'Type' => $type,
        'Message' => alert($type, $message), // my own function, not important here
        'RedirectPage' => $redirectPage,
        'RedirectTime' => $redirectTime,
    )
);

echo $retval; // The value here will send back to my Ajax

如您所见,即使 post 字段不在所需的数组中,我也没有停止句柄进程。最后它会继续剩下的过程。

对于*1: 这是我尝试在这里放一些保留字的地方。

continue: 对于有经验的程序员,你应该注意到它只会跳出这个if条件,继续下一个foreach循环。

exit: 其余代码将不会处理,在超时之前对 return 我的 Ajax 毫无意义。

break:我以为它会出来

if($a == 'register')
但是没有发生。

goto:我不想被恐龙吃掉,除非这是唯一的办法。

对于代码的其余部分添加一个 if 条件检查

$type
是否已设置为 'danger': 我不想这样做...(但如果这是唯一的方法...)

谢谢。

我认为如果你真的想跳出 if 是一个 do while 循环

http://php.net/manual/en/control-structures.do.while.php

来自文档页面上的第一个示例

<?php
do {
    if ($i < 5) {
        echo "i is not big enough";
        break;
    }
    $i *= $factor;
    if ($i < $minimum_limit) {
        break;
    }
   echo "i is ok";

    /* process i */

} while (0);
?>

不过我没看到它用得太多,因为通常有更好的方法来构建代码。

Goto也可以用,不过我用的更少 http://php.net/manual/en/control-structures.goto.php

如果您只是想检查 $_POST 中是否存在所有字段 isset,您可以执行 array_diff

 $required = array('name', 'username', 'password');
 $missing = array_diff( $required, array_keys($_POST) );

如果你需要检查是否为空,你可以在 $_POST 上使用 array_filter 但它也会将 0 计为空,但你可以创建一个简单的函数来解决这个问题, 然后做 array_diff,

http://php.net/manual/en/function.array-diff.php

  • Returns 一个数组,其中包含 array1 中不存在于任何其他数组中的所有条目。

通过将所需键的数组用作 array1,并将 array_keys( $_POST ) 用作 array2,如果 return 包含它们存在的任何项目,我们可以获得键的差异所需的数组 ( array1 ) 但不是 $_POST.

通过使用 array_filter($_POST) 我们可以从 post 数组中删除空项,然后执行差异将指示这些项没有值,但是 array_filter 将删除 false, '', 0 数组中的有价值的项目。你可以做一个简单的函数

array_filter( $_POST, function($item){ return $item !== ''; }); 

仅过滤空字符串。

所以把所有这些都收集起来你会得到这样的东西

$required = array('name', 'username', 'password');
$missing = array_diff(
    $required,
    array_filter(
        $_POST,
        function($item){
            return $item !== '';
        }
    )
); 

if( count( $missing ) > 0 ){
    echo 'missing fields: '. implode(', ', $missing );
}

我不完全确定我理解这个问题,但我相信您遇到的问题可以通过添加一些范围来解决。我重构了您的代码,希望它能为您指明正确的方向。

function sendResponse ($type, $message, $redirectPage, $redirectTime) {

    $retval = json_encode(
        array(
            'Type' => $type,
            'Message' => alert($type, $message), // my own function, not important here
            'RedirectPage' => $redirectPage,
            'RedirectTime' => $redirectTime,
        )
    );

    echo $retval; // The value here will send back to my Ajax
}

function sendRequiredResponse ($redirectPage, $redirectTime) {

    $type = 'danger';
    $message = 'Please enter all required fields.';

    sendResponse($type, $message, $redirectPage, $redirectTime);
}

function sendHackResponse ($redirectPage, $redirectTime) {

    $type = 'warning';
    $message = 'You usually won\'t be able to see this. But if you did, that means you are trying to hack my website!';

    sendResponse($type, $message, $redirectPage, $redirectTime);
}

function sendRegisteredResponse ($redirectPage, $redirectTime) {

    $type = 'success';
    $message = 'Registration successfull';

    sendResponse($type, $message, $redirectPage, $redirectTime);
}

function register($redirectPage, $redirectTime) {

    $data = array('name', 'username', 'password', 'gender', 'emailaddress');
    $required = array('name', 'username', 'password');

    foreach($data as $field) {

        if(in_array($field, $required) && (!isset($_POST[$field]) || $_POST[$field] == '')) {

            /**** registration stops *****/
            return sendRequiredResponse($redirectPage, $redirectTime);
        }

        $$field = $_POST[$field];
    }

    // Continue with register process
    // Set the redirectPage and redirectTime for JavaScript setTimeout here

    sendRegisteredResponse($redirectPage, $redirectTime);
}

$redirectPage = $redirectTime = '';

if($a === 'register') {
    register($redirectPage, $redirectTime);
} else {
    sendHackResponse($redirectPage, $redirectTime);
}