Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Problem z ob_start i ob_end_flush();
Forum PHP.pl > Forum > Przedszkole
Kuscik
Witam

Zrobiłem stronę która wygląda mniej więcej tak

index.php
  1. //ob_start();
  2. include_once 'session.php';
  3. include_once 'navi/header.php';
  4. include_once 'navi/login.php';
  5. include_once 'navi/menu.php';
  6. include_once 'navi/search.php';
  7. include_once 'navi/logo.php';
  8. include_once 'navi/banner.php';
  9. include_once 'navi/contents.php';
  10. include_once 'navi/footer.php';
  11. //ob_end_flush();


login.php w uproszczeniu wygląda tak
  1. <JAKIS KOD>
  2. <div class="loginform" id="loginform">
  3.  
  4. <?php
  5. if (isset($_SESSION[id_u])) {
  6. echo 'jestes zalogowany';
  7. } else {
  8. if (isset($_POST['email'])) {
  9. $email = $_POST['email'];
  10. $email = strip_tags($email);
  11. }
  12. if (isset($_POST['pass'])) {
  13. $pass = $_POST['pass'];
  14. $pass = strip_tags($pass);
  15. }
  16. if (isset($_POST['pamietaj'])) {
  17. $pamietaj = $_POST['pamietaj'];
  18. $pamietaj = strip_tags($pamietaj);
  19. }
  20.  
  21. if (isset($email) && isset($pass) && strlen($email) > 0 && strlen($pass) > 0) {
  22. $isSprawdzLogowanieOK = sprawdzLogowanie($email, $pass);
  23. }
  24. if ($isSprawdzLogowanieOK) {
  25.  
  26. $id = getUserIdByEmail($email_u);
  27. $_SESSION['id_u'] = $id;
  28.  
  29. if ($pamietaj == 'tak') {
  30. $hash = 'xxx';
  31. setcookie('pamietaj', $id . ': ' . $hash, time() + 60 * 60 * 24 * 2);
  32. }
  33. header(' Location: index.php');
  34. } else {
  35. ?>
  36.  
  37. <form class="loguj" name="login" action="" method="POST">
  38. <p class="login">Email</p>
  39. <input name="email" class="login" id="login" type="text"/><br/>
  40. <p class="pass">Hasło</p>
  41. <input name="pass" class="pass" id="pass" type="password" /><br/>
  42. <input type="checkbox" name="pamietaj" class="pamietaj" value="tak" /></p>
  43. <p>Pamiętaj</p><br/>
  44.  
  45. <input name="submit" class="submit" id="submit" value="Loguj" type="submit"/>
  46. </form>
  47. <?php
  48. }
  49. }
  50. ?>
  51. </div>
  52. <JAKIS KOD>


Chodzi o to że jeśli przy logowaniu użytkownik zaznaczy checkbox to po zalogowaniu jest tworzone cookie a następnie strona jest przeładowywana przez header aby wyświetli ze jesteśmy już zalogowani , jednak przed setcookie oraz przez header było już coś wyświetlone na stronie wiec postanowiłem użyć ob_start(); i ob_end_flush();
wkleiłem go w indeksie tak jak jest teraz tylko nie zakomentowany i wszystko chodziło dobrze, ciastko się dodawało strona się prze kierunkowała, dodawały się i usuwały inne ciastka których już tu nie wymieniam, strona się przeładowywała po zalogowaniu, wszystko działało ok... zacząłem zajmować się tym co ma być dokładnie wyświetlone zamiast tekstu "jesteś zalogowany", chciałem się zalogować i sprawdzić czy wszystko ok... i nagle całkiem przestało działać logowanie, po wpisaniu poprawnego hasła strona nadal ładuje się z formularzem logowania, a cookie się nie ustawia.. gdy za komentowałem ob_start(); i ob_end_flush(); wszystko wróciło do normy tzn logowanie działa ale oczywiście nie działa dodawanie ciastka i przeładowanie strony.
Co się mogło stać dlaczego wcześniej wszystko działało dobrze a nagle przestało działać mimo że tylko zmieniłem wyświetlany tekst po zalogowaniu.
Czy może źle wstawiam ob_start(); i ob_end_flush(); może trzeba to wstawić w inne miejsca żeby dobrze działało?
Sephirus
Co wstawiłeś zamiast tego tekstu "jesteś zalogowany"? Dokładnie?

To nie powinno mieć żadnego znaczenia to zmienianie tekstu - coś musiałeś tam namieszać smile.gif
Kuscik
wyświetliłem tam login z sesji i link do "moje konto" prosty kod

  1. echo '<p class="witaj">Witaj, ' . $SessionLogin;
  2. echo '</p><ul class="menulista">';
  3. echo '<li class="menupunkt">';
  4. echo '<a href="" class="menupunkt">Moje Konto</a>';
  5. echo '</li>';


