我现在正在实现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':我不知道想这样做......(但如果这是唯一的方法......)
谢谢。
答案 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,并使用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 );
}