qwerty93
2.08.2010, 23:22:25
Witam, mam problem. Otóż nie wiem jak wyświetlić komunikat po przekierowaniu header("Location:"), na przykład po udanym zalogowaniu czy też dodaniu rekordu do bazy danych.
Z góry dzięki za pomoc.
Może javascriptowy alert?
everth
2.08.2010, 23:39:38
Może tak:
echo "<div class='msgBox'>Sukces!</div>"; }
// A w headerze (jeśli sukces)
$query = (stripos($twoj_url,'?')===FALSE) ? "?s":"&s";
header("Location: ".$twoj_url.$query);
thomson89
2.08.2010, 23:45:52
Ja, mam swoją stronę opartą na klasie szablon. Gdy występuje error, to ustawiam w sesji typ błędu i typ treści oraz treść. Mogę sobie dowolnie wybrać: albo wyświetlę komunikat ze standardowych albo jakiś własny. Zaraz po ustawieniu sesji, przesyłam użytkownika na inną stronę.
Tam mam diva, który się chowa po jakimś czasie. Oczywiście, w PHP najpierw nasłuchuje czy w sesji coś jest i nakazuje klasie która odpowiada za wygląd strony stworzenie diva, o id #schowaj według wytycznych z sesji. Div się pokazuje, a osobny plik JS (jQuery) nasłuchuje czy nie ma diva #schowaj i go chowa po jakimś czasie.
Tobie, też polecam taki system, ale prostszy. Przed headerem do sesji wstaw se treść błędu. Potem, zaraz nad treścią strony, umieść diva do którego za pomocą PHP wstawisz treść błędu z sesji.
Proste? Myślę że tak.
PS. Nie zapomnij o czyszczeniu zmiennej sesji tego błędu
Są tylko 2 metody:
1) Przesyłasz komunikat w GET
2) Przesyłasz komunikat w SESSION
Wygodniejsze jest to drugie, a i adres wygląda ładniej oraz trudniej to zmanipulować. Jak wspomniał thomson89, przed header ustawiasz komunikat w sesji i na stronach sprawdzasz czy cokolwiek w sesji siedzi jako komunikat. Jeśli tak to wyświetlasz go i usuwasz z sesji. Dzięki temu masz komunikat jednorazowy.
qwerty93
3.08.2010, 08:17:40
Właśnie chciałem zrobić to na sesjach, ale w tym problem, że ten komunikat jest ciągle, nie znika. Thek, spróbuję tak jak mówisz.
Nie znika, bo go z sesji nie usuwasz. Już na forum tutaj kiedyś wrzuciłem taki prosty szablon jak to zrobić wraz z kodem.
Ogólnie idea jest taka:
1. Masz tablicę komunikatów $_SESSION['communication'] = array()
2. Tam gdzie trzeba wrzucasz komunikat w stylu $_SESSION['communication'][] = array( 'typ' => 'rodzaj', 'tresc' => 'tresc komunikatu' ); gdzie typ to wartość z zestawu: OK (komunikat potwierdzający), ER (komunikat błędu), IN (komunikat informujący).
3. Robisz przekierowanie
4. Sprawdzasz na nowej stronie zmienną $_SESSION['communication'] czy coś zawiera (funkcja count). Jeśli tak odczytujesz i wrzucasz na ekran
5. Robisz czyszczenie tej tablicy (najszybciej poprzez zamazanie/nadpisanie pustą), choćby poprzez $_SESSION['communication'] = array();
EDIT: Oczywiście nie musisz robić typu, tylko od razu walnąć treść komunikatu, jednak tracisz wtedy informację czy masz do czynienia z błędem, informacją czy może tylko potwierdzeniem, że wszystko zaszło prawidłowo.
qwerty93
3.08.2010, 22:00:01
Zrobiłem to tak, że po udanej aktualizacji rekordu tworzę $_SESSION['info']['ok'] = 'Dane zostały poprawnie zaktualizowane.';
Następnie wyświetlam $_SESSION['info']['ok'], ale po odświeżeniu ona dalej jest, więc spróbowałem wykorzystać unset();, ale wtedy nic się nie wyświetla.
Cytat(qwerty93 @ 3.08.2010, 23:00:01 )