nawet jak ponownie wstawię same "jesteś zalogowany" to już działa złe smile.gif
Sephirus
No to szukaj błędu/zmiany - musiałeś coś zmienić. Sam pisałeś że działało dobrze i nagle przestało - szukaj co zmieniłeś.

Z punktu widzenia kodu wprowadzenie OB nie powinno nic zupełnie zmienić w samej funkcjonalności tej apki toteż gdzieś musiałeś się pomylić. Sprawdź warunki dotyczące logowania może coś gdzieś Ci umknęło.
ber32
Witam

Problem wydaje mi się leży po stronie

  1. $pamietaj = strip_tags($pamietaj);


wytnij ten fragment i sprawdź
Kuscik
Sephirus - ok ale w takim razie dlaczego gdy usunę ob to wszystko działa dobrze tzn loguje się i wszystko dobrze wyświetla

ber32 - sprawdze jak wrócę do domu i dam znać
zegarek84
patrząc na kod i że wszystko działało (może efekt cache przeglądarki chwilowo i nie zauważyłeś błędu zaraz po zmianie) oraz na ifa gdzie powinno wejść po zalogowaniu to zacznę wróżyć z fusów i spytam się, czy korzystasz z jakiegoś systemu kontroli wersji?? bo jeśli nie to gdzie masz zdefiniowaną pewną zmienną stałą (a jeśli to dobra praktyka nakazuje pisać takie zmienne w PHP z dużych liter)
  1. if (isset($_SESSION[id_u])) {

ale ja tylko hobbystycznie piszę i ostatnio częściej w C++ niż w PHP ;p

ps.
a propo systemu kontroli wersji jeśli nie korzystasz to np. bez lini komend w netbeans z git'a fajnie się korzysta... a jeśli pominiesz na początek grubszy temat jak gałęzie i wspólne repozytorium a pozostaniesz przy wersjonowaniu na dysku lokalnym to nawet z linii komend nie wiele jest do zapamiętania i przeczytania jeśli chodzi o przykłady... a jeśli chodzi o szybki edytor np. bez myszki to sobie zacząłem chwalić i zgłębiam ostanio vim'a (jeśli korzystasz "normalnie" z klawiatury jak to się powinno to warto przyjrzeć się temu narzędziu... a jeśli nie to warto poświęcić czas na "normalne" pisanie na klawiaturze ]:->)

