Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Problem z setcookie
Forum PHP.pl > Forum > Przedszkole
panryz
Witam. Robie strone internetową gdzie mam panel logowania ktory wyciaga uzytkowników z bazy danych. Logowanie jest zapisywane na ciasteczkach a mimo to nie działa.
Oto plik z logowaniem
  1. <?php
  2.  
  3. $ciastko = isset($_COOKIE['twojastrona']);
  4.  
  5. if(isset($ciastko)){
  6.  
  7. require_once('config.php');
  8.  
  9. $query = "SELECT * FROM users WHERE haslo='$ciastko'";
  10. $result = mysql_query($query);
  11. $row = @mysql_fetch_assoc($result);
  12.  
  13. if($row){
  14.  
  15. $_SESSION['login'] = $row['login'];
  16. $_SESSION['haslo'] = $row['haslo'];
  17. //$_SESSION['data'] = $row['data'];
  18. //$_SESSION['id'] = $row['id'];
  19. echo'Zostałeś poprawnie <br>zalogowany na stronę<br />';
  20.  
  21. }
  22.  
  23. }
  24.  
  25. if ($_POST){
  26.  
  27. if(!empty($_POST["login"]) AND !empty($_POST["haslo"])){
  28.  
  29. require_once('config.php');
  30.  
  31. $login = czysc($_POST["login"]);
  32. $haslo = czysc($_POST["haslo"]);
  33.  
  34. $query = "SELECT * FROM users WHERE login='$login' AND haslo=md5('$haslo')";
  35. $result = mysql_query($query);
  36. $row = @mysql_fetch_assoc($result);
  37.  
  38. if ($row){
  39.  
  40. $_SESSION['login'] = $row['login'];
  41. $_SESSION['haslo'] = $row['haslo'];
  42. //$_SESSION['data'] = $row['data'];
  43. //$_SESSION['id'] = $row['id'];
  44.  
  45. if(isset($_POST['zapamietaj'])){
  46.  
  47. setcookie('twojastrona',$_SESSION['haslo'],time()+31536300);
  48.  
  49. echo'ustawiono ciastko<br />';
  50.  
  51. }
  52.  
  53. header("Location: index3.php");
  54.  
  55.  
  56. }else{
  57.  
  58. echo 'Nieprawidłowy login lub hasło<br />';
  59.  
  60. }
  61.  
  62. }else{
  63.  
  64. echo 'wpisz login i hasło<br />';
  65.  
  66. }
  67.  
  68. }
  69.  
  70. ?>


a to sprawdzanie czy cookie istnieje
  1. <?php
  2. if(isset($_COOKIE['twojastrona']))
  3. include("ocs.php") ;
  4. else
  5. echo 'nie jestes zalogowany';
  6. ?>


I okazuje sie ze loguje dobrze ale ciastek nie trzyma. Czy ktos potrafi temu zaradzic?
rocktech.pl
Witam.

Przeanalizuj pierwsze linijki ...

  1. /**
  2.  * @var boolean $ciastko zawsze równa się true lub false
  3.  */
  4. $ciastko = isset ( $_COOKIE['twojastrona'] );
  5. if ( isset ( $ciastko ) ) {
  6. /**
  7.  * To wyrażenie jest zawsze prawdziwe
  8.  */
  9. }
