Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Problem z przypisaniem sesji do zmiennej.
Forum PHP.pl > Forum > Przedszkole
Croos22
Witam.
Mam problem z przypisaniem nazwy użytkownika zalogowanego w sesji do zmiennej. Dodawałem to tak $_SESSION['user_name'] = $nazwa;
A na innej stronie w celu sprawdzenia czy sesja istnieje robiłem tak:
<?php
session_start();

echo 'Zalogowany jest ' .$nazwa;
?>

A tu mam kod z logowaniem (Nie jestem autorem tego kodu):

  1. <?php
  2. session_register("zalogowany");
  3.  
  4. if(empty($_SESSION["zalogowany"]))$_SESSION["zalogowany"]=0;
  5.  
  6. mysql_connect("localhost", "root", "")or die("Nie można nawiązać połączenia z bazą");
  7. mysql_select_db("test")or die("Wystąpił błąd podczas wybierania bazy danych");
  8.  
  9. function ShowLogin($komunikat=""){
  10. echo "$komunikat<br>";
  11. echo "<form action='index.php' method=post>";
  12. echo "Login: <input type=text name=login><br>";
  13. echo "Hasło: <input type=text name=haslo><br>";
  14. echo "<input type=submit value='Zaloguj!'>";
  15. echo "</form>";
  16. echo "Jeśli nie jesteś zarejestrowany, <a href='rejestruj.php'>tu znajdziesz formularz</a>";
  17. }
  18.  
  19. ?>
  20. <!DOCTYPE html
  21. PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  22. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  23. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
  24. <head>
  25. <title>Strona główna</title>
  26. </head>
  27. <body>
  28. <?php
  29. if($_GET["wyloguj"]=="tak"){$_SESSION["zalogowany"]=0;echo "Zostałeś wylogowany z serwisu";}
  30. if($_SESSION["zalogowany"]!=1){
  31. if(!empty($_POST["login"]) && !empty($_POST["haslo"])){
  32. if(mysql_num_rows(mysql_query("select * from users where user_login = '".htmlspecialchars($_POST["login"])."' AND user_haslo = '".htmlspecialchars($_POST["haslo"])."'"))){
  33. echo "Zalogowano poprawnie. <a href='index.php'>Przejdź na stronę główną</a>";
  34. $_SESSION["zalogowany"]=1;
  35. }
  36. else echo ShowLogin("Podano złe dane!!!");
  37. }
  38. else ShowLogin();
  39. }
  40. else{
  41. ?>
  42. Gratulacje! Zalogowałeś się pomyślnie! Możesz przejśc teraz do innych podstron, np. do <a href="stronka.php">tej</a>
  43. <br><a href='index.php?wyloguj=tak'>wyloguj się</a>
  44. <?php
  45. }
  46. ?>
  47.  
  48. </body>
  49. </html>
  50. <?php mysql_close(); ?>
  51.  
  52.  
  53.  
sadistic_son
Znak równości nie jest, tak jak w matematyce naprzemienny. Oznacza to, że to:
  1. $a=$b;
nie jest równoznaczne z tym:
  1. $b=$a;
. Tak więc jeśli chcesz przypisać wartość z sesji do zmiennej musisz to zrobić na odwrót czyli:
  1. $nazwa=$_SESSION['user_name'];
Croos22
Dzięki sadistic_son za informację ale to nadal nie chce mi chodzić a daję na innej stronie na samym początku session_start(); a potem w echo zmienną w moim przypadku $nazwa.

W takim razie tutaj musi być coś nieprawidłowo zrobione (35 linia):

  1. <?php
  2. session_register("zalogowany");
  3.  
  4. if(empty($_SESSION["zalogowany"]))$_SESSION["zalogowany"]=0;
  5.  
  6. include ('includes/config_includes.php');
  7.  
  8. function ShowLogin($komunikat=""){
  9. echo "$komunikat<br>";
  10. echo "<form action='index.php' method=post>";
  11. echo "Login: <input type=text name=login><br>";
  12. echo "Hasło: <input type=text name=haslo><br>";
  13. echo "<input type=submit value='Zaloguj!'>";
  14. echo "</form>";
  15. echo "Jeśli nie jesteś zarejestrowany, <a href='rejestruj.php'>tu znajdziesz formularz</a>";
  16. }
  17.  
  18. ?>
  19. <!DOCTYPE html
  20. PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  21. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  22. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
  23. <head>
  24. <title>Strona główna</title>
  25. </head>
  26. <body>
  27. <?php
  28. if($_GET["wyloguj"]=="tak"){$_SESSION["zalogowany"]=0;echo "Zostałeś wylogowany z serwisu";}
  29. if($_SESSION["zalogowany"]!=1){
  30. if(!empty($_POST["login"]) && !empty($_POST["haslo"])){
  31. if(mysql_num_rows(mysql_query("select * from users where user_name = '".htmlspecialchars($_POST["login"])."' AND user_password = '".md5(htmlspecialchars($_POST["haslo"]))."'"))){
  32. echo "Zalogowano poprawnie. <a href='index.php'>Przejdź na stronę główną</a>";
  33. $_SESSION["zalogowany"]=1;
  34. $nazwa=$_SESSION['user_name'];
  35. }
  36. else echo ShowLogin("Podano złe dane!!!");
  37. }
  38. else ShowLogin();
  39. }
  40. else{
  41.  
  42. ?>
  43. Gratulacje! Zalogowałeś się pomyślnie! Możesz przejśc teraz do innych podstron, np. do <a href="stronka.php">tej</a>
  44. <br><a href='index.php?wyloguj=tak'>wyloguj się</a>
  45. <?php
  46. }
  47. ?>
  48.  
  49. </body>
  50. </html>
  51. <?php mysql_close(); ?>
