За последние 24 часа нас посетил 17991 программист и 1613 роботов. Сейчас ищут 897 программистов ...

Получение числовых данных из GET/POST/etc

Тема в разделе "Прочие вопросы по PHP", создана пользователем Vladson, 10 ноя 2010.

  1. Зверь

    Зверь Активный пользователь

    С нами с:
    2 ноя 2010
    Сообщения:
    80
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Если начать считать доли секунд, то регулярное выражения я так пологаю будет работать дольше, чем просто сравнение?
     
  2. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Любопытно.

    Есть ТЗ проверять число. Скрипт не справляется с этой задачей на 100%. Где тут "псевдо" ?
     
  3. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Ключевое слово если.

    На деле эту-же задачу выполняет и ctype_digit, а что именно использовать скорее вопрос религии.
     
  4. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    Apple

    Поддерживаю. Я всё что приходит регулярками проверяю - регулярка для логина, регулярка для простого текста, для номера телефона, для numeric. И сплю спокойно.
     
  5. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Vladson
    Деньги Березовского считаете, что ли?
    Что за ситуация такая, в которой 32 бит недостаточно?
    И это, вы учтите, что числа за пределами int считаются как float. То есть - приближенно и с ошибками. Даже "целые", подчеркиваю. Связываться с вещественной математикой в целочисленном контексте - последнее дело.
     
  6. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Именно по этому в идеале вообще не трогать типы, а посылать в запрос прямо в string (как оно и приходит)

    Т.е
    Код (Text):
    1. $_GET['super_id'] = isset($_GET['super_id']) && ctype_digit($_GET['super_id']) ? $_GET['super_id'] : 1;
    2. SELECT * WHERE super_id = $_GET['super_id']
    ну например у меня архив всех сообщений в хитов сайта однокласников... (логи пишу, статистику считаю, итд)
     
  7. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Vladson
    Хм. И сколько места при этом занимает таблица? Учитывая, что колво записей в ней > 4G.
    Если такая грохнется, не дай Бог, как восстанавливать такие объемы?
     
  8. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Dagdamor
    Не обязательно иметь столько записей, числовые значения не ограничиваются порядковым номером, более того порядковый номер не редко ненужная вещь, иногда это может быть просто числовое значение (в торрент-трекерах например статистика скаченного/отданного пишется в базу и идёт кстати из GET и там числа в миллиарды это вполне нормальное явление.)
     
  9. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    Не осилил весь хливар, но я за ctype_digit/ Rncnfb? тема надавно обсуждалась (вроде artoodeto с кем-то дискуссировал)
     
  10. Johnatan

    Johnatan Активный пользователь

    С нами с:
    6 мар 2008
    Сообщения:
    508
    Симпатии:
    0
    Адрес:
    Испания
    Ещё прабабка моя проверяла значение id так и мне по наследству сию секретную формулу передала. Поделюсь с вами, добрыми молодцами, ибо ржачно у вас тут всё, до изнеможения.

    PHP:
    1. <?php
    2. $id = (array_key_exists('id', $_GET) && ctype_digit($_GET['id'])) ? $_GET['id'] : null;
    3. ?>
    Примечание: null или 0 у меня принимаются в зависимости от того, как сие id используется. В некоторых проектах null, в некоторых 0. В основом null.
     
  11. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Johnatan
    Обманула тебя бабка, добрый молодец! Ибо и твой способ крив, аки ноги у Идолища Поганого. ;)
     
  12. Johnatan

    Johnatan Активный пользователь

    С нами с:
    6 мар 2008
    Сообщения:
    508
    Симпатии:
    0
    Адрес:
    Испания
    Ы. Жаль.. А чем крив-то? А то я всё использую и как-то даже и не думал, что что-то не так. :( Мож у меня дыра какая теперь?
     
  13. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Johnatan
    Возможно. Такой метод, например, оставляет нули в начале числа. В зависимости от контекста, это может работать по-разному - например, в PHP 123 и 0123 это совсем разные числа, первое десятичное, а второе восьмеричное, strlen() возвращает разную длину, и так далее. И нет никакого overflow-контроля - я могу передать тебе "число" хоть 100 Мб в длину, ты его подсунешь в SQL, а тот вывалится по размеру пакета.
     
  14. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Это не входит в контекст проверки, нули можно обрезать стандартной функцией trim.
    Мы проверяем числа, вся остальная обработка - ниже. Регулярку тоже можно сделать, чтобы нули в самом начале не принимала.
     
  15. Johnatan

    Johnatan Активный пользователь

    С нами с:
    6 мар 2008
    Сообщения:
    508
    Симпатии:
    0
    Адрес:
    Испания
    Опаньки. Мерзко как-то на душе моей-то. :(
    Мхм, а так?

    PHP:
    1. <?php
    2. $id = (array_key_exists('id', $_GET) && ctype_digit($_GET['id']) && $_GET['id'][0] != 0) ? $_GET['id'] : null;
    3. ?>
    У меня задача: проверка правильности id, а не исправление его на "правильный". Поэтому либо id подходит под правила, либо кто-то пытается сумничать, а значит нужно это пресекать. Это я по поводу trim.

    Апдейт:
    100 мегабайт сервер в GET не пропустит, а то что пропустит - не страшно.
     
  16. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Johnatan
    Ноль не пропустит :)
     
  17. Johnatan

    Johnatan Активный пользователь

    С нами с:
    6 мар 2008
    Сообщения:
    508
    Симпатии:
    0
    Адрес:
    Испания
    Ноль и не нужен. Это id. Либо больше 0, либо null. Когда нужно пропустить ноль, то null меняется на 0.
    Но за восьмеричные числа спасибо. Давно у меня эта проверка используется. Нужно бы обновить. :)))
     
  18. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Вот собственно это и интересует больше всего, правильный ли это подход или нет. (о чём и первый пост)
     
  19. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    это не подход =) это задача такая.
    в другом случае другая задача и другое решение. если у тебя инженерный калькулятор онлайн, там и инача придется это делать =)

    чет ты перегрелся.
     
  20. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    igordata
    Да нет, ты не вполне прав.
    Задача получить значение, а некоторые решают его через (_!_) пытаясь в случае ошибки её автоматически поправить.
     
  21. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    нет такой задачи.
    это сферический конь в вакууме.
     
  22. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    да всё зависит от задачи...
    Пых параметрами отдаёт строку или массив или !isset. Посему надо сперва проверить наличие. Это понятнее и логичнее всего делать с помощью isset. Итак функционал isset закрепляется. Затем всё строится на логике. Если нам во чтобы то ни стало нужно хоть какое-то значение, то при !isset необходимо обозначить значение по умолчанию. Тобишь для случая строгой необходимости параметра, пока не касаясь его типа можно смело заявить:
    PHP:
    1. <?php
    2. $param = isset($_GET[$name]) ? $_GET[$name] : $default;
    Следующие вопросы, тип параметра и/или его диапазон зависит от требуемых установок для конкретной задачи. Посему я лично юзаю выше описанное в виде метода запроса
    PHP:
    1. <?php
    2. public function get($name, $default = null)
    3. {
    4.   return isset($_GET[$name]) ? $_GET[$name] : $default;
    5. }
    Всё. Точка в обсуждении. Затем если это id базы, привожу к нужному типу с помощью int или 0 + $param или еще как-нить. Всё зависит от дальнейших действий
     
  23. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Жесть.
    Короче
    PHP:
    1. <?php
    2. $id = mysql_real_escape_string($_GET['id']);
    3. $res = mysql_query($query);
    4. if (!$res) {
    5.      // с таким id ничего не найдено
     
  24. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    $pdo->query('SELECT * FROM asd WHERE id = ?', $_GET['id']);
     
  25. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    И это все что нужно в большинстве случаев.