Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Ошибка! Notice: Undefined index:...


Автор: ivanset 26.11.2005, 01:41
Пишу свой первый php-сайт.
При вызове сайта (на локалке через EasyPHP) на месте php-кода:
Код

<?
switch ($_GET['page'])
{
case "about": include("inc/about.php"); break;
case "programming": include("inc/programming.php"); break;
.....................................................
default : include("inc/about.php");
}
?>

выдается ошибка: Notice: Undefined index: page in c:\program files\easyphp1-8\www\set company\index.php on line 203.
Код менюшки:
Код

<A href="index.php?page=about" class="menu">О нас ... </A>
<A href="index.php?page=programming" class="menu">Программирование</A>
.......................................................

Но сразу после перехода по ссылке (в меню) все работает!
Я так понимаю, что по умолчанию значение в переменной $page пустое и поэтому ошибка, а далее, когда там занесено имя страницы, все ок.
Тогда я зделал следующее:
Код

$page="about";

... но всеравно не помогает. smile
Помогите, плиз...

Автор: Mal Hack 26.11.2005, 01:44
Ну дык, когда ты заходишь первый раз ты же не передаешь параметр page, а как следствие скрипт не знает такого элемента !!

Автор: R.M. 26.11.2005, 09:14
Mal Hack

Цитата(Mal @ 26.11.2005, 02:44)
Ну дык, когда ты заходишь первый раз ты же не передаешь параметр page, а как следствие скрипт не знает такого элемента !!


Но по дефолту ведь стоит about.php


ivanset
поменяй строку
Код

switch ($_GET['page'])

на
Код

switch (@$_GET['page'])

Автор: Mal Hack 26.11.2005, 18:01
Цитата
Но по дефолту ведь стоит about.php

Мало ли что по дефолту стоит. Это уже другое дело. Варнинг на строке switch'a вылетает.

Цитата
поменяй строку


Цитата
на

Бред.
Надо условие делать. Пусть в этом конкретном варианте это и не так хорошо видно, но надо сразу учиться обрабатывать все исключения.

Автор: -=Ustas=- 26.11.2005, 19:01
Цитата
Но по дефолту ведь стоит about.php

При чем здесь по дефолту, если данной переменной не существует... Лучше уж тогда так:
Код

if (isset($_GET['page'])) {
    switch ($_GET['page']) {
        case "about": include("inc/about.php"); break;
        case "programming": include("inc/programming.php"); break;
        .....................................................
        default : include("inc/about.php");
    }
}


Или же так:
Код

$page = (isset($_GET['page']))  ? $_GET['page'] : "inc/about.php";
    switch ($page) {
        case "about": include("inc/about.php"); break;
        case "programming": include("inc/programming.php"); break;
        .....................................................
        default : include("inc/about.php");
    }

Автор: R.M. 27.11.2005, 10:52
Цитата(Mal @ 26.11.2005, 19:01)
Мало ли что по дефолту стоит.

Цитата
При чем здесь по дефолту


Если нету $_GET['page'] то он выдаст то что по дефолту в switch и выдаст ошибку што такой переменной нету, так зачем именно в этом случае так заморачиваца когда можно просто поставить @? Объясните

Автор: -=Ustas=- 27.11.2005, 11:20
Куксикус, если переменной $_GET['page'] не существует, то программа в switch даже и не зайдет (пролетит мимо), поэтому, следовательно и дефолта никакого не будет!!! Блок из дефолта выполнится только в том случае, если переменная $_GET['page'] непринимает одно из значений, указанных в case, но значение имеет. Элементарные вещи, надо бы их уже понимать...

Автор: ivanset 27.11.2005, 12:54
Цитата
ivanset
поменяй строку
Код

switch ($_GET['page'])

на
Код

switch (@$_GET['page'])

Куксикус
Спасибо! Все работает!!!
---------------------------------
Кстати, мне тут советовали другой способ:
Вместо switch использовать:
Код

<?
if (!isset($page)){include("inc/about.php");}
else {
include("inc/".$page.".php");
}
?>

Но по каким бы я ссылкам не кликал (менюшка), все равно грузится "inc/about.php" smile

Автор: -=Ustas=- 27.11.2005, 13:55
Цитата(ivanset @ 27.11.2005, 12:54)
Но по каким бы я ссылкам не кликал (менюшка), все равно грузится "inc/about.php"

Правильно, так и будет. Чтобы работало, надо:
Код

<?
if (!isset($_GET['page'])){include("inc/about.php");}
else {
include("inc/".$_GET['page'].".php");
}
?>

Автор: R.M. 27.11.2005, 17:55
-=Ustas=-

Я делал сайт по такому принципу, проверил прямо на нём, всё ок, даже если нету $_GET['page'] грузится дефолт

Автор: WhiteSpirit 27.11.2005, 20:27
Если я не ошибаюсь @ не всегда хорошо, так как сообщения об ошибках накпливается в логе.

а если использовать isset() то значение переменная устанавливается

Автор: Mal Hack 27.11.2005, 20:33
Цитата
Я делал сайт по такому принципу, проверил прямо на нём, всё ок, даже если нету $_GET['page'] грузится дефолт


Цитата(Mal @ 26.11.2005, 18:01)
Надо условие делать. Пусть в этом конкретном варианте это и не так хорошо видно, но надо сразу учиться обрабатывать все исключения.


Автор: -=Ustas=- 27.11.2005, 22:08
Цитата
Я делал сайт по такому принципу, проверил прямо на нём, всё ок

Куксикус, глушить ошибки - это НИ ЕСТЬ ХОРОШО!!! И вообще, подобный стиль программирования, т.е. с применением заглушек, не достоен уважения... Если мне не веришь, то можешь спросить здесь у любого.

Автор: Mal Hack 27.11.2005, 22:39
Ответ авторы темы был дан. Дабы не разводить флейм считаю дискуссию законченной.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)