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


Автор: Shark 20.5.2009, 00:36
чтобы избежать ошибку Notice: Undefined index: id_ses in нужно обязательно указывать isset() или можно каким-то другим способом ее решить?

Автор: godvinn 20.5.2009, 01:16
а просто подавить знаком @ не получаеться *?

Автор: Shark 20.5.2009, 01:46
godvinn, если поставить знак @, то тогда ниодна ошибка не появится...

Автор: Sanchezzz 20.5.2009, 05:17
переменные объявить  пробовали?

(string)$str = '';
(int)$int      = 0; 

можно без (int string итд) 

Автор: bars80080 20.5.2009, 09:49
Цитата(Shark @  20.5.2009,  00:36 Найти цитируемый пост)
нужно обязательно указывать isset() или можно каким-то другим способом ее решить? 


о прописных истинах, о которых всё же надо сказать, ибо вопросы возникают неспроста


вообще, данный вопрос не имеет на самом деле проблемы в себе. тут ведь очень просто: как ты можешь использовать переменные, если не знаешь есть они или нет. а если знаешь, то она уже решена

в любой задаче данные просто не могут ниоткуда взяться, если вы её хотите решить грамотно, без дальнейших сюрпризов в дальнейшим (наподобии ошибок, взлома системы, порчи данных), то надо изначально объявлять переменные

здесь подойдут isset и empty, но в каждом конкретном случае своя проверка
у тех кто начинает кодить возникает естественная лень по этому поводу. переменных много, а наблюдать кучу строк 
Код

if(!empty($_POST['day'])) $day = intval($_POST['day']); $day = 0;
if(!empty($_POST['month'])) $month = intval($_POST['month']); $month= 0;
if(!empty($_POST['year'])) $year = intval($_POST['year']); $year = 0;
в начале скрипта глаз ломается. однако, возникает резонный вопрос, почему не воспользоваться навыком программирования и упростить себе задачу.

к примеру, мне из формы должны придти ряд числовых параметров. я пишу что-то вроде:

Код

$HTML->input(array('day', 'month', 'year'), 'int', 0);


что выглядит гораздо короче чем предыдущий кусок кода, а внутренние обработчики сделают что надо и вернут соответствующие переменные (имхо, лучше они будут не вида $day, а вида $HTML->i['day'], т.е. в специальном массиве под входящие переменные, дабы они не перезатирались). но что самое главное, мы получаем гарантировано существующую переменную, уже приведённую к нужному (числовому) виду

Автор: primesite 20.5.2009, 09:57
А поверку существования индексов (или ключей) в  массивах лучше всего сделать специально предназначенной для этого ф-ей:

http://ru2.php.net/array_key_exists

Автор: Shark 20.5.2009, 15:01
а если такой код:
Код

