ďťż

[php]Błąd sesji

       

Podstrony


telcocafe

Witam!

Mam pewien dziwny problem. Otóż skrypt na dodawanie newsów na stronę chodzi w PHP i jest zorganizowany tak, że jest index.php i w nim jest nagłówek, później wklejane są podstrony (znana z parametru $_GET) i stopka. Na początku daję session_start(); i na stronie dodawania newsów taki skrypt:
if(!isset($_SESSION['zalogowany'])) if (isset($_POST['haslo']) && $_POST['haslo']=='hasło') $_SESSION['zalogowany']=true; if (!isset($_SESSION['zalogowany']) || $_SESSION['zalogowany']==false) { include('logowanie.php'); return; } if (isset($_POST['autor'])) { //wklejamy } else { //(...)czyścimy resztę } ?> <h5>Dodaj nowy nius</h5><hr /> <!-- tu formularz -->

Skrypt trochę skróciłem ale to chyba nie ma znaczenia większego.

W logowanie.php jest normalny formularz, który jest przesyłany do index.php?pokaz=aktualnosci_dodaj. I tu się pojawia problem. Pomimo tego, że jestem zalogowany, skrypt po kliknięciu na submit wyświetla stronę z logowaniem.
O co chodzi?
Spodziewam się że to sesje są winne ale nie widzę żadnego błędu.

Bardzo proszę o pomoc.



Za każdym razem (na każdej stronie) musisz uruchomić sesję (session_start()).

Albo zmienić odpowiednie ustawienie w php.ini

Nie wiem czy mnie do końca zrozumieliście. Mam index.php z mniej więcej takim kodem(niepotrzebne usunąłem):
<?php session_start(); //(...) ?> <html> <!-- tu nagłówek i początek body --> <!-- i w odpowiednim miejscu --> <?php $pokaz = $_GET['pokaz']; if (file_exists($pokaz.'.php') && in_array($pokaz, $dozwolone)) $pokaz.='.php'; else $pokaz='inne/'.$pokaz.'.php'; if (file_exists($pokaz)) include($pokaz); else info('Nie znaleziono strony.','blad'); ?> <!-- i reszta index.php --> </html>

i w miejscu gdzie jest include wklejana jest strona, w tym wypadku aktualnosci_dodaj.php.

Skrócony kod aktualnosci_dodaj.php zamieściłem wcześniej.

Czy w aktualnosci_dodaj.php też mam wywoływać session_start()? Dawno nie pracowałem z PHP ale z tego co pamiętam tą funkcję można tylko raz, na początku pliku umieścić, zanim nagłówek się wyśle.




Czy w aktualnosci_dodaj.php też mam wywoływać session_start()?
To było pytanie retoryczne? :P Umieszczaj session_start() tylko raz w pliku index.php

Na pewno print_r($_SESSION) wyświetla to, co należy? Bo przedstawiony skrypt jest poprawny. Może gdzieś w pliku zmieniasz wartość sesyjną?


Na pewno print_r($_SESSION) wyświetla to, co należy? Bo przedstawiony skrypt jest poprawny. Może gdzieś w pliku zmieniasz wartość sesyjną?

Więc tak: przy pierwszym wejściu print_r($_SESSION) wskazuje na Array ( ) , co chyba jest poprawne, gdyż jeszcze nic nie zapisywałem. Przy wejściu do formularza(czyli po logowaniu) jest Array ( ) Array ( [zalogowany] => 1 ). print_r($_SESSION) wywołuje dwa razy - na samym początku aktualnosci_dodaj.php i po sprawdzeniu poprawności danych. I dalej wyświetla się (po submicie) strona logowania, znów sam zapis Array ( ).


To było pytanie retoryczne? tongue.gif Umieszczaj session_start() tylko raz w pliku index.php
No jasne :) Przecież mówiłem że to chyba źle będzie :D
Użytkownik Tomek92 edytował ten post 11 kwiecień 2008, 18:38
Za mało danych. Niepełny kod. Twój serwer? Jaki czas przechowywania sesji? Próbowałeś jeszcze tak: po zalogowaniu odświeżyć stronę i sprawdzić wartość sesji? Bez pełnego kodu nie da rady odnaleźć błędu.
// Edytowano
Błąd jest w oprogramowaniu, skoro tutaj go nie ma. Czy w każdej przeglądarce tak się dzieje? Włącz raportowanie błędów, może coś się wyświetli?
Użytkownik andrzej_aa edytował ten post 11 kwiecień 2008, 21:02

Za mało danych. Niepełny kod. Twój serwer? Jaki czas przechowywania sesji? Próbowałeś jeszcze tak: po zalogowaniu odświeżyć stronę i sprawdzić wartość sesji? Bez pełnego kodu nie da rady odnaleźć błędu.

Po odświeżeniu wszystko jest ok.