pozdro...
Kuscik
Cytat(zegarek84 @ 25.02.2013, 22:53:28 ) *
[...] to gdzie masz zdefiniowaną pewną zmienną stałą (a jeśli to dobra praktyka nakazuje pisać takie zmienne w PHP z dużych liter)
  1. if (isset($_SESSION[id_u])) {

ale ja tylko hobbystycznie piszę i ostatnio częściej w C++ niż w PHP ;p

[...]


O którą zmienną stałą chodzi?
Kod tu pokazany jest tylko wycinką całego kodu ponieważ cały jest dość długi...

Jestem raczej początkujący i musiałem dwa razy przeczytać o czym do mnie napisałeś i wygooglować czym jest system kontroli wersji smile.gif nie nie korzystam z tego... piszę w NetBeans

Co do tego że może działało przez cache przeglądarki odpada, ponieważ logowanie działa nadal tylko jeśli zakomentuje ob... wtedy nie działa tylko dodawanie ciastek i przeładowanie strony ponieważ wcześniej jest już coś wyświetlane na stronie... ale logowanie działa
Poza tym jak skończyłem z tym logowaniem i działało to sporo czasu sprawdzałem na dwóch przeglądarkach czy wszystko działa poprawnie - czy zapamiętuje użytkownika, zapisuje cookie, zmienia cookie co określony czas, zmienia odpowiednie dane w bazie, usuwa cookie, zmienia id sesji itp itd... wszystko działało ładnie dopóki nie zacząłem pisać dalej co jest własnie dziwne... no nic muszę przejrzeć cały kod linijka po linijce :/


ber32
nie jest to wina
$pamietaj = strip_tags($pamietaj);
bez tego jest to samo, poza tym zaznaczenie pola "pamiętaj" nie jest obowiązkowe i nie chce się logować ani przy zaznaczonym ani odznaczonym polu
zegarek84
toś źle przeczytał mój post ;p... myślałem, że za dużo napisałem, nie lubię pisać w prost gdyż wtedy Ci którym próbuję pomagać szybko zapominają... a jeśli mam rację to sobie wyrobisz fajną spostrzegawczość przy pyrzewijaniu kodu ;p... lubknij do tego if'a co przytoczyłem i zwróć uwagę, że "id_u" nie jest wzięty w apostrofy... znając PHP na tyle ile pamiętam to tak jakkbyś zrobił if (isset($_SESSION['null'])) jeśli tej zmienneji nie masz zdefiniowanej (ewentualnie z dużych liter ;p)... a jak to nagle działa po zmianie tekstu to nie wiem ;p - może po prostu zmieniasz plik na starszą wersję ;p questionmark.gif i jest wtedy inny if...
.....
ps....
trochę wypiłem i o kontroli wejsji wspomniałem przy okazji... ale jak lukniesz co i jak to nie pożałujesz ;p
ber32
Cytat
Chodzi o to że jeśli przy logowaniu użytkownik zaznaczy checkbox to po zalogowaniu jest tworzone cookie a następnie strona jest przeładowywana przez header aby wyświetli ze jesteśmy już zalogowani


napisz który to checkbox zaznacza i gdzie on jest

  1. if (isset($_POST['pamietaj'])) {
  2. $pamietaj = $_POST['pamietaj'];
  3. $pamietaj = strip_tags($pamietaj);
  4. }
  5.  
  6. if ($pamietaj == 'tak') {
  7. $hash = 'xxx';
  8. setcookie('pamietaj', $id . ': ' . $hash, time() + 60 * 60 * 24 * 2);
  9. }
  10. header(' Location: index.php');
  11. } else {

  1. <input type="checkbox" name="pamietaj" class="pamietaj" value="tak" /></p>


a co to jest, czy czsem to nie ten checkbox .....
Kuscik
Cytat(ber32 @ 26.02.2013, 00:23:19 ) *
napisz który to checkbox zaznacza i gdzie on jest

  1. if (isset($_POST['pamietaj'])) {
  2. $pamietaj = $_POST['pamietaj'];
  3. $pamietaj = strip_tags($pamietaj);
  4. }
  5.  
  6. if ($pamietaj == 'tak') {
  7. $hash = 'xxx';
  8. setcookie('pamietaj', $id . ': ' . $hash, time() + 60 * 60 * 24 * 2);
  9. }
  10. header(' Location: index.php');
  11. } else {

  1. <input type="checkbox" name="pamietaj" class="pamietaj" value="tak" /></p>


a co to jest, czy czsem to nie ten checkbox .....



Tak to ten checkbox z formularza.
Jeśli nie ma ustawionej zmiennej login, hasło to jest wyświetlany formularz
jeśli któraś ze zmiennych jest ustawiona ale jest złe hasło lub weryfikacja nie powiodła się z jakiegoś innego powodu to wyświetla formularz z błędem (tu pokazałem tylko sam formularz)
jeśli weryfikacja przeszła ok i konto zostało aktywowane to dodaje do sesji id użytkownika, jego nazwę i email a jeśli był zaznaczone checkbox to dodaje dodatkowo cookie i odpowiednie dane do bazy

zegarek84 - tak już widzę brak apostrofów jednak powiem szczerze że w kodzie to wygląda trochę inaczej - są ustawione wcześniej zmienne z sesji (&id_u, $login) i ten if sprawdza czy występują te zmienne, a w ustawianiu zmiennych id_u jest w apostrofach, zrobiłem błąd tutaj skracając kod żeby był czytelniejsze


znalazłem chyba winowajce/winowajców

zmieniłem
  1. header(' Location: index.php');


na
  1. header('Location: index.php');


i działa logowanie i dodanie ciastka bez "checkboxa" ... musiałem w którymś momencie wstawić spację

za to nie działa logowanie z checkboxem, tu też mam chyba winnego ale nie wiem co jest żle

chodzi o samo dodawanie ciastka "pamietaj"
  1. setcookie('pamietaj', $id . ': ' . $hash, time() + 60 * 60 * 24 * 2);

tu też trafiły spacje, jednak po ich usunięciu ciastko dalej się nie twory i nie działa całkiem logowanie, działa tylko jeśli osunę dodawanie tego cookie
Czy jestem już ślepy/zaspany czy tutaj
  1. setcookie("pamietaj", $useri.':'.$hash, time()+172800);

nadal jest coś źle?


EDIT:
OK już znalazłem chyba wszystkie błędy, jeszcze jedna tajemnicza spacja w kodzie

EDIT2:
Problem prawdopodobnie spowodował skrót CTRL+SHIFT+F w NetBeans do porządkowania kodu, czasem go używam i widocznie wepchnął tam spacje nie wiedziec po co smile.gif zauważyłem właśnie że czasem zamienia np
  1. echo 'cos tam '.$zmienna.' cos tam';
na
  1. echo 'cos tam ' . $zmienna . ' cos tam';
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.