Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Zmienna sesyjna, wykonywanie pliku od konkretnego miejsca
Forum PHP.pl > Forum > Przedszkole
StadiPL
Siema
Robię sobie system kont i mam pewien problem. Mianowicie mam plik który jest include'owany. Całość wczytywana jest na takim linku: http://localhost/?p=2 (p=2 oznacza że jest załadowana jakaś tam nieistotna strona 2)
login_form.php
  1. <a name="a">
  2. <?php $_SESSION['url']=$_SERVER['REQUEST_URI']; ?>
  3. <a name="b">
  4. <?php $url=$_SERVER['REQUEST_URI']; ?>
  5. Zaloguj się:<br />
  6. <form method="POST" action="
  7. <?php
  8. //jeśli zawiera już r=function to nie dodaje tylko wchodzi na aktualny url
  9. if (preg_match('/^.*r=function$/', $url)) {echo $url;} else {
  10. //jeśli nie ma r=function w url'u to dodaje
  11. if (preg_match('/^.*?.*=.*$/', $url))
  12. //jeśli są też inne zmienne w url'u
  13. {echo $url ."&r=function";}
  14. //jeśli nie ma innych zmiennych
  15. else {echo $url ."?r=function";}
  16. }
  17. ?>
  18. ">
  19. Nickname: <input type="text" name="nickname"><br />
  20. Hasło: <input type="password" name="password"><br />
  21. <input type="submit" value="login" name="login">
  22. </form>

zmienna r=function powoduje załadowanie login_function.php Gdy ktoś wpisze dobre dane, to login_function.php zrobi coś takiego:
  1. $url=$_SESSION['url'];
  2. header("Location: $url");

Jednak gdy coś się nie zgadza, to robi coś takiego (przykład, ale reszta działa analogicznie):
  1. $back=include('login_form.php');
  2. if ($token_activate_check == 0) {echo "Konto nieaktywowane" .$back;}

