Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Undefined index
Forum PHP.pl > Forum > Przedszkole
bigbadcompany
Witam,

po dłuższym grzebaniu znowu się poddałem i chciałbym zasięgnąć Waszej opinii (może jakieś rady).
W panelu admina zaczęło mi pluć tymi notice'ami na potęgę z jednymi sobie poradziłem z drugimi jest
trochę gorzej.

Błąd o treści takiej jak w temacie. Odnosi się do linijki 1050 której zlepek zamieszczam poniżej.
Mianowicie if($_GET['akcja']=='nowy' && $_POST['tytul'])

  1. case 'artykuly':
  2. // konfiguracja tematow
  3. if($_GET['akcja']=='nowy' && $_POST['tytul'])
  4. {
  5. $_POST['tytul']=trim($_POST['tytul']);
  6. $_POST['skrot']=trim($_POST['skrot']);
  7. $_POST['opis']=trim($_POST['opis']);
  8. $_POST['dodal']=trim($_POST['dodal']);
  9. $_POST['data']=trim($_POST['data']);
  10. $_POST['tag1']=trim($_POST['tag1']);
  11. $_POST['tag2']=trim($_POST['tag2']);
  12. $_POST['tag3']=trim($_POST['tag3']);
  13. $_POST['kategoria']=trim($_POST['kategoria']);
  14.  
  15. if(strlen(trim($_POST['tytul']))>5)
  16. {
  17. mysql_query("INSERT INTO `artykuly` (`id`, `tytul`, `skrot`, `opis`, `dodal`, `data`, `tag1`, `tag2`, `tag3`, `id_kat`, `aktywny`, `seo_url`) VALUES (NULL, '".$_POST['tytul']."', '".$_POST['skrot']."', '".$_POST['opis']."', '".$_POST['dodal']."', NOW(), '".$_POST['tag1']."', '".$_POST['tag2']."', '".$_POST['tag3']."', '".$_POST['kategoria']."', '1', '".stringToLink($_POST['tytul'])."')");
  18. header("location: index.php?s=artykuly&ok=1");
  19. }
  20. else header("location: index.php?s=artykuly&err=2");
  21. }


Celem zabiegów jest pozbycie się noticów w ogóle i nie interesują mnie półśrodki typu "poprawić php.ini" smile.gif
Jakieś pomysły ?
peter13135
Ogólnie mówiąc, błąd undefined index/variable jest wtedy, gdy chcesz odczytać jakiś element tablicy/zmienną która nie istnieje.

Dlatego takie sprawdzanie :
  1. if($_GET['foo']=='bar')
  2. {
  3.  
  4. }

Albo przypisywanie :
  1. $foo = $_GET['foo'];


W momencie kiedy $_GET['foo'] nie istnieje, powoduje właśnie ten komunikat.

Dlatego, zanim będziesz porównywał jakieś zmienne, czy cokolwiek z nimi robił, upewnij się, czy one istnieją. A możesz to zrobić za pomocą np. funkcji isset().
Isset zwraca true, jeśli zmienna jest zdefiniowana, false jeśli niezdefiniowana.


Przykład :

Zamiast pisać

  1. if($_GET['akcja']=='nowy' )

napisz:
  1. if(isset($_GET['akcja']) && $_GET['akcja']=='nowy' )


Ponieważ tu jest koniunkcja w warunku, to jeśli isset($_GET['akcja']) zwróci false, to następna część warunku nie będzie w ogóle sprawdzana.

Następna sprawa, nie używaj takiego czegoś jak
  1. if($_GET['cośtam'])
  2. {}


bo zdaje się, że nie do końca wiesz co to oznacza.

jeśli $_GET['cośtam'] będzie miało wartość "0lalala". To cały warunek nie będzie spełniony.
Tutaj uzyj funkcji empty()
PanGuzol
Cytat(peter13135 @ 4.09.2012, 13:01:56 ) *
  1. if($_GET['cośtam'])
  2. {}


