1000 и 1 Notice

valyala

Новичок
вместо
PHP:
if ($subpage==""){$subpage="1";}
напиши
PHP:
if (!isset($subpage) || $subpage=="") $subpage="1";
 

Фанат

oncle terrible
Команда форума
это все заплатки, затычки.

По-хорошему, надо не дырки заделывать, а писать так, как нас к этому стимулирует политика создателей пхп.
а стимулирует она не к првоеркам перед каждым вызовом переменной, а к инициализации всех переменных перед использованием.

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

Sash [None]

Новичок
Фанат, уважаемый, я зашел по первой ссылке, а не второй. Это говорит, что я тупой. Если ман я прочитать могу, и что-то понять, то из вышенаписанного (Вами), я не понял ровным счётом ничего. :(
 

fixxxer

К.О.
Партнер клуба
Из предыдущего поста первое предложение выкинуть, оставшиеся переставить местами.
 

Фанат

oncle terrible
Команда форума
Sash [None],я не понял, о каких ссылках ты говоришь.
Если хочешь - я могу поподробнее объяснить то, что я написал выше.
 

Sash [None]

Новичок
Фанат, если честно, хочу. Я же стал исправлять ошибки, которые в принципе не видны и всё работает. Но мне хочется, чтобы всё работало правильно.
 

Фанат

oncle terrible
Команда форума
ну смотри.
Если вдуматься - какой смысл в конструкции вида
PHP:
if (empty($subpage)) $subpage="1";
?
Зачем ее написали?
А чтобы нотайса "андефайнед вариабле" не было!
Но какой смысл в этом нотайсе?
Не кажется тебе это немного странным?
Зачем было вводить эти нотайсы чтобы тут же их давить?
Довольно дурацкая затея, если вдуматься?

На самом деле, все было совсем не так.
Естественно, нотайсы придумали не для этих проверок, а для предупреждения о том, что ты собираешься использовать переменную, которой нет!

Именно от такого использования и идут все беды - взломы скриптов, и проблемы с регистер глобалс, и ошибки в программах.
Если вдуматься - и правда - как можно писать программу, НЕ ЗНАЯ, что у тебя в переменной? Ну это как дом строить - не из четкого количества кирпичей, цемента, досок - а от балды, что будет - то будет.
Во всех "серьезных" языках программирования ты должен переменную перед использованием объявить, сказать программе, что вот у тебя переменная, и она имеет такое-то значение.
В РНР раньше было не так, но со временем авторы языка осознали, сколько этоприносит бед.
И стали подталкивать программистов к тому, чтобы все переменные, которые будут нужны в скрипте, заранее декларировались.
О попытках использовать переменную, которой нет, и предупреждает тебя нотайс.

То есть, надеюсь, я был убедителен - надо все переменные в скрипте объявлять.
И, в общем, с этим особых проблем нет.
Нужен тебе счетчик $i? Вместо просто
echo $i++;
ты пишешь
$i=0;
echo $i++;

Все ок - заранее объявил, никаких неожиданностей не будет.
$i равна нулю, а не 1526 после предыдущего цикла.

Переходим к твоей субпейдж. Она ведь приходит с запросом?
И может придти, а может - нет. так? Как с ней-то быть?
как заранее объявить переменную, какое значение присвоить?
самое простое - это
if ($subpage=="") $subpage="1";
можно сделать и так.
Но уже понимая, что делаешь ты это не для того, чтобы рот РНР заткнуть, а чтобы быть уверенным, что переменная есть.
Для этих целей неплохо бы все входящие переменные таким образом объявить в начале скрипта.
Не непосредственно перед использованием, а в начале скрипта, до любых действий.
Так с ними можно будет проще управляться - следить, добавлять. Так ты будешь уверен, что объявил переменную точно до любого использовния.

Однако, переменных может быть много. И такая конструкция может растянуться далеко. Нельзя ли автоматизировать процесс? Можно! Надо написать функцию, которая получает как аргумент массив с именами переменных, и инициализирует их.
Заодно мы на эту функцию возложим еще одну важную функцию! А имено:
Допустим, subpage в скрипт пришла... но в ней не 1, а "Здесь был Вася"! Твоя проверка на иссет или емпти оставит переменную как есть, и она пойдет в запрос... в результате получим ошибку.
Значит, надо заранее прописать всем переменным их тип, а в функции насильственно привести к нему.
Еще две вещи, которые может делать наша функция:
- присвоить определенное значение ,если переменная не определена.
- проверить на диапазон допустимых значений.
К примеру, передали тебе subpage=-1. проверка на тип прошла, а ошибка все равно есть - нету страницы с таким номером.

Вот.
Пока читай и усваивай, что непонятно - спрашивай, а я пока напишу функцию.

Если мытры захотят попингать этот рассказиек - буду зарание благодарин.
 

Sash [None]

Новичок
Фанат, спасибо. Урузумил. Так сказать. Но действительно, переменных бывает много. И как с ними работать я ещё толком не понял. Полгода работал на пхп с выключеными нотисами, всё работало, и я думал - нормально. Потом оказывается - не правильно. И отсюда пошли, затычки, заклёпки, запайки из тех материалов, которые успел изучить. Ну а что можно изучить, если изначально делаешь сто ошибок в одном килобайте?
 

Фанат

oncle terrible
Команда форума
это не ошибки, а нотайсы.
и у тебя не может быть их прямо сто.
сто - это у тебя очень опасная ситуация с кавычками.
я думал, ты уже исправил.
тут только руками.

а вот для "андефайнед вариабле" как раз и подойдет моя функция - пропишешь ее вызов в верху скрипта и все! дальше сможешь работать КАК РАНЬШЕ, ниего не меняя в коде. и без нотайсов.
 

Фанат

oncle terrible
Команда форума
Это ПРИМЕРНЫЙ скрипт.
применяя его нужно помнить, что:
1. задачи бывают разные, и для некоторых его надо изменить.
2. Если тебе надо знать - пришла ли переменная в скрипт, или нет, если значима проверка на isset, то переменную обрабатывать не надо. правда, есть мысль присваивать ей NULL
3. этот скрипт обрабатывает то, что пришло от юзера.
если нотайс вылезает на другую переменную, то ее просто перед использованием объявить

PHP:
<?
error_reporting(E_ALL);
$my_vars = array(
  'subpage' => array('type'=>'int', 'default'=>1, 'source'=>'GET'),
  'page'    => array('type'=>'int', 'default'=>0, 'source'=>'GET'),
  'user'    => array('type'=>'string', 'default'=>'', 'source'=>'GET')
);

function validate_input($vars,$global=0) {
  foreach ($vars as $name => $descr) {
    $source="_".$descr['source'];
    if (isset($GLOBALS[$source][$name])) {
      $v=$GLOBALS[$source][$name];
      settype($v,$descr['type']);
    } else {
      $v=$descr['default'];
    }
    $GLOBALS[$source][$name]=$v;
    $GLOBALS['HTTP'.$source.'_VARS'][$name]=$v;
    if ($global) $GLOBALS[$name]=$GLOBALS[$source][$name];
  }
} 

echo var_dump($subpage)."<br>\n";
echo var_dump($page)."<br>\n";
echo var_dump($user)."<br>\n";
print_r($_GET);
echo "<br>\n";
print_r($HTTP_GET_VARS);
echo "<br>\n";

validate_input($my_vars,1);

echo var_dump($subpage)."<br>\n";
echo var_dump($page)."<br>\n";
echo var_dump($user)."<br>\n";
print_r($_GET);
echo "<br>\n";
print_r($HTTP_GET_VARS);
echo "<br>\n";

?>
пинки принимаются.
 

Фанат

oncle terrible
Команда форума
Насколько я знаю, Демиург, кажется, применяет такое на практике.
Хотелось бы услышать его комментарий и/или пример
 

Sash [None]

Новичок
Гн. Фанат, Если не сложно, чуть-чуть разъесните, что и зачем тут у нас печатается? Или это для контроля??
 

confguru

ExAdmin
Команда форума
Тихий ужас :)
Фанат зачем такое новичка советовать?
 

