Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Проверка числового ввода

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Описание: Для чего такая педантичность?
vsll
Отправлено: 20 Марта, 2011 - 21:31:14
Post Id


Частый посетитель


Покинул форум
Сообщений всего: 530
Дата рег-ции: Февр. 2011  


Помог: 10 раз(а)




Я новичок в php и многого ещё не понимаю, объясните, пожалуйста люди следующее:
У разработчиков движка часто вижу такой код:
PHP:
скопировать код в буфер обмена
  1. if (isset($_GET['bla bla bla']) && isnum($_GET['bla bla bla']))

где isnum - это даже отдельная функция в ядре:
PHP:
скопировать код в буфер обмена
  1. // Validate numeric input
  2. function isnum($value) {
  3.         if (!is_array($value)) {
  4.                 return (preg_match("/^[0-9]+$/", $value));
  5.         } else {
  6.                 return false;
  7.         }
  8. }

Насколько я понимаю она требует, что условию должна соответствовать вся строка, от начала до конца и она должна состоять минимум из одной цифры, правильно?
Один из примеров, здесь
PHP:
скопировать код в буфер обмена
  1. if (isset($_GET['error']) && isnum($_GET['error']) && !isset($message)) {
  2.         if ($_GET['error'] == 0) {
  3.                 $message = $locale['900'];
  4.         } elseif ($_GET['error'] == 1) {
  5.                 $message = $locale['901'];
  6.         }
  7.         if (isset($message)) {
  8.                 echo "<div id='close-message'><div class='admin-message'>".$message."</div></div>\n";
  9.         }
  10. }

900-Updated
901-Database update error occurs:...

Для чего такая педантичность?
 
 Top
ALEN
Отправлено: 20 Марта, 2011 - 21:40:09
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


Помог: 11 раз(а)




filter_var() - не отменяли, а по поводу регулярок, то:
\d+
 
 Top
movEAX
Отправлено: 20 Марта, 2011 - 21:42:16
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 750
Дата рег-ции: Авг. 2009  


Помог: 16 раз(а)




Vasiliya пишет:
#
function isnum($value) {
#
if (!is_array($value)) {
#
return (preg_match("/^[0-9]+$/", $value));
#
} else {
#
return false;
#
}
#
}


Какой-то велосипед. В php есть нативная функция.
Все входящие данные от пользователя должны проверяться, как минимум, в целях предотвращения компрометации БД


-----
армия.. самое убогое место
 
 Top
vsll
Отправлено: 20 Марта, 2011 - 21:47:04
Post Id


Частый посетитель


Покинул форум
Сообщений всего: 530
Дата рег-ции: Февр. 2011  


Помог: 10 раз(а)




ALEN я про filter_var() не знала, но первое что мне выдал гугл (баг) http://www[dot]cyberforum[dot]ru/php/thread103518[dot]html

movEAX то есть это в целях безопасности ? Чтобы снять нагрузку с базы данных или что?
 
 Top
Мелкий Супермодератор
Отправлено: 20 Марта, 2011 - 21:47:18
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




ALEN пишет:
filter_var() - не отменяли

отменять-то не отменяли. Вопрос в том, была ли эта функция, когда писали код, она же только в PHP5.2 появилась.

Для числовых значений куда лучше подойдёт intval или приведение типа в стиле С: $val = (int) $val;


-----
PostgreSQL DBA
 
 Top
vsll
Отправлено: 20 Марта, 2011 - 21:54:30
Post Id


Частый посетитель


Покинул форум
Сообщений всего: 530
Дата рег-ции: Февр. 2011  


Помог: 10 раз(а)




Цитата:
Вы не можете использовать intval() с array и object.

Мелкий объясни пожалуйста по-тупому, для чего на каждом шагу делать проверку, ведь в том примере, который я привела, значения задаются только самим разработчиком и там другого не дано либо 0, либо 1 (есть ошибка или нет)????

На случай опечатки чтоли, когда разработчик вместо 0 поставил букву O ?????

(Отредактировано автором: 20 Марта, 2011 - 22:03:10)

 
 Top
ALEN
Отправлено: 20 Марта, 2011 - 21:55:48
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


Помог: 11 раз(а)




Мелкий
PHP:
скопировать код в буфер обмена
  1. echo intval("1q2w3e"); // 1 - не подойдет
  2. echo (int) "1q2w3e"; // 1 - не подойдет