No i teraz jak to zrobić żeby przy podaniu złego loginu i hasła zaczął czytać login_form od części "b"?
Druga kwestia jest taka, że nawet gdy za pierwszym razem użytkownik poda dobre dane, to odwiedzana strona się odświerza i pokazuje ukrytą treść (widoczną tylko po zalogowaniu - czyli loguje normalnie), jednak w miejscu gdzie znajduje się formularz logowania powinien się pojawić panel użytkownika. Zamiast tego dalej widzę tam formularz, a dodatkowo błędy że nie zdefiniowano nickname i password oraz wyświetla mi komunikat niespełnionego pierwszego warunku logowania (w podanym przezemnie przykładzie to byłoby "konto nieaktywowane". Jest to normalny efekt w przypadku zwykłego załadowania http://localhost/?p=2&r=function Tylko czemu po poprawnym logowaniu ładuje mi ten link? Powinien załadować stronę bez zmiennej "r"..
Próbowałem też tak pobierać potrzebny link, ale nie pomogło:
  1. <?php unset($_SESSION['url']); $_SESSION['url']=$_SERVER['REQUEST_URI']; ?>

Jakby się przydało, to załączam jeszcze ten pliczek:
panel.php
  1. <?php
  2. //ładowanie odpowiedniej strony na bazie zmiennej z linku
  3.  
  4. //jeśli r puste
  5. if (empty($_GET['r'])) {
  6. //jeśli niezalogowany
  7. if(empty($_SESSION["logged"]))$_SESSION["logged"]=0;
  8. if ($_SESSION['logged']!=1) {include('login_form.php');}
  9. //jeśli zalogowany
  10. else {echo "Witaj " .$_SESSION['nickname'] ." <br />To jest twój panel użytkownika";}
  11. }
  12. //jeśli r ma daną wartość
  13. else if ($_GET['r']=="function") {include('pages/functions/login_function.php');}
  14. //w wypadku gdy r nie jest puste i ma inną wartość niż wyżej zdefiniowane
  15. else echo "Zje..ny błąd";
  16. ?>
com
Zacznijmy od tego że w znaczniku a nie operujesz na name tylko id smile.gif name zostało wycofane wraz z html5, ale to poza tematem, a co do problemu to wprawdzie wrzuciłeś dużo kodu, ale jak na niego patrze to nasówa sie tylko jedno pytanie co autor miał na myśli... html w żaden sposób nie jest dla niego ograniczeniem i wykonujesz zawsze wszystko, poprostu brakuje Ci warunku który sprawda czy wysłany został formularz lub nie wink.gif
StadiPL
A możesz zapodać prostym przykładem jak to zrobić w jednym pliku? Bo już jakiś czas temu szukałem samemu (bo uznałem że tak będzie prościej), ale nie znalazłem nic dobrego. Jak zapytałem na forum to dowiedziałem się że muszę to zrobić ajaxem - ja tego nie ogarniam, a najsampierw to bym się nauczył chociaż podstaw php. Z tego co wiem to jest jakieś "rozszerzenie" php
com
Ale co chcesz zrobić w jednym pliku? cały skrypt logowania? przykładów na necie jest na pęczki... nawet na tym forum pewnie coś znajdziesz... Ajax to jest js wink.gif chociaż nie bardzo widze poco niby on tu, ale może gdzieś by sie znalazło słuszne wytłumaczenie jego użycia wink.gif
StadiPL
Cytat
poprostu brakuje Ci warunku który sprawda czy wysłany został formularz lub nie

No więc mogę zrobić kod który ma formularz, a jeżeli zostanie kliknięte "loguj" to wykona mi cały kod php związany se sprawdzaniem danych itp. Tym sposobem można (i nawet byłoby lepiej) zrobić to w jednym pliku
com
to wrzuć jescze kod gdzie wgl Cie loguje bo z tego co widzę tu go nie ma...
StadiPL
To cały plik login_function.php
  1. <?php
  2. //jeśli "logged" puste to zmienia na 0
  3. if(empty($_SESSION["logged"]))$_SESSION["logged"]=0;
  4. //łączenie z bazą danych
  5. include ('connection.php');
  6. //zmienne
  7. $back=include('login_form.php');
  8. $nickname=$_POST['nickname'];
  9. $password=md5($_POST['password']);
  10. //zmienna sprawdzająca egzystencję $nickname w bazie danych
  11. $q = mysql_query("SELECT * FROM users WHERE nickname='$nickname'") or die(mysql_error());
  12. $check=mysql_num_rows($q);
  13.  
  14. //zmienna zawierająca hasło użytkownika wczytane z bazy na podstawie $nickname
  15. $q_password=@mysql_query("select `password` from `users` where `nickname`='".$nickname."' limit 1");
  16. $result_password=mysql_fetch_assoc($q_password);
  17. $password_check=$result_password['password'];
  18.  
  19. //zmienna zawierająca wartość token_activate
  20. $q_token_activate=@mysql_query("select `token_activate` from `users` where `nickname`='".$nickname."' limit 1");
  21. $result_token_activate=mysql_fetch_assoc($q_token_activate);
  22. $token_activate_check=$result_token_activate['token_activate'];
  23.  
  24. //WARUNKI
  25. //nickname_chcek - sprawdzenie egzystencji
  26. if (!$check>0) { echo 'Zly login';}
  27. //token_activate - sprawdzenie
  28. else if ($token_activate_check == 0) {echo "Konto nieaktywowane" .$back;}
  29. //hasło - porównanie wartości z bazą danych
  30. else if ($password_check != $password) {echo "Podales zle haslo" .$back;}
  31. //logged_check - sprawdzanie czy niezalogowany
  32. else if($_SESSION["logged"]==1){echo "użytkownik już zalogowany" .$back;}
  33.  
  34. //jak ok to loguje
  35. else if ($_SESSION["logged"]=1)
  36. {
  37. //zmienna zawierająca wartość id
  38. $q_user_id=@mysql_query("select `id` from `users` where `nickname`='".$nickname."' limit 1");
  39. $result_user_id=mysql_fetch_assoc($q_user_id);
  40. $user_id=$result_user_id['id'];
  41.  
  42. $_SESSION['nickname']=$nickname;
  43. $_SESSION['user_id']=$user_id;
  44. //odświerzenie strony sprzed logowania
  45. //$url=$_POST['url'];
  46. $url=$_SESSION['url'];
  47. header("Location: $url");
  48. mysql_close($global__connection);
  49. }
  50. ?>
com
No teraz to nabiera sensu... a wiec tak w pliku login_form.php :
jest deklaracja adresu url który ma postać
$_SESSION['url']=$_SERVER['REQUEST_URI'];

czyli adres.pl/login_form.php a tam wykonuje się jeden z tych twoich warunków więc dlatego jest on dopisywany, dlatego nasówa sie pytanie, czemu to ma służyć?:
  1. //jeśli zawiera już r=function to nie dodaje tylko wchodzi na aktualny url
  2. if (preg_match('/^.*r=function$/', $url)) {echo $url;} else {
  3. //jeśli nie ma r=function w url'u to dodaje
  4. if (preg_match('/^.*?.*=.*$/', $url))
  5. //jeśli są też inne zmienne w url'u
  6. {echo $url ."&r=function";}
  7. //jeśli nie ma innych zmiennych
  8. else {echo $url ."?r=function";}
  9. }
StadiPL
Cóż.. całość jest na tyle skąplikowana że chyba musiałbym wysłać wszystko aby dało się coś z tego zrozumieć. Tak czy inaczej jakbyś podał mi wzór pod coś takiego to byłbym mega wdzięczny ;]
Wiem że to nie będzie działać, ale opisany efekt bym chciał osiągnąć. Nie musiałbym się wtedy bawić aż tyle z głupim formularzem.
  1. <form method=CO_TU_USTAWIĆ-NORMALNIE-POST method=TU-TEŻ-NIE-WIEM>
  2. Nickname: <input type="text" id="nickname">
  3. <input type="submit" value="login" id="login">
  4. <?php
  5. if (NIE-ZOSTAL-KLIKNIETY-LOGIN-BADZ-ENTER) {exit();}
  6. else
  7. //coś tam sobie sprawdza czy mu się zgadza. Czy np jest w bazie danych.
  8. //jeśli coś mu nie pasuje to zostaje wyświetlony formularz i błąd (co mu nie pasowało)
  9. if ($_POST['nickname']!=$nickname_check) {/*wyświetlenie tego błędu poniżej formularza*/}
  10. else
  11. //jeśli wszystko mu pasuje to ma wyświetlić panel.php zamiast formularza
  12. include('panel.php');
  13. ?>

