download.bg
 Вход Списание  Новини  Програми  Статии  Форум  Чат   Абонамент  Топ95   Архив 

PHP проверка за правилно въведени данни как е най добре да се направи ?

Автор
Съобщение
anonymous
Нед, 09.06.13, 11:53
Здравейте правя регистрационна форма и се чудя как е най правилния начин за проверка за правилно въведени:

Име (ник):
Имейл адрес:
Парола:
Повтори парола:
Код за защита:
......

Мислех си с if ове примерно проверява за съществуващ ник ако го има изкарва съобщение ако го няма продължава напред с мейл и т.н. Но кода ще стане доста дълъг и объркан и си мисля има ли други начини ?

programings
Нед, 09.06.13, 13:20
Какво те притеснява, ако стане прекалено дълъг? Мислиш, че ще стане по-бавен ли?
Реално имаш 2 проверки (ник и емайл), които изискват заявка към базата данни, и евентуално биха били по-бавни.
Другите (предполагам за дължина на паролата, валидност на емайла, captcha и т.н.) се изпълняват за милисекунди.
В конкретната ситуация не те интересува колко ще е дълъг кода. Ако притесненията ти са от някакво друго естество, като например кодът да е по-прегледен, и да се обработва по-лесно, то може да си направиш проверките в един отделен файл, който на include-наш, но разлика реално няма да има (кодът ще си се зарежда все е едно е във файла от където е include-нат, просто е в отделен файл и не става прекалено дълго).
По принцип всички разработчици използват if проверки. Друг сносен начин няма.
редактиран от programings на 09.06.13 13:21
insecteater
Пон, 10.06.13, 08:25
Ако ще го пускаш в интернет пространството - нямаш избор, кода наистина да става колкото си иска дълъг. Просто не можеш да си позволиш компромис със сигурността. А и с удобството на потребителя също, ако гониш посещаемост. За това дали е объркан - вече там идва изкуството да си подредиш и форамтираш, че и коментираш кода така, че да не е объркан.

Аз например в момента правя точно форма за регистрация на потребител, като проверката е двойна - веднъж от страна на клиента чрез JavaScript да му оцветява къде какво е сбъркал и втори път с PHP за същите грешки, както и някои допълниттелни, Няма да ти казвам общия код само за това колко реда е - към няколкостотин сигурно вече са се събрали . Само дето не ползвам AJAX за проверка в реално време дали потребителското име или email-а вече са заети.

anonymous
Пон, 10.06.13, 12:16
Не не ме притеснява че ще стане бавно защото обработката наистина е бърза и дори няма да се усети просто ме дразни дългия код

Но явно няма как ще е дълъг. Сега въпроса е няма ли на готово някъде тези проверки за да не ги пиша.....

insecteater
Пон, 10.06.13, 13:23
Ето примерен непълен код как си правя (засега) проверките.
if ($_POST) {
	//Check registration information
	$err = '';
	//Check for empty fields
	if (!$_POST['usr'] || !$_POST['email'] || !$_POST['phone'] || !$_POST['fullname'] || !$_POST['address'])
		$err=REG_ERROR;
	//Check for valid username
	if (!$err && preg_match('/[^a-zA-Z-_]/', $_POST['usr']))
		$err=REG_INVALID_USERNAME;
	//Check for password requirements
	if (!$err && (($_POST['pwd'] !== $_POST['pwd1']) || (strlen($_POST['pwd']) < 7)) )
		$err=REG_PASS_ERROR;
	//Check if username is not already registered
	if (!$err) {
		$result = $db->query("SELECT COUNT(usr) FROM ".MYSQL_TABLEPREFIX."users WHERE usr='$_POST[usr]' ");
		$result = $result->fetch_row();
		if ($result[0] > 0)
			$err=REG_USEREXISTS;
	}
	//Check if email address is not already registered
	if (!$err) {
		$result = $db->query("SELECT COUNT(email) FROM ".MYSQL_TABLEPREFIX."users WHERE usr='$_POST[email]' ");
		$result = $result->fetch_row();
		if ($result[0] > 0)
			$err=REG_EMAILEXISTS;
	}
 
	//If registration was successful, redirect to the registered user page.
	if (!$err && false) {
		ob_clean(); ob_clean();
		header('Location: registered.php');
		die();
	}
}

anonymous
Пон, 10.06.13, 15:42
Ганчо проверките са много малко аз мислех проверка за:

не въведен ник
празно масто (интервал)
ник на кирилица
забранени символи
дължина на ника да не е повече от...

други не се сещам....

programings
Пон, 10.06.13, 16:07

RE: PHP проверка за правилно въведени данни как е най добре да се направи ?

