Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Несостыковка BIGINT и integer
 
 автор: Maxam   (03.11.2012 в 13:41)   письмо автору
 
 

Несостыковка поля BIGINT в таблице MySQL и переменной $_GET['id'], которая специально обрабатывается как
$_GET['id']=(integer)$_GET['id'];

Противоречие возникает в максимальных величинах:
для BIGINT - 9223372036854775807;
для (integer)$_GET['id'] - 2147483647.

Как быть?

  Ответить  
 
 автор: Sfinks   (03.11.2012 в 14:52)   письмо автору
 
   для: Maxam   (03.11.2012 в 13:41)
 

В пхп на 32-битных системах предел целого - integer.
Я в базе в БИГИНТЕ когда хранил номера сотовых, в ПХП приходилось ими пользоваться как строками.

  Ответить  
 
 автор: cheops   (03.11.2012 в 15:01)   письмо автору
 
   для: Maxam   (03.11.2012 в 13:41)
 

Все верно, BIGINT - это 64-битное целое, либо переходите на 64-битные версии операционной системы и PHP, либо не преобразовывайте значение $_GET['id'] к целому числу, работайте с ним как со строкой.

  Ответить  
 
 автор: Maxam   (03.11.2012 в 23:21)   письмо автору
 
   для: cheops   (03.11.2012 в 15:01)
 

Вот мы с вами в другой теме по-другому вопросу общались. Вы сказали, что безопасность переменных это то, что я использую передаваемые значения пользователей такими, какие они должны быть для скрипта, а не какими бы мог написать их пользователь, т. е. если мне нужно $_GET['page'], то оно должно быть цифрой, и если пользователь решит передать первая или в $_GET['page'], то мне нужно это проверить. Вот как тогда проверить здесь $_GET['id'] через is_integer?

  Ответить  
 
 автор: Sfinks   (04.11.2012 в 00:47)   письмо автору
 
   для: Maxam   (03.11.2012 в 23:21)
 

if( !preg_match('#^\d+$#',$_GET['page']) ){
  echo 'в переменной не число';
}else{
  echo 'в переменной число';
}

  Ответить  
 
 автор: Maxam   (04.11.2012 в 01:21)   письмо автору
 
   для: Sfinks   (04.11.2012 в 00:47)
 

А где есть список вот всех этих /d?

  Ответить  
 
 автор: Sfinks   (04.11.2012 в 08:31)   письмо автору
 
   для: Maxam   (04.11.2012 в 01:21)
 

тут

  Ответить  
 
 автор: Maxam   (04.11.2012 в 01:24)   письмо автору
 
   для: Sfinks   (04.11.2012 в 00:47)
 

А
if(preg_match('#[0-9]+#ius',$_GET['page'])==false){ошибка}
пойдёт?

  Ответить  
 
 автор: Sfinks   (04.11.2012 в 08:37)   письмо автору
 
   для: Maxam   (04.11.2012 в 01:24)
 

Нет.
Во первых это выражение проверит просто есть ли в строке хотя бы одна цифра и вернет 1 даже на "вася2"
Во вторых зачем ius?
i -поиск производить регистронезависимо;
u -строка в utf8;
s -многострочный текст.
Вам для цифр что из этого надо?
Ну и в третих - зачем ==false, если функция preg_match() возвращает 0 или 1?

п.п.2,3 конечно не ошибки, пых это переварит. Но оно вам надо?

  Ответить  
 
 автор: confirm   (04.11.2012 в 09:36)   письмо автору
 
   для: Sfinks   (04.11.2012 в 08:37)
 

Зачем при запросе номера страницы проверять посредством preg_match()? )
$n = (int)$_GET['page'] ? (int)$_GET['page'] : 1;

  Ответить  
 
 автор: Sfinks   (04.11.2012 в 15:07)   письмо автору
 
   для: confirm   (04.11.2012 в 09:36)
 

А если завтра ТС понадобится проверить не номер страницы, а номер телефона? Он новую тему создаст? Тем более, что заголовок темы подразумевает, что ему нужно не только проверить большое число, но и использовать его неизмененным.

  Ответить  
 
 автор: confirm   (04.11.2012 в 15:34)   письмо автору
 
   для: Sfinks   (04.11.2012 в 15:07)
 

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

  Ответить  
 
 автор: Sfinks   (04.11.2012 в 23:37)   письмо автору
 
   для: confirm   (04.11.2012 в 15:34)
 

