[off] Поведение скриптов при обработке целых во входных данных.

WP

^_^
[off] Поведение скриптов при обработке целых во входных данных.

Обычно программисты приводят строки входных данных которые содержат (должны содержать) целые числа к типу int с помощью intval, но как известно intval('100abc') даст 100. Вот и на этом форуме - http://phpclub.ru/talk/forumdisplay.php?s=&forumid=27_and_some_text эквивалентно ...forumid=27.

Как думаете, скрипт должен выдать в этом случае 404, или же взять целое из начала строки? Я думаю 404 (и сделал так что при неверном аргументе (который содержит не только 0-9) получаю int(0)).

Как думаете (делаете) Вы?
 

Фанат

oncle terrible
Команда форума
я думаю, ты прав.

а то, что ты написал - это не обработка входных данных, а формирование корректного синтаскиса.
 

WP

^_^
0xHH
27_and_some_text как раз соответствует /([0-9]+)/ :) Я думаю ты хотел сделать ~^\d+$~

А типы как проверяешь? Существование переменной? Надеюсь с E_ALL кодишь.

Просто понимаете, я конечно же уверен в надежности своего решения (делал функции которых кормлю переменными-ссылками). Вот к примеру:
PHP:
function gpcvar_int(&$var,$empty = FALSE)
{
 if ($empty and strlen($var) == 0) {return '';}
 if (strval(intval($var)) != $var) {return 0;}
 return intval($var);
}
Но мне бы хотелось узнать как другие решили эту задачу, и решили ли вообще, возможно есть лучшие решения. Часто умиляет когда поставя вместо script.php?id=132 урл script?id[]=123 вижу Notice: Array to string conversion, что в переводе на русский означает "Преобразование массива в строку", эта ошибка появляется когда id подставляют в запрос не заботясь о типе.
Кода у меня прилично, скоро будет мегабайт, поэтому хочу найти оптимальное решение, стабильное и быстрое. По скорости метод со ссылками очень даже рулит.
 

0xHH

Новичок
27_and_some_text как раз соответствует /([0-9]+)/ Я думаю ты хотел сделать ~^\d+$~
Тю, я дурак. :)

Вообще, у меня так:

if ($host == 'message.'.CFG_HOST_NAME)
{
$pattern = "/([0-9]+)/";
$tmp = preg_match($pattern, $url, $array);
if ($tmp == 1)
{
if ($url == "/".$array[1]."/")
{
$id = $array[1];
require 'message.php';
exit;
}
}
}
.....
require '404.php';
 

WP

^_^
Схема сама по себе дикая. Но не суть. Как ты получаешь данные из $_REQUEST ($_GET/$_POST)?
 

WP

^_^
0xHH
Ы =) Думаю тут объяснять нет смысла, думаю вот статейку в FAQ написать...
 

0xHH

Новичок
WP
Чем именно дикая схема? Сначала использовался .htaccess, но пришлось от него отказаться по нескольким причинам. К сожалению его динамически изменять не получится.
 

Develar

Новичок
Я поступаю также как и парсер XML - малейшая ошибка - иди исправляй, а я за тебя ничего править не буду. Исключение лишь в логически обоснованном - если в uri, которое не должно содержать конечный слеш, мне все же передадут конечный слеш, я отдам 301, а не 404.
 

StUV

Rotaredom
Как думаете, скрипт должен выдать в этом случае 404, или же взять целое из начала строки? Я думаю 404 (и сделал так что при неверном аргументе (который содержит не только 0-9) получаю int(0)).
не вижу особого смысла париться с точным соответствием типов в гет-запросе
если intval('100abc') даст 100 - кому от этого плохо ?

такие запросы редко составляются руками и обработка таких ситуаций как ошибочных нужна в узком классе задач - например в модулях типа "расширенный поиск" и т.п...
 

WP

^_^
> кому от этого плохо ?
Никому. Я говорю о правильной реакции на URL, а не о intval и т.д., ведь это лишь инструмент.
 

StUV

Rotaredom
WP
"кому плохо" читай "почему это в общем случае может быть неправильным"

в каждом конкретном случае надо исходить из конкретных требований и не делать лишних "движений"...
 

Фанат

oncle terrible
Команда форума
WP
ты, кажется, спрашивал как делают окружающие.
Ну так тебе ответили.
Зачем делать из этого флейм? Тем более, когда очевидно, что однозначного ответа быть не может.
 

Доктор

Новичок
В идеале не только тип проверять, а проверять все, вплоть до наличия такой записи в БД и порядка переменных, и если где-то не сошлось, то 404 (или там 301 по ситуации). Но геморно конечно.
 

WP

^_^
Доктор
1. Порядок не важен Imho.
2. Наличие записи в БД конечно же проверяется всегда.
3. 301 думаю не нужна.
 
Сверху