Подобен вид проверки на _POST метода?

Ticketa

Registered
Какво мислите за подобен вид проверка на дадена форма - правилна е или грешна?

PHP:
<?php
$context = "";
if(isSet($_POST['submit'])) {
	//print_r($_POST); //debug
	foreach ($_POST['data'] AS $key => $value) {
		//echo "$key -> $value <br />";
		if(empty($_POST['data'][$key])) {
			$context['error'][$key] = "Полето <b>$key</b> е празно!";
		} else {
			if(strlen($_POST['data']['username']) < 4) {
				$context['error'][$key] = "Полето <b>$key</b> трябва да бъде по-дълго от 4 символа.";
			} else {
				if(preg_match('/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/', $_POST['data']['email'])) {
					$context['error'][$key] = "Въведете валиден Мейл!";
				} else {
					$context['ok'] = "Всичко е ОК.";
					$context['error'][$key] = "";
				}
			}
		}
	}
}
if(!empty($context['ok'])) {
	echo '<h3>'.$context['ok'].'</h3>';
}
?>
<form method="POST" action="">
	Username: <input type="text" name="data[username]" /> <?php echo $context['error']['username']; ?> <br />
	Password: <input type="text" name="data[password]" /> <?php echo $context['error']['password']; ?> <br />
	E-mail: <input type="text" name="data[email]" /> <?php echo $context['error']['email']; ?> <br />
	<input type="submit" value="ok" name="submit" />
</form>

Е, разбира се това е просто пример, целта е за по-голяма форма да се използва.
 
Няма правилна или грешна.
Има работи и неработи ако ти върши работа и е удобна и работи без проблем значи е правилна :?:
 
Сега в този случай, не виждам смисъл от този цикъл, единствено само излишно товариш приложението. Полза има или поне аз бих го ползвал така, ако в случая в приложението (от интерфейса) има опция да се добавят допълнително полета, тогава наистина ще е в полза.

Другото за което искам да обърна внимание е този безкраен

PHP:
if{}else {if{else{if{else}}}}

Обърка ли се? Ами да, това ти представлява кода ...

Кодът трябва да максимално опростен, смисъл лесен за четене от хората. Той жорко е прав: "щом работи, няма проблеми", да но във действителност има проблем. След време кода ако нарастне доста? Какво става ? Ще почнеш да следиш всеки if къде, как и защо го прави, къде свършва, къде почва else и т.н. изобщо става една мацаница и накрая ще почнеш да го пишеш от начало, нали това в случай, че трябва нещо да се редактира.

Ами как да го избегнем?

Във твоя случай:


Друго също да кажа (сега го забелязах), щом използваш $context само за масив, тогава му сложи да е масив, а не празен стринг (оправил съм го във кода).

И вместо empty(); може да ползваш array_key_exists, при проверката дали за $context['ok'];, също така мисля, че и със isset(); ще се получи.
Незнам защо слагаш това empty(); просто мисля, че не му е там мястото.

Също така отново се замисли дали наистина ти трябва този цикъл във тази ситуация.

Ако има нещо питай. : ))

PHP:
<?php

$context = array();

if (isSet($_POST['submit'])) {

    //print_r($_POST); //debug

    
    foreach ($_POST['data'] AS $key => $value) {

        //echo "$key -> $value <br />";

        if (empty($_POST['data'][$key])) {

            $context['error'][$key] = "Полето <b>$key</b> е празно!";
        }

        if (strlen($_POST['data']['username']) < 4) {

            $context['error'][$key] = "Полето <b>$key</b> трябва да бъде по-дълго от 4 символа.";
        }

        if (preg_match('/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/', $_POST['data']['email'])) {

            $context['error'][$key] = "Въведете валиден Мейл!";
        }


        if (!count($context) > 1) {

            $context['ok'] = "Всичко е ОК.";

            $context['error'][$key] = "";
        }
    }
}


if (array_key_exists('ok', $context)) {

    echo '<h3>' . $context['ok'] . '</h3>';
}
?>


EDIT


Само искам да уточня защо ползвам array_key_exists(); значи в случай, че даден масив не е инициализиран, тогава тази функция ще върне грешка, тогава може да ползваш isset();, но във твоя случай масива го инициализираш в началото на файла и няма да е изкара тази грешка.
 
Дадох примера с foreach, защото мисля да го използвам в една форма. Имам около 10на полета, които се отнасят за потребителя т.е. лични данни и прочие. Вместо да пиша всичките _POST така ги извличам наведнъж. Сещаш ли се?

Иначе - да, колкото по-кратък и четлив е кода, толкова по-добре. Няма спор, а това за else}if{} ми е останало някакъв отвратителен навик.

Все пак. До скоро си вадех грешките с echo, но играе лоша игра при header и това ме дразни. Сега мисля, да ги вкарвам в масив (както в горния пример) и се питам това ли е най-добрия вариант за проверка?

Все пак да се изведе грешката на даденото поле, а ако няма просто да не се извежда. Вече ако има "обща грешка" да се изведе над формата.

Тоест. Имаме проверка на потребителско име и парола (например) и данните за вход са грешни , то тогава вместо да изведа срещу полето:

//form
Потребителско име <input name="username" type="text"> <?php echo $context['error']['username']; ?> <br />
Парола <input name="pass" type="password"> <?php echo $context['error']['password']; ?> <br />
//form

над въпросната форма да излезе съобщение:

Грешни данни за вход. Примерно.

ЕДИТ: Другото, за което се сещам е да се вкара
PHP:
$context['wrong'] = "Грешно потребителско име или парола.";

Ако са грешни данни и тогава над формата да се изведе точно това съобщение.

if (array_key_exists('wrong', $context)) {
echo '<h2>'.$context['wrong'].'</h2>';
}

Например. Надявам се да си ме разбрал.
 
Правилно си се насочил.

Вкарвай ги във масив и след това ги показвай във view - то (там където ще ти е html - а).

Разделяй логиката от дизайна на приложението.

http://web-tourist.net/login/login/view.php?st=3418

Ето това е един мой урок, към края му съм обяснил за това. Примера не е много добър, може да се напише по доста по - добър начин показването на тези грешки (подобен на твоя), ще ти даде обща представа за структурирането.
 

Back
Горе