Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]ob_start() - czy poytzebne jeśli działą bez tego?
Forum PHP.pl > Forum > Przedszkole
Tho
Tworzę już chyba z tydzień, system rejestracji z całym oprzyrządowaniem, przypomnienie hasła itd.. W związku z tym chciałbym poznać Twoją opinie.

Czy jest to nierozerwalnie związane z session_start? Zawsze jedno ob musi być przed nim a drugie ob za nim. Czy mają być na końcach plików, niezależnie od fragmentów <?php?>?


Dowiedziałem się że przed każdym session_start(); musi być ob_start(); a na zakończenie(ale w którym dokładnie miejscu, co znaczy zakończenie?) ma być ob_end_flush().

Początek każdego pliku zazwyczaj wygląda u mnie tak.

  1. <?php
  2. ?>


Początek znaczy, nawet przed "<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">"

Później mam kilka sektorów <?php?> i wszystko zdaje się działać niezależnie od tego czy w pliku jest gdziekolwiek ob_end_flush(); .

Czy może tego nie widać, nie wywala błędów, ale trzeba to wstawić bo brak tego czymś grozi?

Proszę mnie ignorancko nie odsyłać do manuala, bo gdybym tam nie sprawdzał, nie pisał bym takiego długiego postu. Tam jest bardziej definicja, a mi chodzi o OPINIE i rady.

Czy i dlaczego nie wystarczy samo session_start(); ?
peter13135
1. Koduj pliki w utf-8 bez bom
2. nie musisz nigdzie używać ob_start(), wystarczy że mądrze rozplanujesz sobie skrypt.
Tho
Kilka razy <?php ... ?> na stronie? Nie ma nic złego w tym? Co rozumiesz przez mądrze, bez błędów?

Czy może być samo session_start gdzieś w środku strony(oczywiście przed całą treścią php)? Jak do tej pory takie działanie powoduje wywalanie błędów i musiałem wstawić to - razem z ob_start().
drozdii07
Sesje musisz wystartować na samym początku. Wielokrotne <?php ?> to nic złego, często się korzysta z tego, jest to tzw. wyskakiwanie z PHP.
crocodillo
w3
Cytat(drozdii07 @ 30.10.2011, 20:53:09 ) *
Sesje musisz wystartować na samym początku. Wielokrotne <?php ?> to nic złego, często się korzysta z tego, jest to tzw. wyskakiwanie z PHP.


Dokładniej to należy użyć przed wysłaniem czegokolwiek do przeglądarki, ze względu na wykorzystanie cookies.
Tho
Cytat(peter13135 @ 30.10.2011, 20:23:01 ) *
1. Koduj pliki w utf-8 bez bom
2. nie musisz nigdzie używać ob_start(), wystarczy że mądrze rozplanujesz sobie skrypt.


1. Wszystkie pliki mam zakodowane w UTF-8 bez BOM.

2. Sprawa nie jest taka prosta, bo jeśli to prawda "nie musisz używać", to dlaczego wstawienie ob_start() spowodowało zniknięcie tego błędu, nie wstawiałem ob_end_flush(), samo ob_start na samym początku pliku, przed session_start, to wystarczyło by zniknął komunikat błędu.

Pytanie, czy zamknąć "ob" poprzez ob_end_flush()? I dlaczego to jest takie ważne, by to otworzyć, bo bez tego nie przejdzie, a już nie trzeba zamykać(z tego co zauważyłem jak dotąd, być może jest to konieczne, ale jak narazie nie zauważyłem błędów spowodowanych brakiem tego.

Jak to jest?

Proszę nie zamykać tego tematu jak poprzednio, uzasadnieniem "To już było", bo stare wątki na ten temat przeszukałem i nie znalazłem tam odpowiedzi na to akurat pytanie.
by_ikar
Zacznijmy od tego:

Cytat
Dowiedziałem się że przed każdym session_start(); musi być ob_start();


gdzie ty taką informację przeczytałeś?

Dlaczego ci błąd zniknął? Najlepiej zobrazuje to ten skrypt:

Kod
<?php


ob_start();

echo $nie_istniejaca_zmienna;

ob_get_clean();


Normalnie powinieneś dostać notice, że użyłeś zmiennej która nie istnieje, a teraz zobacz na ten skrypt:

Kod
<?php


ob_start();

echo $nie_istniejaca_zmienna;

$ob = ob_get_clean();

echo $ob;


$ob przechowuje teraz efekt działania echo $nie_istniejaca_zmienna; jeżeli wyświetlisz wynik $ob, w efekcie czego dostaniesz błąd, ten który powinieneś dostać, że używasz zmiennej ($nie_istniejaca_zmienna) która najzwyczajniej nie istnieje. Poczytaj sobie w manualu o buforze, tutaj to chyba dość łopatologicznie przedstawiłem. Często się używa bufora w celu manipulacji późniejszymi danymi, jak chociażby zmiana w html, czy inne rzeczy. Jeżeli nie potrzebujesz tego, to nie musisz używać ob_* nigdzie, a to że gdzieś pisze że z session musi być ob_* to jest bzdura. Zamiast czytać kursy w internecie, kup sobie porządną książkę, a wszystkie swoje wątpliwości co do języka weryfikuj w manualu (oczywiście nie omijaj również komentarzy pod opisem danej rzeczy w manualu, bo one są bardzo pomocne), bo w tej chwili zakładasz tematy i pytasz się niekiedy o rzeczy które są banalne i są umieszczone w manualu czy najprostszych kursach, efektem czego jest tworzenie jakiegoś kursu dla ciebie tutaj na forum. Taki formularz rejestracji czy nawet gotowy cały sklep, można napisać krok po kroku w wielu książkach, gdzie ci wytłumaczą każdą jedną rzecz co powinno rozwiać twoje wątpliwości.
mortus
ob_start() służy do włączenia buforowania wyjścia. To z kolei powoduje, że wynik działania skryptu nie jest od razu wysyłany na wyjście, ale jest zapisywany w wewnętrznym buforze. Wyjątkiem są funkcje, które modyfikują nagłówki (np. header, session_start). Funkcje te działają niejako "poza" wspomnianym buforem.

Cytat
2. Sprawa nie jest taka prosta, bo jeśli to prawda "nie musisz używać", to dlaczego wstawienie ob_start() spowodowało zniknięcie tego błędu, nie wstawiałem ob_end_flush(), samo ob_start na samym początku pliku, przed session_start, to wystarczyło by zniknął komunikat błędu.


Owszem, to wystarczyło, aby zniknął komunikat błędu, ale sam problem nie został rozwiązany i błąd nadal gdzieś tkwi. W dodatku teraz trudniej będzie go znaleźć.

ob_end_flush() powoduje wysłanie zawartości wewnętrznego bufora na wyjście i wyłączenie buforowania wyjścia.
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.