panryz
  1. $ciastko = $_COOKIE['twojastrona'];
  2.  
  3. if(isset($ciastko)){


tez nie dziala
rocktech.pl
Witam.

Tak.

  1. if ( isset( $_COOKIE['twojastrona'] ) ) {
  2. }


Tu jest źle bo sprawdzasz czy istnieje zmienna $ciastko która linijkę wcześniej zainicjowałeś!
  1. $ciastko = $_COOKIE['twojastrona'];
  2. if( isset( $ciastko ) ) {
  3. }


Jeżeli chcesz sprawdzić czy interpreter działa poprawnie smile.gif to ten warunek ma sens w innym przypadku będzie zawsze spełniony.
panryz
ale argument 'twojastrona' jest tworzony przy przycisnieciu logowanie, i potem w pliku sprawdzania jest przypisany co zmiennej, i potem sprawdzam. moze zle mysle, to prosze mnie nakierowac
Shido
Ciasteczko może być tworzone przy kliknięciu, chodzi tu o cos innego.

isset sprawdza czy zmienna istnieje ( ciasteczko również jest zmienną ) i zwraca true/false.
w tej wersji:
  1. $ciastko = isset($_COOKIE['twojastrona']);

tutaj zmienna $ciastko zostanie stworzona i przyjmie wartość true lub false
  1. if(isset($ciastko))
  2. {
  3. }

a tutaj zaraz sprawdzasz czy $ciastko istnieje, a skoro stworzyłeś je przed chwilą to ono zawsze będzie istniało.

To juz ci wczesniej wytłumaczyli.
Co do tego:
  1. $ciastko = $_COOKIE['twojastrona'];
  2. if( isset( $ciastko ) ) {
  3. }

Sytuacja jest taka sama, $ciastko zostanie stworzone, więc isset też będzie zawsze dawał w tym przypadku true, nieważne że zmienna jest pusta.
W tym wypadku opcje sa dwie tak jak ci pokazali:
  1. if ( isset( $_COOKIE['twojastrona'] ) ) {
  2. $ciastko = $_COOKIE['twojastrona'];
  3. }


lub jżeli sie uparłes by pierw deklarować $ciastko:

  1. $ciastko = $_COOKIE['twojastrona'];
  2. if( !empty( $ciastko ) ) {
  3. }

rocktech.pl
Przeanalizuj kod na spokojnie.

  1. $query = "SELECT * FROM users WHERE haslo='$ciastko'";
  2. echo $query;
wNogachSpisz
Cytat(rocktech.pl @ 22.06.2012, 08:37:32 ) *
  1. /**
  2.  * @var boolean $ciastko zawsze równa się true lub false
  3.  */
  4. $ciastko = isset ( $_COOKIE['twojastrona'] );
  5. if ( isset ( $ciastko ) ) {
  6. /**
  7.  * To wyrażenie jest zawsze prawdziwe
  8.  */
  9. }

Bzdura, to wyrażenie nie będzie zawsze prawdziwe, nie słuchajcie go.

http://php.net/isset
Cytat
isset — Determine if a variable is set and is not NULL

AND IS NOT NULL!

Więc tutaj będzie true lub false w zależności czy taki klucz cookie istnieje.
Akurat w tej częsci kodu wszystko jest w porządku.
nospor
@wNogachSpisz co ty za głupoty gadasz.... przeczytaj na spokojnie jeszcze raz posty wyjasniające i już się nie odzywaj bo leżysz na totalnych podstawach.
wNogachSpisz
Cytat(nospor @ 22.06.2012, 10:59:36 ) *
@wNogachSpisz co ty za głupoty gadasz.... przeczytaj na spokojnie jeszcze raz posty wyjasniające i już się nie odzywaj bo leżysz na totalnych podstawach.

Sam leżysz w podstawach. Co w tym co napisałem jest nie tak?
nospor
Wiesz co.....
odpal sobie te dwa kody
  1. $ar = array();
  2. $zm = isset($ar['cos']);
  3. if (isset($zm)) echo 'wNogachSpisz się nie zna na rzeczy';
  4.  

  1. $ar = array('cos'=>1);
  2. $zm = isset($ar['cos']);
  3. if (isset($zm)) echo 'wNogachSpisz się nie zna na rzeczy';
A potem idź się doucz dlaczego dwa razy na ekranie zobaczyłeś swój nick...
rocktech.pl
Spokojnie smile.gif

@wNogachSpisz

http://bd.php.net/manual/pl/function.isset.php

Cytat
Returns TRUE if var exists and has value other than NULL, FALSE otherwise.


isset zwróci zawsze true lub false!

A więc:
  1.  
  2. $ciastko = true;
  3.  
  4. if ( isset ( $ciastko ) ) {
  5. echo 'Zawsze prawdziwe';
  6. }
  7. $ciastko = false;
  8.  
  9. if ( isset ( $ciastko ) ) {
  10. echo 'Zawsze prawdziwe';
  11. }
wNogachSpisz
Cytat(rocktech.pl @ 22.06.2012, 09:26:02 ) *
  1. $ciastko = $_COOKIE['twojastrona'];
  2. if( isset( $ciastko ) ) {
  3. }


Jeżeli chcesz sprawdzić czy interpreter działa poprawnie smile.gif to ten warunek ma sens w innym przypadku będzie zawsze spełniony.


Bzdura. Ten warunek NIE BĘDZIE zawsze spełniony.

I kto leży w podstawach?

@nospor
Dobrze ci radze, skasuj profil i przestań się dalej kompromitować.
rocktech.pl
No tak tu się zgodzę, że się zagalopowałem.

  1. $_COOKIE['twojastrona'] = null;
  2.  
  3. $ciastko = $_COOKIE['twojastrona'];
  4.  
  5. if( isset( $ciastko ) ) {
  6. echo 'true';
  7. }
nospor
Cytat
Bzdura. Ten warunek NIE BĘDZIE zawsze spełniony.
LOL, przecież ty tym razem pokazałeś zupełnie inny kod, w którym oczywiscie nie zawsze będzie spełniony.... Ty nawet nie wiesz o jakim kodzie mowisz LOL
wNogachSpisz
Cytat(rocktech.pl @ 22.06.2012, 11:11:30 ) *
No tak tu się zgodzę , ze się zagalopowałem.

Nareszcie :-]

