Сейчас я использую 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:
Это место, где я пытался поместить некоторые зарезервированные слова здесь.
Продолжить: Для опытного программиста вы должны заметить, что он только выйдет из этого условия и продолжит следующий цикл foreach.
выход: Остальная часть кода не будет обрабатываться, во что бы то ни стало ничего не возвращать в мой Ajax до истечения времени ожидания.
перерыв: Я думал, что это выйдет из
if($a == 'register')
но этого не произошло.
идти к: Я не хочу, чтобы меня ели динозавры, кроме единственного способа сделать это.
Для остальной части кода добавьте условие if, проверьте,
$type
был установлен на «опасность»: Я не хочу так делать … (Но если это единственный способ …)
Спасибо.
Я не совсем уверен, что понимаю вопрос, но считаю, что проблему, с которой вы столкнулись, можно решить, добавив некоторую область. Я реорганизовал ваш код в надежде, что он укажет вам правильное направление.
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);
}
Я думаю, что вы хотите, если вы действительно хотите выйти из цикла if 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);
?>
Однако я не вижу, чтобы это использовалось так часто, как обычно есть лучший способ структурировать код.
Гото тоже можно использовать, но я вижу это еще реже
http://php.net/manual/en/control-structures.goto.php
Если вы просто хотите проверить наличие всех полей isset
в $ _POST вы можете сделать 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 );
}