bo zdaje się, że nie do końca wiesz co to oznacza.

jeśli $_GET['cośtam'] będzie miało wartość "0lalala". To cały warunek nie będzie spełniony.
Tutaj uzyj funkcji empty()


Warunek będzie spełniony. PHP zamieni "0lalala" w boolean co przy stringach innych niż pusty lub "0" daje prawdę, ale zgadzam się iż lepiej skorzystać z empty.
bigbadcompany
Faktycznie pomogło. Jednak nie rozumiem jeszcze jednego notice'a. Problem jest taki, że w podglądzie na podstronie z dodawaniem nowych artykułów lista tematów się wyświetla. Jak wejdę w edycję to już pluje błędem. Szczerze nie wiem gdzie szukać. Gdzieś trzeba ten warunek udowodnić. Jak wstawiam go po if(isset($_GET['id']) && $_GET['akcja']=='edytuj') to nie mogę w ogóle edytować danego artykułu. Nie pobiera mi nic z bazy. Treść komunikatu jest taka o jakiej wcześniej wspomniałeś czyli Notice: Undefined variable: lista_tematow in C:\xampp\htdocs\admin\index.php on line 1265. Linia ta wygląda tak '; (zakończenie linii). W przeklejonym kodzie linia 141


  1. // pokaz formularz edycji danego artykulu
  2. if(isset($_GET['id']) && $_GET['akcja']=='edytuj')
  3. {
  4. $artykul_id=$_GET['id'];
  5. $sq_kat='select * from `kategorie_a`';
  6. $sql_kat=mysql_query($sq_kat);
  7. $lista_kategorii='Edycja artykułu';
  8. $lista_kategorii.='
  9. <form name="artykuly" method="post" action="index.php?s=artykuly&akcja=zapisz&id='.$artykul_id.'">
  10. <table>
  11. <tr>
  12. <th colspan="3">Nowy artykuł</th>
  13. </tr>
  14. <tr>
  15. <td>Tytul: </td><td><a href="" class="help" rel="dymek_news1">[?]</a></td><td><input type="text" name="tytul" value="'.$artykul_tytul[$artykul_id].'" class="bdlugi"/></td>
  16. </tr>
  17. <tr>
  18. <td>Krótka treść: </td><td><a href="" class="help" rel="dymek_news2">[?]</a></td><td><textarea style="height:100px" name="skrot" class="bdlugi">'.$artykul_skrot[$artykul_id].'</textarea></td>
  19. </tr>
  20.  
  21. <tr>
  22. <td>Długa treść: </td><td><a href="" class="help" rel="dymek_news3">[?]</a></td><td><textarea style="height:400px" name="opis" class="bdlugi">'.$artykul_opis[$artykul_id].'</textarea></td>
  23. </tr>
  24.  
  25. <tr>
  26. <td>Tag 1: </td><td><a href="" class="help" rel="dymek_news3">[?]</a></td><td><input type="text" name="tag1" value="'.$artykul_tag1[$artykul_id].'" class="bdlugi"/></td>
  27. </tr>
  28.  
  29. <tr>
  30. <td>Tag 2: </td><td><a href="" class="help" rel="dymek_news3">[?]</a></td><td><input type="text" name="tag2" value="'.$artykul_tag2[$artykul_id].'" class="bdlugi"/></td>
  31. </tr>
  32.  
  33. <tr>
  34. <td>Tag 3: </td><td><a href="" class="help" rel="dymek_news3">[?]</a></td><td><input type="text" name="tag3" value="'.$artykul_tag3[$artykul_id].'" class="bdlugi"/></td>
  35. </tr>
  36.  
  37. <tr>
  38. <td>Autor: </td><td><a href="" class="help" rel="dymek_news3">[?]</a></td><td><input type="text" name="dodal" value="'.$artykul_dodal[$artykul_id].'" class="bdlugi"/></td>
  39. </tr>
  40.  
  41. <tr>
  42. <td>Link: </td><td><a href="" class="help" rel="dymek_news3">[?]</a></td><td><input type="text" name="url" value="'.$artykul_url[$artykul_id].'" class="bdlugi"/></td>
  43. </tr>
  44.  
  45. <tr>
  46. <td>Kategoria: </td><td><a href="" class="help" rel="dymek_news4">[?]</a></td><td>
  47.  
  48. <select name="kategoria">
  49. ';
  50.  
  51. while($kat=mysql_fetch_assoc($sql_kat))
  52. {
  53. //$selected='';
  54. $id_kat=$kat['catt_id'];
  55. $tab_kat[$id_kat]=$kat['catt_name'];
  56. $kat['catt_id']==$artykul_kategoria[$artykul_id] ? $selected='selected' : $selected='';
  57. $lista_kategorii.='<option value='.$kat['catt_id'].' '.$selected.'>'.$kat['catt_name'].'</option>';
  58. }
  59. $lista_kategorii.='</select></td>
  60. </tr>
  61. <tr>
  62. <td colspan="2"></td><td><input type="submit" value="zapisz artykuł" /><a href="" class="help" rel="dymek_news6">[?]</a></td>
  63. </tr>
  64. </table>
  65. </form>';
  66.  
  67. }
  68.  
  69. else
  70. {
  71. //listuj kategorie tematow
  72. $sq_kat='select * from `kategorie_a`';
  73. $sql_kat=mysql_query($sq_kat);
  74. $lista_kategorii='
  75. <form name="artykuly" method="post" action="index.php?s=artykuly&akcja=nowy">
  76. <table>
  77. <tr>
  78. <th colspan="3">Nowy artykuł</th>
  79. </tr>
  80. <tr>
  81. <td>Tytuł: </td><td><a href="" class="help" rel="dymek_news1">[?]</a></td><td><input type="text" name="tytul" class="bdlugi"/></td>
  82. </tr>
  83.  
  84. <tr>
  85. <td>Krótka treść: </td><td><a href="" class="help" rel="dymek_news2">[?]</a></td><td><textarea style="height:100px" name="skrot" class="bdlugi"></textarea></td>
  86. </tr>
  87.  
  88. <tr>
  89. <td>Długa treść: </td><td><a href="" class="help" rel="dymek_news3">[?]</a></td><td><textarea style="height:200px" name="opis" class="bdlugi"></textarea></td>
  90. </tr>
  91.  
  92. <tr>
  93. <td>Autor: </td><td><a href="" class="help" rel="dymek_news3">[?]</a></td><td><input type="text" name="dodal" class="bdlugi"/></td>
  94. </tr>
  95.  
  96. <tr>
  97. <td>Tag 1: </td><td><a href="" class="help" rel="dymek_news3">[?]</a></td><td><input type="text" name="tag1" class="bdlugi"/></td>
  98. </tr>
  99.  
  100. <tr>
  101. <td>Tag 2: </td><td><a href="" class="help" rel="dymek_news3">[?]</a></td><td><input type="text" name="tag2" class="bdlugi"/></td>
  102. </tr>
  103.  
  104. <tr>
  105. <td>Tag 3: </td><td><a href="" class="help" rel="dymek_news3">[?]</a></td><td><input type="text" name="tag3" class="bdlugi"/></td>
  106. </tr>
  107.  
  108. <tr>
  109. <td>Podstrona: </td><td><a href="" class="help" rel="dymek_news4">[?]</a></td><td>
  110.  
  111. <select name="kategoria">
  112. ';
  113.  
  114. while($kat=mysql_fetch_assoc($sql_kat))
  115. {
  116. $id_kat=$kat['catt_id'];
  117. $tab_kat[$id_kat]=$kat['catt_name'];
  118. $lista_kategorii.='<option value='.$kat['catt_id'].'>'.$kat['catt_name'].'</option>';
  119. }
  120.  
  121. $lista_kategorii.='</select></td>
  122. </tr>
  123. <tr>
  124. <td colspan="2"></td><td><input type="submit" value="dodaj artykuł" /><a href="" class="help" rel="dymek_news5">[?]</a></td>
  125. </tr>
  126. </table>
  127. </form>';
  128.  
  129. $lista_tematow.='
  130. <div class="odstep"></div>
  131. <table border=0>
  132. <tr><th colspan="5" style="width:100%;padding-bottom:10px">Opublikowane artykuły (edytuj, aby przeczytać cały tekst danego artykułu)</th></tr>
  133. <tr>
  134. <th class="sredni">Tytuł</th>
  135. <th class="krotki">Krótka treść</th>
  136. <th class="sredni">Długa treść</th>
  137. <th class="kto">Autor</th>
  138. <th class="krotki">Podstrona</th>
  139. <th class="mini">Opcje</th>
  140. </tr>
  141. ';
  142. $w=0;
  143. foreach($artykul_tytul as $nr => $art)
  144. {
  145. $bg='171717';
  146. $w++;
  147. if($w==2) {$w=0;}
  148. elseif($w==1){$bg='#222';}
  149.  
  150. $kat_nazwa=$artykul_kategoria[$nr];
  151. $lista_tematow.='
  152. <tr>
  153. <td style="padding:0 5px;border-bottom:solid 0px silver;background:'.$bg.'" class="mini_font">'.substr(htmlspecialchars($artykul_tytul[$nr]),0,255).'</td>
  154. <td style="padding:0 5px;border-bottom:solid 0px silver;background:'.$bg.'" class="mini_font">'.substr(htmlspecialchars($artykul_skrot[$nr]),0,50).'</td>
  155. <td style="padding:0 5px;border-bottom:solid 0px silver;background:'.$bg.'" class="mini_font">'.substr(htmlspecialchars($artykul_opis[$nr]),0,50).'</td>
  156. <td style="padding:0 5px;border-bottom:solid 0px silver;background:'.$bg.'" class="mini_font">'.substr(htmlspecialchars($artykul_dodal[$nr]),0,50).'</td>
  157. <td style="padding:0 5px;border-bottom:solid 0px silver;background:'.$bg.'" class="mini_font">'.$tab_kat[$artykul_kategoria[$nr]].'</td>
  158. <td style="border-bottom:solid 0px silver;text-align:center;background:'.$bg.'"><div style="padding-bottom:5px">[<a href="index.php?s=artykuly&akcja=edytuj&id='.$artykul_id[$nr].'">edytuj</a>]</div>
  159. <div style="padding-bottom:5px">[<a href="index.php?s=artykuly&akcja=usun&id='.$artykul_id[$nr].'" style="color:#C00">usuń</a>]</a></div>
  160. </td>
  161. </tr>';
  162. }
  163. $lista_tematow.='</table>';
  164. }
  165.  
  166. if(DEBUG)
  167. {
  168. debuguj($artykul_kategoria);
  169. debuguj($tab_kat);
  170. debuguj($_POST);
  171. }
  172. echo $header;
  173. include("inc/top.inc.php");
  174. include("inc/tip_info.inc.php");
  175. if(!empty($blad_txt)) echo $blad_txt;
  176. echo '<tr>
  177. <td bgcolor="#3D5883">
  178. <font face="Tahoma" color="#FFFFFF" size="4">Artykuły</font></td>
  179. </tr>';
  180. if(isset($_GET['err']) && $_GET['err']>0) tipError($tip_temat[$_GET['err']]);
  181. if(isset($_GET['ok']) && $_GET['ok']>0) tipInfo($tip_temat[$_GET['ok']]);
  182. echo $lista_kategorii;
  183. echo $lista_tematow;
  184. break;