Dać kod do całości? Wątpię żeby chciało Ci się przeglądać cały.. Myślę że jak pomożesz mi z tym, to sobie poradzę
com
Jeśli dobrze zrozumiałem to myśle że najprosciej zrobić to tak:
Plik login.php
  1. <?
  2. if(isset($_POST['nickname']) && isset($_POST['password'])) #lub if(!empty($_POST['nickname']) && !empty($_POST['password']))
  3. {
  4. # tutaj sprawdasz czy użytkownik istnieje itd
  5.  
  6. # jeżeli użytkownik istniej to zapisujesz go do do sesji tak jak miałeś , a potem jakiś header("location:panel.php");
  7.  
  8. # jeśli nie istniej to np zapis do sesji komunikatu errora i header("refresh:0;url=login.php"); gdyby był problem to przed tym skasuj zmienne bo pisze z palca, a nie pisałem dawno już tego strukturalnie ;)
  9. }
  10. else
  11. {
  12. ?>
  13. <form method="post" action="login.php">
  14. Nickname: <input type="text" name="nickname"><br />
  15. Hasło: <input type="password" name="password"><br />
  16. <input type="submit" value="login" name="login">
  17. <?
  18. }
  19. ?>
  20.  
W tym momencie faktycznie prosiło by sie o ajax dla tego komunikatu, zamiast przeładowania strony ale nie chce Ci za bardzo namieszac wink.gif
StadiPL
Myślę że nie namieszałbyś, a wręcz przeciwnie - zajebiście opisałeś powyższy przykład ;] Może to głupie, ale wolę zawsze praktykę od teorii, więc php uczę się po prostu wykonując jakieś kody wink.gif Mam z czymś problem to szukam, próbuję, jak nie daje rady, to w końcu kogoś pytam. Potem analizuję sobie kod wiele razy, stosuję w różnych wariantach i w ten oto sposób się uczę. Skoro ten cały ajax jest takim stanadrowym rozwiązaniem (w dodatku dającym lepsze efekty), to chyba i tak będę musiał tego też zacząć coś tam się uczyć. Od czegoś zacząć trzeba, więc czemu by nie od tego ;p
com
No tak nie można osiadać na laurach, a nie na samym php, programowanie internetu sie kończy... tak więc życzę Ci owocnej nauki i mam nadzieję ze moje wskazówki okazały sie pomocne smile.gif

co do Ajaxa to chyba najlepszy bedzie manual http://api.jquery.com/jQuery.ajax/ i http://api.jquery.com/jQuery.post/ wink.gif
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.