Następnie wyświetlam $_SESSION['info']['ok'],
a potem ją usuwasz - zaraz po wyświetleniu.
thomson89
3.08.2010, 23:09:11
Wystarczy, że zanim wyświetlisz komunikat sprawdzisz czy nie jest pusta.
if(!empty($_SESSION['info']['ok'])) {
//komunikat
$_SESSION['info']['ok'] = '';
}
A nie lepiej używać count( $_SESSION['info'] )?

Zwróci Ci w jakiej ilości pod zmienną są podpięte komunikaty. 0 = nic... Cokolwiek więcej - czeka komunikat. Potem tylko wyświetlasz wszystkie w pętli foreach i robisz $_SESSION['info'] = array(); Oczywiście w zależności od implementacji komunikatów może to inaczej wyglądać.
qwerty93
4.08.2010, 14:01:12
No nie daję rady, mam coś takiego i komunikat po przekierowaniu w ogóle się nie wyświetla. Wyrzucę $_SESSION['info']['ok'] = ''; - działa, ale komunikat jest cały czas.
if(count($_SESSION['info']['ok']) !== '0'){ echo $_SESSION['info']['ok']; $_SESSION['info']['ok'] = '';
}
A wiesz jaka jest różnica między != i !== oraz usunięciem zmiennej a jej wyczyszczeniem? Bo patrząc na kod nie wydaje mi się byś to rozróżniał. Nie bez powodu raz jest jeden = więcej, a raz nie. Inna sprawa, że nie wiem, czy w Twoim przypadku jest sens stosować count czy nie bo nie wiemy nawet JAK przenosisz komunikaty między stronami. Czy to tablica komunikatów, czy tablica konkatenowanych komunikatów czy może po prostu jeden długi string zawsze. Po prostu nie znamy implementacji tego. Napisz coś więcej to będziemy wiedzieć. Czy oprócz ['ok'] istnieje klucz ['error'] albo ['info'] i czy komunikaty do nich są dołączane jakoś czy nie. Co jeśli masz 2 lub 3 błędy? Sklejasz komunikaty czy tworzysz jakieś wielowymiarowe tablice bądź inny sposób masz na przerzucenie tego do sesji?
qwerty93
4.08.2010, 14:52:43
Mam formularz, załóżmy do edycji czegoś tam w bazie. Sprawdzam jego poprawność za pomocą if, jeżeli został poprawnie wypełniony, nadaję $_SESSION['info']['ok'] = 'dane zostaly zakutalizowane'; i przekierowuje poprzez header("Location:"). Następnie chcę, aby na nowej stronie wyświetlił się komunikat o zaktualizowaniu formularza, a po odświeżeniu żeby znikł.
W takim razie robisz ciut inaczej. Ustawiasz komunikat jaki tam chcesz, ale sprawdzenie i czyszczenie będzie inaczej realizowane:
if( !empty( $_SESSION['info']['ok'] ) ) { echo $_SESSION['info']['ok']; $_SESSION['info']['ok'] = '';
}
To Ci sprawdzi czy w zmiennej jest choćby jedna literka komunikatu. Można też użyć formy if( $_SESSION['info']['ok'] != '' )
Po prostu musisz wiedzieć z jakim formatem komunikatu działasz, jak go wykryć, obsłużyć i wyczyścić. Innymi słowy masz przed sobą jeszcze trochę nauki z operacjami na różnych typach danych.
qwerty93
4.08.2010, 21:52:08
Robię dokładnie to samo i nic, może pokażę, jak wygląda kod w całości.
if(isset($_POST['submit'])){ $uid = $_SESSION['user']['user_id'];
if(eregi("^(http://)w*.?w.w+.*$", $_POST['www']) or
ereg("^[0-9]+$",$_POST['gg_number'])){ $update_data = mysql_query("UPDATE users SET gg_number = '$_POST[gg_number]', site = '$_POST[www]' WHERE user_id='$uid'"); header('Location: /edit-profile.html'); $_SESSION['info']['ok'] = '<p class="box_true_nbg">Dane zostały poprawnie zmienione.</p>';
} else {
echo '<p class="box_fasle_nbg">Formularz został źle wypełniony.</p>'; }
}
if(!empty($_SESSION['info']['ok'])){ echo $_SESSION['info']['ok']; $_SESSION['info']['ok'] = '';
}
Przy takim kodzie, nie wyświetla żaden komunikat.
A od kiedy to się ustawia komunikaty ZA header. Jeszcze powiedz, że najpierw jedzenie jesz a dopiero potem myślisz, że należy je ugotować jednak
qwerty93
4.08.2010, 22:47:48
Dałem przed header i dalej to samo.
To teraz pytanie... Czy tam gdzie przekierowujesz jest funkcja odczytująca te dane z sesji? A może problem jest już przy eregi (to już zdeprecjonowana funkcja i ma wylecieć... użyj preg_match) ? naprawdę zdebuguj sobie co gdzie się dzieje, wyświetlaj zawartość sesji sobie, kontroluj przekierowania. Bez tego nie dojdziesz gdzie się rypie kod. Nie ma prawa nie działać taka konstrukcja:
$update_data = mysql_query("UPDATE users SET gg_number = '$_POST[gg_number]', site = '$_POST[www]' WHERE user_id='$uid'"); $_SESSION['info']['ok'] = '<p class="box_true_nbg">Dane zostały poprawnie zmienione.</p>';
header('Location: /edit-profile.html');
jeśli edit-profile.html jest tym samym plikiem. Inna sprawa, że nie wiem, ale maskujesz chyba rozszerzeniem html faktyczny php przez htaccess, bo normalnie pliki html nie obsługują kodu PHP.
qwerty93
5.08.2010, 15:21:17
Jest tym samym plikiem i tak, adres jest maskowany przez htaccess.
Na początek weź i zakomentuj header oraz zrób var_dump sesji. Inaczej nie dowiesz się czy ustawiłeś tą zmienną. Jeśli zmienna jest w porządku, to odkomentuj header i zrób znów dumpa sesji. Jednego przed wyświetlaniem komunikatu, a drugiego po nim. Dzięki temu zobaczysz gdzie się zmienne "gubią".
qwerty93
6.08.2010, 11:06:43
Ale mówiłeś, że jak to ten sam plik to nie ma prawa działać. Jak przekieruje do indexu i tam wyświetlę to działa.
Albo mnie już oczy mylą, albo napisałem "nie ma prawa nie działać", czyli inaczej "musi działać"

Inna sprawa... Skoro masz taką konstrukcję, to powiedz mi jedno... Czy jest sens robić przekierowanie? Tylko komunikat wyświetlasz i nic więcej. Możesz moim zdaniem olać przekierowanie. Wywal tego header z kodu i zobacz sam zresztą. Po co bowiem robić przekierowanie, które i tak nic nie robi poza przekierowaniem?

Zmienną z sesji i tak odczytasz, operacje wymagane zrobisz... na chwilę obecną masz diagram akcji:
1. Wypełnij formularz
2. Submit.
3. Obrabiaj dane.
4. Jeśli błędy wyświetl komunika i idź do 7
5. Jeśli ok rób update i ustaw w sesji komunikat
6. Przekieruj
7. Wyświetl formularz
A prościej jest usunąć punkt 6

On i tak nic nie zmienia a tylko przeładowanie powoduje niepotrzebne. Prześledź co robi skrypt a sam zauważysz, że tutaj akurat przekierowanie jest zbędne. Co innego gdybyś kierował na inną stronę, czyli choćby index. Ale jeśli na tą samą... wywal header
qwerty93
6.08.2010, 12:01:05
Ok, tak chyba zrobię. Dzięki za pomoc.
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.