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
Форумы портала PHP.SU :: Версия для печати :: Проверка числового ввода
Форумы портала PHP.SU » PHP » Регулярные выражения » Проверка числового ввода

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

1. vsll - 20 Марта, 2011 - 21:31:14 - перейти к сообщению
Я новичок в 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:...

Для чего такая педантичность?
2. ALEN - 20 Марта, 2011 - 21:40:09 - перейти к сообщению
filter_var() - не отменяли, а по поводу регулярок, то:
\d+
3. movEAX - 20 Марта, 2011 - 21:42:16 - перейти к сообщению
Vasiliya пишет:
#
function isnum($value) {
#
if (!is_array($value)) {
#
return (preg_match("/^[0-9]+$/", $value));
#
} else {
#
return false;
#
}
#
}


Какой-то велосипед. В php есть нативная функция.
Все входящие данные от пользователя должны проверяться, как минимум, в целях предотвращения компрометации БД
4. vsll - 20 Марта, 2011 - 21:47:04 - перейти к сообщению
ALEN я про filter_var() не знала, но первое что мне выдал гугл (баг) http://www[dot]cyberforum[dot]ru/php/thread103518[dot]html

movEAX то есть это в целях безопасности ? Чтобы снять нагрузку с базы данных или что?
5. Мелкий - 20 Марта, 2011 - 21:47:18 - перейти к сообщению
ALEN пишет:
filter_var() - не отменяли

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

Для числовых значений куда лучше подойдёт intval или приведение типа в стиле С: $val = (int) $val;
6. vsll - 20 Марта, 2011 - 21:54:30 - перейти к сообщению
Цитата:
Вы не можете использовать intval() с array и object.

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

На случай опечатки чтоли, когда разработчик вместо 0 поставил букву O ?????
7. ALEN - 20 Марта, 2011 - 21:55:48 - перейти к сообщению
Мелкий
PHP:
скопировать код в буфер обмена
  1. echo intval("1q2w3e"); // 1 - не подойдет
  2. echo (int) "1q2w3e"; // 1 - не подойдет

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

по понятным причинам отработает некорректно. По таким причинам (а можно себе представить еще не один такой пример) излишняя педантичность не будет лишней.
9. vsll - 20 Марта, 2011 - 22:40:02 - перейти к сообщению
EuGen спасибо, но здесь именно от разработчика, просто очень много и часто (через строку)

и действительно когда много, то можно и опечататься или точку поставить вначале или вообще ничего не поставить
ALEN натолкнул на мысль, за мной плюс (пока ручей иссяк)))
10. EuGen - 20 Марта, 2011 - 22:45:51 - перейти к сообщению
Гм. $_GET - точно не от разработчика. Или имеется ввиду что-то другое?
Я вообще свой класс валидации обычно использую. Ну, или простую функцию, которая по валидатору проверяет.
11. vsll - 20 Марта, 2011 - 22:47:57 - перейти к сообщению
EuGen (я сотру через 5 мин этот код, OK?)))
это интимные места моего сайта, на всякий случай лучше с глаз подальше)))
12. EuGen - 20 Марта, 2011 - 22:50:21 - перейти к сообщению
Так а где же здесь валидация, исключая многочисленные if ..
?
13. vsll - 20 Марта, 2011 - 22:52: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. }
14. EuGen - 20 Марта, 2011 - 22:55:01 - перейти к сообщению
Если это с Вашего сайта, то думаю, вопросов возникать не должно - ведь разработчик то Вы.
По поводу isnum, вроде уже сказали. Не очень понятно сейчас, в чем вопрос/сомнение.

Ошибку же я бы предпочел хранить в переменной сессии. Таким образом ее можно задавать, например, в блоке catch и потом делать удобное перенаправление, не заботясь о том, откуда пришла ошибка, а просто отображая ее.
15. vsll - 20 Марта, 2011 - 23:00:27 - перейти к сообщению
EuGen оО нет, я не разработчик, я горький ламер, который бьётся над этим кодом уже 3й день)))
CODE (htmlphp):
скопировать код в буфер обмена
  1. Ошибку же я бы предпочел хранить в переменной сессии. Таким образом ее можно задавать, например, в блоке catch и потом делать удобное перенаправление, не заботясь о том, откуда пришла ошибка, а просто отображая ее.

Я не сомневаюсь, что это удобно, но пока я нихт ферштейн в этом

 

Powered by ExBB FM 1.0 RC1