$count_postpages=mysql_query("SELECT * FROM ***WHERE id_user='".$_SESSION['id']."'") or die ("Ошибка при выборе количества сообщений на страницу");
$count_postpage=mysql_fetch_array($count_postpages);
$num  =  $count_postpage['postpages'] ; 
$page  =  $_GET [ 'page' ];  //в этой строке ошибка

        $newss  =  mysql_query ( "SELECT COUNT(*) FROM *** WHERE id_for=".$_GET['showforum']." AND id_top=".$_GET['showtopic']." AND id_cat=".$_GET['showcat']."" ); 
        $p  =  mysql_result ( $newss,0 ); 
        
        $total  =  intval (( $p  -  1 ) /  $num ) +  1 ; 

        $page  =  intval ( $page ); 

        if(empty( $page ))  $page  =  1 ; 
        if( $page  >  $total )  $page  =  $total ; 
        
        $start  =  $page  *  $num  -  $num ; 
        
    echo "<table border=0 width=70% align=center style='border-collapse:collapse;table-layout:fixed;'><tr><td>
                <div align=left><font size=2>Страница: ";

        if ( $page  !=  1 ) $pervpage  =  "<a href=".$PHP_SELF."?showcat=".$_GET['showcat']."&showforum=".$_GET['showforum']."&showtopic=".$_GET['showtopic']."&page="."1"."> <<</a> 
                <a href=".$PHP_SELF."?showcat=".$_GET['showcat']."&showforum=".$_GET['showforum']."&showtopic=".$_GET['showtopic']."&page=" . ( $page  -  1 ). "><</a> " ;  //в этой строке ошибка
            

        if ( $page  !=  $total ) $nextpage  =   "<a href=".$PHP_SELF."?showcat=".$_GET['showcat']."&showforum=".$_GET['showforum']."&showtopic=".$_GET['showtopic']."&page=" . ( $page  +  1 ). "> ></a> 
                <a href=".$PHP_SELF."?showcat=".$_GET['showcat']."&showforum=".$_GET['showforum']."&showtopic=".$_GET['showtopic']."&page="  . $total .  ">>></a>" ; 
            

        if( $page  -  2  >  0 )  $page2left  =  " <a href=".$PHP_SELF."?showcat=".$_GET['showcat']."&showforum=".$_GET['showforum']."&showtopic=".$_GET['showtopic']."&page=" . ( $page  -  2 ). ">" . ( $page  - 2 ). "</a> | " ; 
        if( $page  -  1  >  0 )  $page1left  =  " <a href=".$PHP_SELF."?showcat=".$_GET['showcat']."&showforum=".$_GET['showforum']."&showtopic=".$_GET['showtopic']."&page=" . ( $page  -  1 ). ">" . ( $page  - 1 ). "</a> | " ; 
        if( $page  +  2  <=  $total )  $page2right  =  " | <a href=".$PHP_SELF."?showcat=".$_GET['showcat']."&showforum=".$_GET['showforum']."&showtopic=".$_GET['showtopic']."&page=" . ( $page  +  2 ). ">" . ( $page  +  2 ). "</a>" ; 
        if( $page  +  1  <=  $total )  $page1right  =  " | <a href=".$PHP_SELF."?showcat=".$_GET['showcat']."&showforum=".$_GET['showforum']."&showtopic=".$_GET['showtopic']."&page=" . ( $page  +  1 ). ">" . ( $page  +  1 ). "</a>" ;  //в этой строке ошибка

        echo  $pervpage . $page2left . $page1left . "<b>" . $page . "</b>" . $page1right . $page2right . $nextpage ; //в этой строке ошибка
        echo "</div></font></td></tr></table>";

Автор: s0lman 20.5.2009, 15:10
Цитата(Shark @  20.5.2009,  15:01 Найти цитируемый пост)
а если такой код

А в чем вопрос?  smile 

Автор: Shark 20.5.2009, 15:15
s0lman, а Вы почтайте первый пост

Автор: s0lman 20.5.2009, 15:27
Для строки 4 можно, например
Код

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

Или $page=1, как там нумерация идет
В остальных трех случаях выложите полный текст ошибок smile

Автор: Shark 20.5.2009, 15:47
s0lman, ошибка точно такая же Notice: Undefined index: (указана переменная)... в своем коде я наисал комменты где эта ошиба!

Автор: primesite 20.5.2009, 15:53
Тогда так:
Код

$page = array_key_exists('page', $_GET) ?  $_GET[ 'page' ] : 0;

Автор: s0lman 20.5.2009, 16:16
Shark,  как я могу судить, в вашем коде не определа переменная $page. 
Если в 4-й строке вы ее определили, то нотайс вылетать не должен бы...

Автор: Shark 20.5.2009, 16:17
помимо этой строчки:
Код

$page  =  $_GET [ 'page' ]; 

есть и другие ошибки...
прокрутите мой код вниз и вправо и почитайте коммы...

с этим
Код

$page  =  $_GET [ 'page' ]; 

я уже понял

Автор: bars80080 20.5.2009, 17:52
и ты не можешь вставить проверку для переменной с указанным индексом? (который, кстати, ты оставил в тайне от нас)

это во-первых, во-вторых, совать чистые необработанные $_GET - верх кощунства. гибель базы, гибель пользователей, имевших горькую участь зайти на ваш сайт, и т.д....