Я отвечаю опираясь на заголовок темы, предполагая, что ТС $_GET['page'] применил только для примера передачи данных, а не сменил тему.

Также он мог написать и $_GET['unique_not_autoincrement_sound_id_from_world_mega_collection'] =)

З.Ы.
Ну зато теперь, в результате нашей дискуссии ТС'у стало полностью понятно для каких чисел какую проверку применять :-D

  Ответить  
 
 автор: confirm   (05.11.2012 в 06:56)   письмо автору
 
   для: Sfinks   (04.11.2012 в 23:37)
 

$_GET['page'] - да ну, и козе понятно чего просят. ) И именно об этом у него тема и РНР разделе.
Вот если бы он написал $_GET['phoe'], и получая при этом "Внучек мой телефон SN: 124 потом черточка потом...", вот тогда бы и шаблон с выдачей "Дедушка, попросите внучку..."

Я ему давал ссылку на раздел касающийся безопасности, и не раз повторял, чтобы он этот раздел изучал. А там и об экранировании , и о приведении типов... Значит он не внял этому, если он следует тому, что вы пишите, и мотает себе на ус, а это плохо.

  Ответить  
 
 автор: Maxam   (05.11.2012 в 14:09)   письмо автору
 
   для: Sfinks   (04.11.2012 в 08:37)
 

Функция preg_match() возвращает количество найденных соответствий. Это может быть 0 (совпадения не найдены) и 1, поскольку preg_match() прекращает свою работу после первого найденного совпадения
Я всегда расценивал 0 как false, а 1 как true. Поэтому и сравнивал так.

Кстати, проверил, и правда:
$_GET['page_number']='555';
$_GET['page_nonumber']='вася2';
if(preg_match('#[0-9]+#',$_GET['page_number'])==true){echo'1: Только числа<br>';}
if(preg_match('#[0-9]+#',$_GET['page_number'])==false){echo'2: Что-то кроме чисел<br>';}
if(preg_match('#[0-9]+#',$_GET['page_nonumber'])==true){echo'3: Только числа<br>';}
if(preg_match('#[0-9]+#',$_GET['page_nonumber'])==false){echo'4: Что-то кроме чисел<br>';}
вывел:
1: Только числа
3: Только числа

Бесит уже.

P. S. Знаю, что вроде ^ может определять как только не. Вот только я видимо не так применяю. Я думал, что знак ^ нужно ставить перед [что-то-тут].

  Ответить  
 
 автор: Maxam   (05.11.2012 в 14:14)   письмо автору
 
   для: Maxam   (05.11.2012 в 14:09)
 

Может так? :(
<?php
$_GET
['page_nonumber']='вася2';
if(
preg_match('#[^0-9]+#',$_GET['page_nonumber'])==true){echo'4: Что-то кроме чисел<br>';}
?>

Вроде вывел:
4: Что-то кроме чисел

  Ответить  
 
 автор: Sfinks   (05.11.2012 в 16:52)   письмо автору
 
   для: Maxam   (05.11.2012 в 14:09)
 

>P. S. Знаю, что вроде ^ может определять как только не. Вот только я видимо не так применяю. Я думал, что знак ^ нужно ставить перед [что-то-тут].

Вы ссылку приведенную выше смотрели?
^ означает отрицание только в квадратных скобках. Вне их ^ означает начало строки. А $ - конец строки. Поэтому ^\d+$ означает "от начала до конца строки могут быть одна или более цифр"

  Ответить  
 
 автор: Maxam   (05.11.2012 в 17:30)   письмо автору
 
   для: Sfinks   (05.11.2012 в 16:52)
 

То есть я всё таки правильно теперь написал?

  Ответить  
 
 автор: Sfinks   (05.11.2012 в 18:44)   письмо автору
 
   для: Maxam   (05.11.2012 в 17:30)
 

можно и так

  Ответить  
 
 автор: Maxam   (05.11.2012 в 21:40)   письмо автору
 
   для: Sfinks   (05.11.2012 в 18:44)
 

Спасибо.

P. S. Я знаю, что \d это цифры, мне 0-9 привычнее просто.

  Ответить  
 
 автор: cheops   (07.11.2012 в 20:51)   письмо автору
 
   для: Maxam   (05.11.2012 в 21:40)
 

Некоторые диалекты регулярных выражений \d не понимают (это особенности диалекта Perl), а вот 0-9 все понимают.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования