jquery — PHP выходит из условия if и продолжает следующую часть

Сейчас я использую 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

был установлен на «опасность»: Я не хочу так делать … (Но если это единственный способ …)

Спасибо.

1

Решение

Я не совсем уверен, что понимаю вопрос, но считаю, что проблему, с которой вы столкнулись, можно решить, добавив некоторую область. Я реорганизовал ваш код в надежде, что он укажет вам правильное направление.

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

Другие решения

Я думаю, что вы хотите, если вы действительно хотите выйти из цикла 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, которых нет ни в одном из других массивов.

Используя массив требуемых ключей в качестве 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 );
}
1

По вопросам рекламы [email protected]