PanGuzol
Przy pierwszym wykonaniu pętli zmienna $lista_tematow nie istnieje a operator .= wpierw musi pobrać jej wartość aby móc dopisać do niej nową wartość. Innymi słowy wpierw próbuje pobrać zmienną która nie istnieje i masz notice. W tym przypadku musisz zadeklarować zmienną przed pętlą jako pusty string czyli po prostu $lista_tematow = ""; zaraz przed while.
bigbadcompany
Okej tamtego błędu nie ma już. Jednak listy w edycji nadal nie wyświetla. Notice: Undefined variable: lista_tematow in C:\xampp\htdocs\admin\index.php on line 1307 próbuje zgonić na wywołanie echo $lista_tematow;

Zastanawiam się też czemu wcześniej tych błędów nie wyświetlało. Tylko po aktualizacji php. Config się raczej nie zmienił.
PanGuzol
Źle policzyłem nawiasy wcześniej. zmienną $lista_tematow musisz zdefiniować na początku przed if nie przed while.
Listę tą wypełniasz w else więc jeśli warunek jest spełniony to lista tematów będzie pusta.

Inna konfiguracja dla error_reporting.
Wiele osób ignoruje błędy notice, takie aplikacje wciąż będą działać ale moim skromnym zdaniem lepiej pozbyć się jakichkolwiek błędów.
bigbadcompany
Wszystkie notice'y znikają ale wraz z nimi lista tematów w edycji smile.gif
PanGuzol
Czy korzystasz ze zmiennej $lista_tematow w innym miejscu w kodzie poza tym fragmentem który tutaj udostępniłeś?
bigbadcompany
Tak, ale to już inny case. Poza tym po wyrzuceniu tamtego kodu wspomniane wcześniej zabiegi nie pomagają. Jeśli chcesz mogę na mejla wysłać wszystko co mam w pliku index admina. Jak masz czas rzuciłbyś swoim wnikliwym okiem na to. Nie jest to jakiś majstersztyk ale nadal nad tym pracuję.
PanGuzol
Dla długich fragmentów lepiej skorzystać z http://pastebin.com/ lub podobnych serwisów.