Автор: Shark 20.5.2009, 19:16
bars80080, про какой индекс ты имеешь ввиду?...
1. это вывод ссылок на страницы...
2. где была ошибка я ставил isset()
3. только после этих иссетов у меня выводилось Старница: 111, а не Страница: 1 | 2 > >>

Автор: Photon 20.5.2009, 22:36
У тебя куча переменных из массива $_GET.
Ты твёрдо уверен в их существовании?

И в начале заменить 
Код

$page = $_GET['page'];

на
Код

$page = array_key_exists('page', $_GET)? $_GET[ 'page' ]:1;



P.S.  Вот тебе твой код с поправками..  Так должно работать..   Только обрати внимание на 6, 7 и 8 строки..  Я ж не знаю, какие у тебя минимальные значения

Код

    $res = mysql_query("SELECT * FROM *** WHERE id_user='".$_SESSION['id']."'") or die ("Ошибка при выборе количества сообщений на страницу");
    $count_postpage = mysql_fetch_array($res);
    $num = $count_postpage['postpages'] ; 
    $page = array_key_exists('page', $_GET)?$_GET['page']:1;

    $showforum = array_key_exists('showforum', $_GET)?$_GET['showforum']:1;
    $showtopic = array_key_exists('showtopic', $_GET)?$_GET['showtopic']:1;                                               
    $showcat = array_key_exists('showcat', $_GET)?$_GET['showcat']:1;
    
    $newss = mysql_query ( "SELECT COUNT(*) FROM *** WHERE id_for=".$showforum." AND id_top=".$showtopic." AND id_cat=".$showcat."" ); 
    $p     = mysql_result ( $newss,0 ); 
    $total = intval(($p - 1) / $num) + 1; 
    if($page > $total)  
        $page = $total ; 
    $start = $page * $num - $num ; 
        
    echo "<table border=0 width=70% align=center style='border-collapse:collapse;table-layout:fixed;'><tr><td>
                <div align=left><font size=2>Страница: ";
    if ($page != 1) 
        $pervpage = "<a href='".$_SERVER['PHP_SELF']."?showcat=".$showcat."&showforum=".$showforum."&showtopic=".$showtopic."&page=1'> <<</a> 
                     <a href='".$_SERVER['PHP_SELF']."?showcat=".$showcat."&showforum=".$showforum."&showtopic=".$showtopic."&page=".($page - 1)."'><</a> " ;
    if ($page != $total) 
        $nextpage = "<a href='".$_SERVER['PHP_SELF']."?showcat=".$showcat."&showforum=".$showforum."&showtopic=".$showtopic."&page=" . ( $page  +  1 ). "'> ></a> 
                     <a href='".$_SERVER['PHP_SELF']."?showcat=".$showcat."&showforum=".$showforum."&showtopic=".$showtopic."&page="  . $total .  "'>>></a>" ; 
    if ($page - 2 > 0)  
        $page2left = " <a href='".$_SERVER['PHP_SELF']."?showcat=".$showcat."&showforum=".$showforum."&showtopic=".$showtopic."&page=" . ( $page  -  2 ). ">" . ( $page  - 2 ). "</a> | " ; 
    if ($page - 1 > 0)  
        $page1left = " <a href='".$_SERVER['PHP_SELF']."?showcat=".$showcat."&showforum=".$showforum."&showtopic=".$showtopic."&page=" . ( $page  -  1 ). ">" . ( $page  - 1 ). "</a> | " ; 
    if ($page + 2 <= $total)  
        $page2right = " | <a href='".$_SERVER['PHP_SELF']."?showcat=".$showcat."&showforum=".$showforum."&showtopic=".$showtopic."&page=" . ( $page  +  2 ). ">" . ( $page  +  2 ). "</a>" ; 
    if ($page + 1 <= $total)  
        $page1right = " | <a href='".$_SERVER['PHP_SELF']."?showcat=".$showcat."&showforum=".$showforum."&showtopic=".$showtopic."&page=" . ( $page  +  1 ). ">" . ( $page  +  1 ). "</a>" ;

    echo  $pervpage . $page2left . $page1left . "<b>" . $page . "</b>" . $page1right . $page2right . $nextpage ;
    echo "</div></font></td></tr></table>";



