Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]header / przyciski / redirect / funkcje / nie wiem co
Forum PHP.pl > Forum > Przedszkole
tehanu
Hej.

Czytałam http://phpedia.pl/wiki/Cannot_add_header_i...rs_already_sent i parę innych stron na ten temat i wydaje mi się, że rozumiem - przed header / setcookie / paroma innymi takimi funkcjami nie może się pojawić żadnen output = żaden znacznik html ani zwykły tekst. Dziesiąty raz patrzę na swój skrypt i nie widzę, gdzie on ma niedozwolony output przed wierszem, na którym się konsekwentnie wysypuje z tym błędem, a który brzmi niewinnie

  1. setcookie ('my_app_username', '$username', 60);


Wszystkie outputy w tym pliku są albo poniżej, albo w ifach, które nie odpalają. Chętnie pokażę cały, ale zrobiło się go 100 wierszy, to bez zachęty wklejać nie będę. Miała to być strona umożliwiająca login albo rejestrację.

Boję się, że nie wiem jakichś podstawowych zupełnie dla Was rzeczy o PHP. Poprawcie mnie gdzieś, proszę.

Wyszło mi, że nie da się napisać przycisku, wywołującego funkcję - skoro cały kod wykonywany jest na serwerze. Da się tylko zrobić przycisk, przekierowujący:

  1. <form action="plik.php">
...

To może być inny plik, jakiś verifylogin.php. Ale jeśli chcę, żeby jak najwięcej działo się w jednym pliku, co mi się wydaje dobrym ćwiczeniem przed pisaniem środka aplikacji, to musi być przekierowanie na siebie. OK. To tam, gdzie kończą się definicje funkcji, a zaczyna właściwy skrypt, mam


  1. if(isset($_COOKIE["my_app_username"])) {
  2. header('Location: main.php');
  3. }


(plik skryptu nazywa się login.php).

A na samym dole taki (zerżnięty z sieci) formularz:

  1. <form id="register" method="post" action="login.php">
  2. <table cellpadding="3">
  3. <tr><td colspan="2" align="center">Got no account yet? Create it now.</td></tr>
  4. <tr><td>Username:</td><td><input type="text" name="registername" maxlength="12"></td></tr>
  5. <tr><td>Password:</td><td><input type="password" name="password1" maxlength="12"></td></tr>
  6. <tr><td>Confirm password:</td><td><input type="password" name="password2" maxlength="12"></td></tr>
  7. <tr><td colspan="2" align="center"><input type="submit" name="register" value="Create account and log in"></td></tr>
  8. </table>
  9. </form>


I obok drugi do samego logowania.

A po tym ifie sprawdzającym cookie, taki między innymi if:

  1. if(isset($_POST['register'])) {
  2. register();
  3. }


Funkja register() ma sprawdzać, czy hasła się zgadzają, czy takiego użytkownika jeszcze nie ma, a jeśli wszystko jest w porządku, zrobić właśnie

  1. $password1 = mysql_real_escape_string($password1);
  2. $password1 = md5($password1);
  3. $sql = "INSERT INTO users (UserName, Password, CharacterId) VALUES ('$username', '$password1', 0)";
  4. setcookie ('mygame_username', '$username', 60);


(Obsługi formularza do samego logowania jeszcze nie robiłam. Baza jest utworzona osobnym skryptem i sprawdzona w phpMyAdmin. $username było eskejpowane wcześniej. Czas ustawiony celowo na razie tylko na 60.)

Jedyne outputy wewnątrz register() to kilka różnych or die, które jednak nie odpalają, ma się rozumieć, skoro w ogóle dochodzi do tego wiersza z setcookie().

Czego nie rozumiem? Czy w momencie ponownego załadowania strony (<form id="register" method="post" action="login.php">) cały ten html jest w jakimś sensie PRZED moim setcookie, jakby zostawał sprzed przeładowania? Jak w takim razie robi się rzecz wydawałoby się najprostszą na świecie - uruchomienie kodu przyciskiem?

Do samego logowania i rejestrowania mogę ostatecznie zrobić tak, jak było w tutorialu, osobny plik .php do każdej czynności. Ale czy to nie jest jakiś przerost i przesada? Gdzie tu jest ten niedozwolony output PRZED setcookie()?