confguru

ExAdmin
Команда форума
делаешь init.php

$page=0;
if (isset($_GET['page'])) {
$page = intval($_GET['page']);
}
if (isset($_POST['page'])) {
$page = intval($_POST['page']);
}

И все... для основных переменных..
 

fixxxer

К.О.
Партнер клуба
Печатается - для контроля, само собой разумеется.

Чтобы ты понял, как это всё работает.
 

Фанат

oncle terrible
Команда форума
Sash [None], мне не страшно, но увы, я по аське практически не общаюсь.
К тому же я свято верю, что коллективный разум в форуме сильнее одного человека в аське.

Вот только разуму аргументировать надо...

admin, ага, на сайт из десятка страниц - один инит, да?
Тогда уж просто блок "иф иссет(вар) вар=гет" в самом скрипте.

Но мой вариант лучше
В инит идет функция.
а в скрипте описывается массив.
получается компактно и надежно.

Впрочем, каждый может выбрать для себя.
Вариант с болком иссетов я описал выше.
 

Фанат

oncle terrible
Команда форума
Sash [None]
блок с var_dump и print-r - для демонстрации.
сначала мы обращаемся к переменным до вызова функции и получаем нотайсы.
потом - после. и получаем переменные.

функция запихивается в библиотеку, которая подключается инклюдом.
таким образом в скрипте это выглядит так:
PHP:
?>
include 'nastroiki.php';
$my_vars = array( 
  'subpage' => array('type'=>'int', 'default'=>1, 'source'=>'GET'), 
  'page'    => array('type'=>'int', 'default'=>0, 'source'=>'GET'), 
  'user'    => array('type'=>'string', 'default'=>'', 'source'=>'GET') 
); 
validate_input($my_vars,1); 
?>
довоьлно аккуратно и не длиннее, чем блок иссетов. но зато наглядно.

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