Może przejdźmy dalej z analizą kodu z pierwszego posta.

  1. $query = "SELECT * FROM users WHERE haslo='$ciastko'";
  2.  
  3. echo $query; // SELECT * FROM users WHERE haslo='1'

User zostanie zalogowany o ile jego hasło to "1".
nospor
Cytat
No tak tu się zgodzę , ze się zagalopowałem.

Nareszcie :-]
No, skoro rocktech się przyznał do błędu a ty sie z tego tak cieszysz, to jeszcze ty się przyznaj. Bo póki co zrobiłeś to po cichu, edytując pierwszego posta smile.gif


Cytat
oże przejdźmy dalej z analizą kodu z pierwszego posta.

pobierz, plaintext
$query = "SELECT * FROM users WHERE haslo='$ciastko'";

echo $query; // SELECT * FROM users WHERE haslo='1'

pobierz, plaintext

User zostanie zalogowany o ile jego hasło to "1".
Wcale nie. Przyjąłes, że kod wygląda teraz tak:
  1. $ciastko = $_COOKIE['twojastrona'];
  2.  
  3. if(isset($ciastko)){

A skoro kod wygląda tak, to $ciastko nie zawiera 1 a zawiera hasło pobrane wcześniej z bazy (a przynajmniej powinno zawierać). Więc błąd jest w innym miejscu smile.gif
wNogachSpisz
Cytat(nospor @ 22.06.2012, 11:25:05 ) *
A skoro kod wygląda tak, to $ciastko nie zawiera 1 a zawiera hasło pobrane wcześniej z bazy (a przynajmniej powinno zawierać). Więc błąd jest w innym miejscu smile.gif


No ok, czyli musimy w 13 linii dopisać:
  1. var_dump($query, $row);
nospor
Cytat
No ok, czyli musimy w 13 linii dopisać:
Nie koniecznie. Może się okazać że ciastko w ogóle nie jest tworzone (bo coś tam) i w ogóle w linie 13 kod nie wejdzie. Trzeba przeprowadzić normalną analizę, począwszy od włączenia wyświetlania wszystkich błędów, po kolejnym wyświetlaniu zmiennych.
Temat: Jak poprawnie zada pytanie
Shido
Ogólnie logowanie tyko po haśle jest bee ( bo co gdy np. kilku userów ma to samo haslo? ).

Co do nietrzymania ciasteczek, może je wcale nie tworzy?
Wielokrotnie miałem z tym problemy, zawsze pomagało na początku całego kodu dać

a na końcu:


Z tego co pamiętam to sa jakis uchwyty, nigdy nie zagłębiałem się co to tak do końca jest, ale pomaga przy ciasteczkach smile.gif
Z drugiej strony pomaga to jak sie pojawiają Warningi, a tu nic o nich pisane nie było, ale spróbowac warto.

@down
Nie widziałem, zacząłem pisać zanim napisałeś posta, w miedzyczasie szukałem tych uchwytów to mi zeszlo trochę.
nospor
Cytat
Co do nietrzymania ciasteczek, może je wcale nie tworzy?
I właśnie dlatego w poprzednim poście napisałem by włączyć wyświetlanie wszystkich błędów oraz wyświetlać wszystkie zmienne po kolei.
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.