И еще вопрос..  У тебя куча одинакового кода повторяется..  Ты не думал, что его можно как-то по-другому выводить?

Автор: Shark 20.5.2009, 23:14
работает, НО:
Код

Notice: Undefined variable: page2left in *** on line 197
Notice: Undefined variable: pervpage in *** on line 197
Notice: Undefined variable: page1left in *** on line 197


это если от выбранной странице в левую сторону нельзя выбрать страницы, и так же с правой стороной... если выбрать 3 страницу... то эти ошибки исчезают

другими словами вот в этой части:
Код

echo  $pervpage . $page2left . $page1left . "<b>" . $page . "</b>" . $page1right . $page2right . $nextpage ;

Автор: Photon 21.5.2009, 00:20
Ну тут можно сделать все проще..

Код

$res = mysql_query("SELECT * FROM *** WHERE id_user='".$_SESSION['id']."'") or die ("Ошибка при выборе количества сообщений на страницу");
$count_postpage = mysql_fetch_array($res);
$num = $count_postpage['postpages'] ; 
$page = array_key_exists('page', $_GET)?$_GET['page']:1;

$showforum = array_key_exists('showforum', $_GET)?$_GET['showforum']:1;
$showtopic = array_key_exists('showtopic', $_GET)?$_GET['showtopic']:1;                                               
$showcat = array_key_exists('showcat', $_GET)?$_GET['showcat']:1;
    
$newss = mysql_query ( "SELECT COUNT(*) FROM *** WHERE id_for=".$showforum." AND id_top=".$showtopic." AND id_cat=".$showcat."" ); 
$p = mysql_result ( $newss,0 ); 
$total = intval(($p - 1) / $num) + 1; 
if($page > $total)  
    $page = $total ; 


Оставляем этот кусок и добавляем:

Код

$side = 2;
if ($page > $side)
    $start = $page - $side;
else
    $start = 1;
if ($page+$side < $total)
    $end = $page+$side+1;
else
    $end = $total;
if ($start > 1) {
    $left = $page-1;
    echo "<a href='".$_SERVER['PHP_SELF']."?showcat=".$showcat."&showforum=".$showforum."&showtopic=".$showtopic."&page=1' title='Первая страница'>&lt;&lt;&lt;</a>";
    echo "&nbsp;<a href='".$_SERVER['PHP_SELF']."?showcat=".$showcat."&showforum=".$showforum."&showtopic=".$showtopic."&page={$left}' title='Предыдущая страница'>&lt;</a>&nbsp;";
}
for ($i = $start; $i < $end; $i++)
    if ($i != $page) {
        echo "<a href='".$_SERVER['PHP_SELF']."?showcat=".$showcat."&showforum=".$showforum."&showtopic=".$showtopic."&page={$i}'>{$i}</a>&nbsp;";
        if ($i < $end - 1)
            echo "|&nbsp;";
    }
    else {
        echo "<strong>{$i}</strong>&nbsp;";
        if ($i < $end - 1) 
            echo "|&nbsp;";
    }
if ($end < $total) {
    $right = $page+1;
    echo "<a href='".$_SERVER['PHP_SELF']."?showcat=".$showcat."&showforum=".$showforum."&showtopic=".$showtopic."&page={$right}' title='Следующая страница'>&gt;</a>&nbsp;";
    echo "<a href='".$_SERVER['PHP_SELF']."?showcat=".$showcat."&showforum=".$showforum."&showtopic=".$showtopic."&page={$total}' title='Последняя страница'>&gt;&gt;&gt;</a>";
}



Попробуй..  Если не будет работать, значит я что-то недосмотрел и забыл взять из твоего кода.

Автор: Shark 21.5.2009, 02:04
Photon, та же самая ошибка... что с твоими изменениями, что без них

