PHP退出'if'条件并继续下一部分

时间:2015-07-24 02:22:40

标签: php jquery ajax goto

我现在正在实现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: 这是我试图在这里提出一些保留字的地方。

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

退出:代码的其余部分将无法处理,无论如何都不会返回到我的Ajax,直到超时为止。

休息:我认为它会离开

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

转到:我不想被恐龙吃掉,除非它是唯一的方法。

对于其余代码添加if条件,检查

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

谢谢。

2 个答案:

答案 0 :(得分:2)

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

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);
}

答案 1 :(得分:1)

我认为如果你真的想要突破if是一个while 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) );

如果您需要检查是否为空,则可以使用array_filter上的$_POST,但它会将0计为空,但您可以创建一个简单的功能来修复它,并且然后做array_diff,

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

  • 返回一个数组,其中包含array1中任何其他数组中不存在的条目。

通过使用所需键的数组作为array1,并使用array_keys($ _POST)作为array2,我们可以获得键的差异,如果返回包含它们存在于所需数组(array1)中的任何项而不是$ _POST。

通过使用array_filter($_POST),我们可以从post数组中删除空项,然后执行diff将指示这些项没有值,但是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 );
}