ZuyPan
Zmienne nie są pamiętane między plikami tak jak sesje. W Twoim przypadku nazwę użytkownika na innej podstronie odczytasz np. tak:
  1. <?php
  2. if ($_SESSION['zalogowany'] == '1'){
  3. echo 'Witaj <b>'.$_SESSION['user_name'].'</b>.';
  4. }
  5. ?>
Croos22
Irytowało mnie to trochę tak sama zmienna bez żadnego przypisania na innej stronie. Tylko, że mi to niestety nie pomogło i tak. Na pewno mam teraz dobrze w logowaniu?
daros17
spróbuj tak

  1. $connection = mysql_query("select * from users WHERE user_name = '($_POST["login"])' AND user_password = '($_POST["haslo"])'") or die (mysql_error());
  2. while ($connection && $rekord = mysql_fetch_assoc($connection)) {
  3. $_SESSION['user_name']= $rekord['user_name'];
  4. $_SESSION['user_password'] = $rekord['user_password'];
  5. echo 'Witaj '.$_SESSION['user_name'];
  6. }
ZuyPan
No jasne, że jest źle brakuje Ci przypisania wartości do zmiennej trzymającej nazwę użytkownika. Brakuje Ci konkretnie takiej linijki:
  1. $_SESSION['user_name'] = $_POST['login'];

chodź login lepiej pobrać z mysql, ale Ty nie masz pobrania danych z bazy więc wykorzystajmy to co wpisał użytkownik jako login.
Poprawny kod:

  1. <?php
  2. session_register("zalogowany");
  3.  
  4. if(empty($_SESSION["zalogowany"]))$_SESSION["zalogowany"]=0;
  5.  
  6. include ('includes/config_includes.php');
  7.  
  8. function ShowLogin($komunikat=""){
  9. echo "$komunikat<br>";
  10. echo "<form action='index.php' method=post>";
  11. echo "Login: <input type=text name=login><br>";
  12. echo "Hasło: <input type=text name=haslo><br>";
  13. echo "<input type=submit value='Zaloguj!'>";
  14. echo "</form>";
  15. echo "Jeśli nie jesteś zarejestrowany, <a href='rejestruj.php'>tu znajdziesz formularz</a>";
  16. }
  17.  
  18. ?>
  19. <!DOCTYPE html
  20. PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  21. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  22. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
  23. <head>
  24. <title>Strona główna</title>
  25. </head>
  26. <body>
  27. <?php
  28. if($_GET["wyloguj"]=="tak"){$_SESSION["zalogowany"]=0;echo "Zostałeś wylogowany z serwisu";}
  29. if($_SESSION["zalogowany"]!=1){
  30. if(!empty($_POST["login"]) && !empty($_POST["haslo"])){
  31. if(mysql_num_rows(mysql_query("select * from users where user_name = '".htmlspecialchars($_POST["login"])."' AND user_password = '".md5(htmlspecialchars($_POST["haslo"]))."'"))){
  32. echo "Zalogowano poprawnie. <a href='index.php'>Przejdź na stronę główną</a>";
  33. $_SESSION["zalogowany"]=1;
  34. $_SESSION['user_name'] = $_POST['login'];
  35. }
  36. else echo ShowLogin("Podano złe dane!!!");
  37. }
  38. else ShowLogin();
  39. }
  40. else{
  41.  
  42. ?>
  43. Gratulacje! Zalogowałeś się pomyślnie! Możesz przejśc teraz do innych podstron, np. do <a href="stronka.php">tej</a>
  44. <br><a href='index.php?wyloguj=tak'>wyloguj się</a>
  45. <?php
  46. }
  47. ?>
  48.  
  49. </body>
  50. </html>
  51. <?php mysql_close(); ?>