Może jest tak - ale błagam, niech mi to ktoś explicite potwierdzi albo wyprowadzi mnie z błędu - że wszelkie setcookie (i rzeczy związane z session) muszą być w osobnych plikach, a w tym samym pliku robi się (przy pomocy if(isset($_POST[] if potem <form action...> z przekierowaniem na samo siebie) tylko niewinne czynności typu grzebanie w bazie i wyświetlanie danych?

Każdemu chętnemu podeślę całość do wglądu.

Pozdrawiam,
tehanu
toaspzoo
hasło koduj w md5 i nie uzywaj do hasła żadnych funkcji poza md5

Każda czynność może być w jednym pliku

Według tego, co napisałaś, to cookie ustala się po zalogowaniu/autoryzacji.

a cookie możesz przecież zawsze wyczyścić nadając mu wartość ''

setcookie ('mygame_username', '', 60);

Przed header() nie może być nic !
nekomata
I jedna rzecz
  1. setcookie ('mygame_username', '$username', 60);
Ustawi wartość na $username a nie na wartość zmiennej $username użyj więc
  1. setcookie ('mygame_username', $username, 60);
Lub zmień apostrof na cudzysłów .
tehanu
Cześć. Wstępnie bardzo dziękuję. Porządnie podziękuję Ci, jak zrozumiem, jeśli do tego kiedyś dojdzie wink.gif.

Cytat(toaspzoo @ 12.06.2011, 19:11:02 ) *
hasło koduj w md5


OK. Jest w md5.

Cytat
i nie uzywaj do hasła żadnych funkcji poza md5


= nie używaj ysql_real_escape_string? OK. Czemu?

Cytat
Każda czynność może być w jednym pliku


Nie rozumiem. Może, ale czy powinna? Czy namawiasz mnie, żeby formularz register miał action="register.php", w którym to register.php nie będzie ani jednego taga, samo php z góry na dół?

Cytat
Według tego, co napisałaś, to cookie ustala się po zalogowaniu/autoryzacji.


Nie rozumiem. To jest moja pierwsza przymiarka do php większa niż helloworld. Chodziło mi o taki efekt, żeby kod z pliku login.php wykonał się kilka razy, idealnie tak:

- Nie są ustawione ani cookie, ani $_POST['register'], więc wyświetla się html z formularzem. Użytkownik grzecznie wypełnia formularz i wciska register, skrypt się przeładowuje;
- Tym razem cookie dalej nie jest ustawione, ale $_POST['register'] już tak, więc wykonuje się funcja register, która tworzy rekord w bazie, ustawia cookie, po czym - dopiero teraz, PO setcookie, choć tego kawałka jeszcze nie napisałam - robi <a href="login.php>...</a> . Użytkownik grzecznie w to klika, więc skrypt się ponownie przeładowuje;
- Tym razem nie wiem, w jakim stanie jest $_POST['register'], ale od razu na początku zaskakuje if(isset(setcookie())) i robi - znów PRZED pierwszym outputem - header z przekierowaniem na member area.

Cytat
a cookie możesz przecież zawsze wyczyścić nadając mu wartość ''

setcookie ('mygame_username', '', 60);


smile.gif OK, jak będę pisała logout. Ale widziałam taką radę, żeby ustawić z ujemnym czasem wygaśnięcia. To będzie jakaś różnica czy na jedno wyjdzie?

Cytat
Przed header() nie może być nic !


= Żadnego echo ani ?>, prawda? Bo kodu php może być przed header ile chce? Co za sens miałoby przekierowywanie od razu w pierwszym wierszu kodu?
toaspzoo
Cytat
= nie używaj ysql_real_escape_string? OK. Czemu?

Bo jest w md5 i usunie Ci znaki z hasła - nie zalogujesz się


Cytat
= Żadnego echo ani ?>, prawda? Bo kodu php może być przed header ile chce? Co za sens miałoby przekierowywanie od razu w pierwszym wierszu kodu?


Może być, ale bez output'ów, returnów i innych wyjściowych, no i startować sesji nie powinno się.

Cytat
smile.gif OK, jak będę pisała logout. Ale widziałam taką radę, żeby ustawić z ujemnym czasem wygaśnięcia. To będzie jakaś różnica czy na jedno wyjdzie?


Bezpieczniej dać na długi czas i value = '';

Cytat
Nie rozumiem. Może, ale czy powinna? Czy namawiasz mnie, żeby formularz register miał action="register.php", w którym to register.php nie będzie ani jednego taga, samo php z góry na dół?



Może, ale nie musi, wtedy nie używasz atrybutu action
tehanu
Cytat(toaspzoo @ 12.06.2011, 20:20:27 ) *
Może, ale nie musi, wtedy nie używasz atrybutu action


sad.gif Widzisz, piszesz tak skrótowo, że nie wiem, co masz na myśli. Np. jak piszesz "wtedy". Napiszę to skrypciątko jeszcze raz od początku, żeby było czysto, i zrobię osobne pliki na te kawałki kodu, w których jest setcookie albo header. Jeśli dalej będzie robiło takie numery, zapytam Cię w pw, czy mogę Ci to wysłać. Najwcześniej za kilka dni - bawię się tym 20 minut dziennie.

Tymczasem napisz mi, jeśli możesz, czy w momencie wczytania tego samego pliku po raz kolejny z rzędu (np. przez form action), html i inny output z poprzedniego załadowania tego pliku przestaje się liczyć dla setcookie i header. Bo jeśli nie przestaje się liczyć (choć się tego nie spodziewałam), to będzie jasne, dlaczego daje taki błąd.

I może powiedz coś takiego: jeśli chcę, żeby przycisk spowodował wykonanie jakiegoś niewinnego kawałka kodu, tj. takiego, w którym ani setcookie ani header nie ma, czy najbardziej prostolinijnym sposobem na zrobienie tego jest właśnie ponowne załadowanie tego samego pliku .php przyciskiem, a na górze zrobienie

  1. if(isset($_POST['cośtam'])) {
  2. login();
  3. }


? Czy robi się to jakoś inaczej?

tehanu
toaspzoo
1 plik
Kod
<form action="plik2.php"> <!-- lub bez action -->
<input type=text name=tekst>
<input type=submit name=sub value=1>
</form>


plik2.php
Kod
if(!empty($_POST['sub']))
{
///...
}


LUB

plik2.php
Kod
if(!empty($_POST['tekst']))
{
///...
}
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.