Rozumiem, że tematy wyświetlały się zanim pozbyłeś się noticów?
bigbadcompany
Napiszę szczerze, że wcześniej już nie mogłem z tym do ładu dojść tylko po aktualizacji zaczęły błędy wyskakiwać co mnie trochę bardziej zmotywowało do działania.

Serwisu nie znałem przyda się z całą pewnością.
PanGuzol
Mi się wydaje, że trochę namieszałeś z warunkami.

Uporządkuj sobie kod poprzez odpowiednie wcięcia w kodzie tj każdy nowy blok kodu ma jeden więcej tabulator na początku każdej linii. Teraz masz pomieszane czasami robisz wcięcia a czasami nie oraz w przypadku dłuższych bloków pisz komentarze przy zamykających i opcjonalnie również otwierających klamrach abyś mógł łatwo określić gdzie się zaczyna a gdzie kończy(if, pętla, funkcja) bez niepotrzebnego liczenia.
bigbadcompany
Wiesz co w sumie masz rację. Najpierw to uporządkuję a dopiero później zacznę rzucać luźne uwagi bo tak szukamy po omacku a nie ma sensu żebyś tracił cenny czas. Mimo to dziękuję bo bardzo dużo pomogłeś. Pozdrawiam i życzę miłego wieczoru smile.gif
peter13135
Cytat(PanGuzol @ 4.09.2012, 15:42:26 ) *
Warunek będzie spełniony. PHP zamieni "0lalala" w boolean co przy stringach innych niż pusty lub "0" daje prawdę, ale zgadzam się iż lepiej skorzystać z empty.


Faktycznie, myślałem, że dotyczy to wszystkich stringów zaczynających się na 0, ale się myliłem. Dzięki za poprawienie wink.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.