Croos22
Bardzo ale to bardzo dziękuje tylko, że pomyślałem sobie jak ja to wrzucę w zapytanie w WERE spacje i inne znaki. W jaki sposób zrobić aby user_id wrzucić do sesji sprawia mi to kłopot ponieważ chyba się nie da wrzucić tam gdzie jest sprawdzenie loginu i hasła.
daros17
Nie wiem czy dobrze Cie zrozumiałem, ale wówczas również pobierasz dane z bazy i przypisujesz do sesji
Croos22
Ale w jaki sposób. Przecież nie tak:

  1. $_SESSION['user_name'] = $_POST['login'];


W tym przypadku do $_SESSION['user_name'] przypisane jest to co wpisane w formularzu a w przypadku id?
daros17
tak, a jeśli chcesz z bazy pobrać id użytkownika to musisz pobrać dane z bazy za pomocą pętli np tak jak podałem Ci wyżej
przeczytaj również to
function.mysql-fetch-assoc
ZuyPan
A po co pętla? Pętli używa się np. przy newsach gdzie jest ich kilka a tu pobieramy dane jednego użytkownika więc pętli nie potrzeba.
daros17
Przecież oprócz id użytkownika pewnie będzie chciał pobrać login oraz jego hasło więc pętla jest jak najbardziej potrzebna
ZuyPan
A to dziwne, bo ja nigdy nie dawałem pętli w takich sytuacjach. Oto moje przykładowe logowanie w którym gdy pobieram dane z mysql owej pętli nie używam:
  1. <?php
  2. include ('config.php');
  3.  
  4. if ($_SESSION['zalogowano'] != '1'){
  5.  
  6. if ($_POST['username']){
  7. $username = addslashes(htmlspecialchars($_POST['username']));
  8. $username_b = 1;
  9. }else{
  10. $username_b = 0;
  11. $error .= '<font color="red">Proszę wpisać nazwę użytkownika!</font><br>';
  12. }
  13.  
  14. if ($_POST['password']){
  15. $password = addslashes(htmlspecialchars($_POST['password']));
  16. $password_b = 1;
  17. }else{
  18. $password_b = 0;
  19. $error .= '<font color="red">Proszę wpisać haslo!</font><br>';
  20. }
  21.  
  22. if ($username_b == 1 && $password_b == 1){
  23.  
  24. $query_a = "SELECT * FROM account WHERE login='$username' AND password = PASSWORD('$password')";
  25. $query_b = mysql_query($query_a);
  26. if (mysql_num_rows($query_b) == 1){
  27. $rekord = mysql_fetch_assoc($query_b);
  28. $account = 1;
  29. }else{
  30. $account = 0;
  31. $error .= '<font color="red">Wpisane dane nie pasują do żadnego użytkownika!</font><br>';
  32. }
  33.  
  34. if ($account == 1){
  35.  
  36. $_SESSION['zalogowano'] = 1;
  37. $_SESSION['login'] = $rekord['login'];
  38. $_SESSION['account_id'] = $rekord['id'];
  39. ?>
  40. <meta http-equiv="refresh" content="0; url=index.php">
  41. <?php
  42.  
  43. }
  44.  
  45. }
  46.  
  47. }else{
  48. $error .= '<font color="red">Jesteś już zalogowany!</font><br><a href="wyloguj.php"> Wyloguj! </a>';
  49. }
  50. echo $error;
  51. ?>


Taki kod zawsze mi działał bez pętli.
sadistic_son
ZuyPan ma rację. Ale oprócz tego to jeśli nadal chcesz pobrać tylko samo id, lub po prostu jedną wartość z tabeli bez zadnej petli itp i zapisac je do sesji to uzyj mysql_result:
  1. $sql=mysql_query("SELECT id FROM tabela WHERE login='$_POST[login]' AND password='$_POST[password]' LIMIT 1");
  2. $num=mysql_num_rows($sql);
  3. if($num>0){
  4. $_SESSION['login_id']=mysql_result($sql,0);
  5. }else{
  6. echo'podane haslo lub login sa bledne!';
  7. }
daros17
Można zrobić tak jak pokazałeś w kodzie, który umieściłeś, ale również można użyć pętli i efekt jest ten sam winksmiley.jpg
sadistic_son
Owszem, efekt jest ten sam i przy prostej bazie, z mala iloscia rekordow nie zrobi to roznicy. Ale przy poteznej bazie moga byc opoznienia. Moj sposob jest po prostu optymalniejszy moim zdaniem. Oczywiscie caly czas zakladajac ze mowimy o 1 wartosci z bazy. Bo jesli o wielu, np login, id itp. to zamiast mysql_result nalezy uzyc np mysql_fetch_array.
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.