Для проверки не подойдет
 
 Top
EuGen Администратор
Отправлено: 20 Марта, 2011 - 22:35:00
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Подозреваю, что в приведенном примере данные задаются не разрботчиком, а из $_GET, то есть от пользователя.
intval - не хорошая идея. Чаще всего надо не привести данные к какому-то формату/типу, а еще и проверить - а было ли значение вообще говоря корректно. ALEN привел тому хороший пример.
Более того, даже если мы уверены, что данные будут в корректном формате, то есть риск нарушить логику работы приложения. Так, к примеру
PHP:
скопировать код в буфер обмена
  1.  
  2. $test="3000000000"; //string
  3. $data=(int)($test); // something wrong...
  4.  

по понятным причинам отработает некорректно. По таким причинам (а можно себе представить еще не один такой пример) излишняя педантичность не будет лишней.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
vsll
Отправлено: 20 Марта, 2011 - 22:40:02
Post Id


Частый посетитель


Покинул форум
Сообщений всего: 530
Дата рег-ции: Февр. 2011  


Помог: 10 раз(а)




EuGen спасибо, но здесь именно от разработчика, просто очень много и часто (через строку)

и действительно когда много, то можно и опечататься или точку поставить вначале или вообще ничего не поставить
ALEN натолкнул на мысль, за мной плюс (пока ручей иссяк)))
 
 Top
EuGen Администратор
Отправлено: 20 Марта, 2011 - 22:45:51
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Гм. $_GET - точно не от разработчика. Или имеется ввиду что-то другое?
Я вообще свой класс валидации обычно использую. Ну, или простую функцию, которая по валидатору проверяет.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
vsll
Отправлено: 20 Марта, 2011 - 22:47:57
Post Id


Частый посетитель


Покинул форум
Сообщений всего: 530
Дата рег-ции: Февр. 2011  


Помог: 10 раз(а)




EuGen (я сотру через 5 мин этот код, OK?)))
это интимные места моего сайта, на всякий случай лучше с глаз подальше)))


Отредактировано администратором: EuGen, 20 Марта, 2011 - 22:49:01
И вовсе не обязательно стирать, есть же спойлеры
 
 Top
EuGen Администратор
Отправлено: 20 Марта, 2011 - 22:50:21
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Так а где же здесь валидация, исключая многочисленные if ..
?


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
vsll
Отправлено: 20 Марта, 2011 - 22:52:10
Post Id


Частый посетитель


Покинул форум
Сообщений всего: 530
Дата рег-ции: Февр. 2011  


Помог: 10 раз(а)




В самом начале огромного скрипта, скромненько так:
PHP:
скопировать код в буфер обмена
  1. if (isset($_GET['error']) && isnum($_GET['error']) && !isset($message)) {
  2.         if ($_GET['error'] == 0) {
  3.                 $message = $locale['900'];
  4.         } elseif ($_GET['error'] == 1) {
  5.                 $message = $locale['901'];
  6.         }
  7.         if (isset($message)) {
  8.                 echo "<div id='close-message'><div class='admin-message'>".$message."</div></div>\n";
  9.         }
  10. }
 
 Top
EuGen Администратор
Отправлено: 20 Марта, 2011 - 22:55:01
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Если это с Вашего сайта, то думаю, вопросов возникать не должно - ведь разработчик то Вы.
По поводу isnum, вроде уже сказали. Не очень понятно сейчас, в чем вопрос/сомнение.

Ошибку же я бы предпочел хранить в переменной сессии. Таким образом ее можно задавать, например, в блоке catch и потом делать удобное перенаправление, не заботясь о том, откуда пришла ошибка, а просто отображая ее.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
vsll
Отправлено: 20 Марта, 2011 - 23:00:27
Post Id


Частый посетитель


Покинул форум
Сообщений всего: 530
Дата рег-ции: Февр. 2011  


Помог: 10 раз(а)




EuGen оО нет, я не разработчик, я горький ламер, который бьётся над этим кодом уже 3й день)))
CODE (htmlphp):
скопировать код в буфер обмена
  1. Ошибку же я бы предпочел хранить в переменной сессии. Таким образом ее можно задавать, например, в блоке catch и потом делать удобное перенаправление, не заботясь о том, откуда пришла ошибка, а просто отображая ее.

Я не сомневаюсь, что это удобно, но пока я нихт ферштейн в этом
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Регулярные выражения »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB