Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]header / przyciski / redirect / funkcje / nie wiem co
tehanu
post
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 12.06.2011
Skąd: Polska

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
toaspzoo
post
Post #2





Grupa: Zarejestrowani
Postów: 778
Pomógł: 84
Dołączył: 29.07.2010
Skąd: Gliwice / Pławniowice Mistrz niezmordowanej klawiatury.

Ostrzeżenie: (20%)
X----


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

Ten post edytował toaspzoo 12.06.2011, 19:22:24
Go to the top of the page
+Quote Post
tehanu
post
Post #3





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 12.06.2011
Skąd: Polska

Ostrzeżenie: (0%)
-----


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


(IMG:style_emoticons/default/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
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 11.10.2025 - 00:47