Автор: Photon 23.5.2009, 04:58
Та же самая - это какая?

Автор: Shark 23.5.2009, 16:09
Цитата

Notice: Undefined variable: page2left in *** on line 197
Notice: Undefined variable: pervpage in *** on line 197
Notice: Undefined variable: page1left in *** on line 197
эта

Автор: NLspieler 23.5.2009, 19:35
У меня почему то никогда не возникало подобных проблем. 
Наверное сервер настроен так, что не существующие переменные воспринемает как пустое значение.

Например если написать такой скрипт.

Код

<?php

echo 'Hallo' . $var ;

?>


То результатом будет просто Hallo. Думал, что так и должно быть и даже использовал это свойство. Теперь вот появились сомнения...

Автор: enof 23.5.2009, 20:06
Значит E_NOTICE не включен в вывод ошибок. И причем здесь сервер? smile 

Автор: NLspieler 23.5.2009, 20:22
enof , а это может быть черевато какими либо последствиями?

Автор: enof 23.5.2009, 20:31
Это просто предупреждение, что юзается неопределенная переменная. Предупреждение может натолкнуть на некоторые мысли, что где-то косяк. Если нужно пустое значение, которое может измениться, а может и нет, то я делаю примерно так:
Код

$var = '';

По крайней мере мне так удобнее, чем юзать что-то неопределенное. Ну и не валятся нотайсы.

Автор: Shark 23.5.2009, 22:25
NLspieler, 
Цитата

<?php

echo 'Hallo' . $var ;

?>

прежде чем, написать это сообщение, я попробовал тоже самое.... это тут не причем!

enof, 
Код

 $var = ''; 

а что делать если переменная может существовать и может не существовать!!!???т.е. именно тут?
Код

    echo  $pervpage . $page2left . $page1left . "<b>" . $page . "</b>" . $page1right . $page2right . $nextpage ;

если у меня открыта первая страница.. появляется ошибка!!! а если 3-я.. то ошибки нет!
ошибка все таже!.. неизвестная переменная!

Автор: enof 23.5.2009, 22:41
Она должна существовать, определите ее и все, в чем проблема?

Добавлено через 17 секунд
Цитата(Shark @  23.5.2009,  23:25 Найти цитируемый пост)
ошибка

это не ошибка

Добавлено через 41 секунду
Цитата(Shark @  23.5.2009,  23:25 Найти цитируемый пост)
!!!???

Цитата(Shark @  23.5.2009,  23:25 Найти цитируемый пост)
!!!

 smile  smile 

Автор: Shark 23.5.2009, 23:13
а как?

Автор: enof 24.5.2009, 00:53
А есть еще какой-то способ?
Код

$var = '';

Цитата(Shark @  23.5.2009,  23:25 Найти цитируемый пост)
а что делать если переменная может существовать и может не существовать

Переменная используется, но при этом может и не существовать, не логично как-то получается. Не стоит зацикливаться на этом.

Автор: Shark 24.5.2009, 02:11
enof, ты хочешь сказать, что так надо писать:
Код

    echo  if($pervpage >= 0)
              { 
                  echo "";
                }
??? это же бред

Автор: unicross 24.5.2009, 02:22
Цитата(Shark @  24.5.2009,  02:11 Найти цитируемый пост)
enof, ты хочешь сказать, что так надо писать:

Shark, неужеле так сложно объявить переменные в начале скрипта?
Код

$page2left = '';
$pervpage = '';
$page1left = '';

Автор: enof 24.5.2009, 03:13
Цитата(Shark @  24.5.2009,  03:11 Найти цитируемый пост)
ты хочешь сказать, что так надо писать

это ты откуда такое придумал? я этого не говорил. К тому же этот кусок кода тоже будет нотайс выдавать.

Автор: Photon 25.5.2009, 06:02
Shark, где в том, что я написал, переменные $page2left, $pervpage и $page1left?

Если они у тебя где-то дальше используются, то это значит только то, что ты не весь код показал здесь..

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