Oto kod(index.php, kiedyś podobny był w książeczce KŚ):
<?php error_reporting(0); session_start(); echo '<?xml version="1.0" encoding="UTF-8" ?>'; echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'; ?> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body style="filter: progid:DXImageTransform.Microsoft.Gradient(startColorStr='#00FFCC', endColorStr='#FFFFFF', gradientType='0')" > <center> <div class="main"> <table class="main"> <tr> <td colspan="3" class="header"><? include_once("sites/header.php") ?></td> </tr> <tr> <td colspan="3" class="motto"><? include_once("sites/menu-poziome.php") ?></td> </tr> <tr> <td class="panel-left"> <?php include_once ("sites/panel-left.php") ; ?></td> <td class="body"> <?php /**Klasy i funkcje */ include('system/define.php'); include('system/functions.php'); /** Połączenie z bazą danych */ $link = mysql_connect(DB_HOST,DB_USER, DB_PASSWD) or die ('Nie można nawiązać połączenia z bazą danych.'); mysql_select_db(DB_NAME); /**Jaki plik wybrać: */ $dozwolone=array('aktualnosci','aktualnosci_dodaj','ksiega','ksiega_dodaj' ,'mapa','szukaj','galeria','administracja','administracja_galeria' ,'administracja_news'); if (isset($_GET['pokaz'])) $pokaz=$_GET['pokaz']; else $pokaz=$dozwolone[0]; if (isset($_POST['pokaz'])) $pokaz=$_POST['pokaz']; if (strpos($pokaz,'.')!==false) $pokaz=$dozwolone[0]; if (file_exists($pokaz.'.php') && in_array($pokaz,$dozwolone)) $pokaz.='.php'; else $pokaz='inne/'.$pokaz.'.php'; //--------------------------------------------- if (file_exists($pokaz)) include($pokaz); else info('Nie znaleziono strony.','blad'); ?> </td> <td class="panel-right"> <? include_once ("sites/panel-right.php") ; ?></td> </tr> <tr> <td colspan="3" class="foot"><? include_once("sites/foot.php") ?></td> </tr> </table> </div> </center> </body> </html> <? mysql_close($link); ?>

aktualnosci_dodaj.php

<?php print_r($_SESSION); if(!isset($_SESSION['zalogowany'])){ if (isset($_POST['haslo']) && $_POST['haslo']=='hasło') $_SESSION['zalogowany']=true; if (!isset($_SESSION['zalogowany']) || $_SESSION['zalogowany']==false) { include('logowanie.php'); return; } } print_r($_SESSION); if (isset($_POST['autor'])) { //dostosowujemy wszystkie pola $_POST['autor']=konwertuj($_POST['autor']); $_POST['tytul']=konwertuj($_POST['tytul']); $_POST['tresc']=konwertuj($_POST['tresc']); $_POST['zrodlo']=konwertuj($_POST['zrodlo']); //kontrolujemy poprawność $blad=''; //tu kontrola, zapis błędów w $blad if ($blad!='') info($blad,'blad'); else { //dodajemy do tabeli //tu MySQL info('Twój news został zapisany.','ok'); include('aktualnosci.php'); return; } } else { $_POST['autor']=''; $_POST['tresc']=''; $_POST['tytul']=''; $_POST['zrodlo']=''; } ?> <h5>Dodaj nowy nius</h5><hr /> <form action="index.php" method="post"> <input type="hidden" name="pokaz" value="aktualnosci_dodaj" /> <table border="0"> <tr><td>Tytuł:</td><td><input size="30" type="text" name="tytul" value="<?php echo $_POST['tytul']; ?>" /></td></tr> <tr><td>Treść:</td><td><textarea cols="40" rows="5" name="tresc"><?php echo $_POST['tresc']; ?></textarea></td></tr> <tr><td>Źródło:</td><td><input size="30" type="text" name="zrodlo" value="<?php echo $_POST['zrodlo']; ?>" /></td></tr> <tr><td>Autor:</td><td><input size="30" type="text" name="autor" value="<?php echo $_POST['autor']; ?>" /></td></tr> <tr><td></td><td><input type="submit" value="Dodaj nowy nius" /></td></tr> </table> </form>

i logowanie.php:

<h1>Logowanie<hr /></h1> <?php if (isset($_POST['haslo'])) info('Podano złe hasło!','blad'); ?> <form action="index.php" method="POST"> <input type="hidden" name="pokaz" value="aktualnosci_dodaj" /> <table border="0"> <tr><td>Proszę podać hasło:</td><td><input size="30" type="password" name="haslo" value="" /></td></tr> <tr><td></td><td><input type="submit" value="Zaloguj" /></td></tr> </table> </form>

Na kompie mam WebServ, docelowy to nazwa.pl

Solved :)
http://nazwa.pl/pomo...HP5-i-PHP4.html
Tu znalazłem, że sessions.use_trans_sid jest wyłączony i stąd zmiana zachowania po przejściu na PHP5.
Użytkownik Tomek92 edytował ten post 12 kwiecień 2008, 18:45
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.