<?php
if ($empty($_POST['nick')) {
echo 'Празен ник!';
}

” празно място (интервал)

Просто trim-ваш въведеното, когато го записваш в БД.
Прочети за trim.

Например с регулярен израз:
function iscyr($text) {
return preg_match('/[А-Яа-я]/u', $text);
}

Също може с регулярен:
$nick = $_POST['nick'];
 
if (preg_match('/['^£$%&*()}{@#~?><>,|=_+¬-]/', $nick))
{
    // какво правим, ако има забранени символи в ника
}

” дължина на ника да не е повече от...

Използваме функцията strlen.
if(strlen($_POST['nick'])<=5) {
// какво правим ако ника е под 5 символа
}

редактиран от programings на 10.06.13 16:07
insecteater
Пон, 10.06.13, 16:16

RE: PHP проверка за правилно въведени данни как е най добре да се направи ?

Това с кирилицата и интервала не го схванах.
//..
	$err = '';
	if (!$_POST['usr'])
		$err='Празно поле за потребителско име';
	if (!$err && strlen($_POST['usr']) < 6)
		$err = 'Потребителското име трябва да е с дължина най-малко от 6 символа';
	if (!$err && preg_match('/[^a-zA-Z0-9\-\_]/', $_POST['usr']))
		$err = 'Непозволени символи в потребителското име';
	if (!$err) {
		//... Регистрираме потребителя ...
		header('Location: registered.php');
		die();
	}
	//...
	echo '<div class="err">'.$err.'</div>';

Хехе, докато се наканя и ме изпреварили.

редактиран от insecteater на 10.06.13 16:18
редактиран от insecteater на 10.06.13 16:24
phrozencrew
Пон, 10.06.13, 18:25
Ганчо, аз използвам подобен код, но правя запазване на всички съобщения за грешка в един масив. Нещо от сорта (използвам твоя код):
$err = array();
if (!$_POST['usr'])
	$err[]='Празно поле за потребителско име';
if (strlen($_POST['usr']) < 6)
	$err[] = 'Потребителското име трябва да е с дължина най-малко от 6 символа';
if (preg_match('/[^a-zA-Z0-9\-\_]/', $_POST['usr']))
	$err[] = 'Непозволени символи в потребителското име';
if (empty($err) {
	//... Регистрираме потребителя ...
	header('Location: registered.php');
	die();
}
//...
 
foreach($err as $err_val){
	echo '<div class="err">'.$err_val.'</div>';
}

anonymous
Пон, 10.06.13, 18:34

RE: RE: PHP проверка за правилно въведени данни как е най добре да се направи ?

” Това с кирилицата и интервала не го схванах. „

Ми ника да не е на кирилица но и да е пак не пречи де... А интервал примерно "nik" "n i k"... Но както разбирам е излишна такава проверка щом има такова условие...

if (!$err && preg_match('/[^a-zA-Z0-9\-\_]/', $_POST['usr']))
$err = 'Непозволени символи в потребителското име';

редактиран от anonymous на 10.06.13 18:36
programings
Пон, 10.06.13, 19:00
Да, но задължително trim-вай ника, преди да го запишеш в БД.
Това трябва да ти е част от филтрацията. Никога не знаеш от къде ще ти дойде.
anonymous
Пон, 10.06.13, 19:27
<?php
$user = $_POST['usr'];
$err = '';
if (empty($user))
$err ='Празно поле за потребителско име';
if (!$err && strlen($user) < 3)
$err = 'Потребителското име трябва да е с дължина най-малко от 3 символа';
if (!$err && strlen($user) > 10)
$err = 'Потребителското име не трябва да надвишава 10 символа';
if (!$err && preg_match('/[^a-zA-Z0-9\-\_]/', $user))
$err = 'Непозволени символи в потребителското име';
if (empty($err)) {
$user = trim(addslashes($user));
echo 'okkkk '.$user;
die();
}

echo '<div class="err">'.$err.'</div>';
?>
insecteater
Пон, 10.06.13, 20:33

RE: PHP проверка за правилно въведени данни как е най добре да се направи ?

” Ганчо, аз използвам подобен код, но правя запазване на всички съобщения за грешка в един масив. ... „

Да, и аз съм правил слагане в масив и след това изплюване на всички възможни грешки. А този код (с леки изрязвания) го копирах от нещо, над което работя в момента, а там JavaScript-а в реално време показва на потребителя дали е сбъркал, в момента в който напусне input полето, и PHP проверката се явява по-скоро дебъг-ваща защита на данните. При нормални обстоятелства съобщенията от php-то не би трябвало да се връщат - JavaScript-а предварително не би трябвало да допусне формата да бъде изпратена. Разбира се трябва да работи сигурно и без наличен JavaScript, така че без проверка от страна на сървъра е немислимо.

А иначе другите грешки ги обработвам със set_error_handler.

phrozencrew
Пон, 10.06.13, 20:59
Като каза за JavaScript се присетих за един стар урок, който обяснява OOP в JavaScript, като използва пример с проверка на форма по време на писане.
http://net.tutsplus.com/tutorials/javascript-ajax/the-basics-of-object-oriented-javascript/

Коментар

за нас | за разработчици | за реклама | станете автори | in english  © 1998-2024   Experta Ltd.