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);
}
我现在正在实现 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 条件检查
是否已设置为 'danger': 我不想这样做...(但如果这是唯一的方法...)$type
谢谢。
我认为如果你真的想跳出 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);
}