Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php]problem z if'em
Forum PHP.pl > Forum > Przedszkole
sweter
Tak wygląda fragment strony odpowiedzialny za logowanie:
Kod
if(!$_SESSION['login']){
                   echo "<form action=\"log/login.php\">
                    <table width=\"100\" border=\"0\">
                                         <tr>
                                              <td><font style=\"color:white; font-size:11px;\">Login:</font></td>
                                              <td><input type=\"text\" size=\"12\" name=\"login\" style=\"font-family:Tahoma; color:#337FBD; font-size:11px;\" /></td>
                                         </tr>
                                         <tr>
                                              <td><font style=\"color:white; font-size:11px;\">Hasło:</font></td>
                                              <td><input type=\"password\" name=\"haslo\" size=\"12\" style=\"color:#337FBD; font-size:11px;\" /></td>
                                         </tr>
                                         <tr>
                                              <td colspan=\"2\"><center><input type=\"submit\" style=\"font-family:Arial; font-size:11px;\" value=\"Zaloguj się\" /></center></td>
                                         </tr>
                                    </table>
                                   </form>";
                                   }else{
                       echo "<a href=\"log/logout.php\">Wyloguj się</a>";
                      }

Tu mam do was pytanie: czemu nawet jak użytkownik jest zalogowany nie pojawia mi się napis "Wyloguj się"?
patryczakowy
a spróbuj tak
  1. <?php
  2. if(!isset($_SESSION['login'])){
  3. ?>
i czy na początku pliku masz session_start();
sweter
Niestety nie pomogło sad.gif
mam na początku session_start()
patryczakowy
To pokaż więcej kodu bo z warunkiem jest ok pewnie jakas literówka czy coś
sweter
Odwołanie do sesji wygląda tak:
Kod
session_start();
$login = $_SESSION['login'];

więc chyba nie ma mowy o literówce
decha-design
Mam takie pytanie? Co do jest?
  1. <?php
  2. $login = $_SESSION['login'];
  3. ?>


Tutaj przypisujesz do $login wartość $_SESSION[login] ... nie odwrotnie ... a jednak wydaje mi się, żę ty tak myślisz ...

Czy $_SESSION[login] ma jakąś wartość? Wątpie ...

i pokaż WIĘCEJ KODU
patryczakowy
nie wyświetla się "wyloguj się" ponieważ zawsze jest spełniony warunek tzn niema zmiennej sesji więdz lepiej pokaż plik login.php bo to co przesłałeś to chyba nie jest zainicjowanie sesji a jeśli jest to musi być na odwrót do zmiennej sesji zapisujesz zmienną login a nie na odwrut
sweter
Plik login.php wygląda tak:
Kod
<?php
session_start();
$_POST['$login'] = strip_tags($_POST['$login']);
$_POST['$haslo'] = strip_tags($_POST['$haslo']);
$_POST['$login'] = trim($_POST['$login']);
$_POST['$haslo'] = trim($_POST['$haslo']);
$_POST['$login'] = addslashes($_POST['$login']);
$_POST['$haslo'] = addslashes($_POST['$haslo']);
$_POST['$login'] = htmlspecialchars($_POST['$login']);
$_POST['$haslo'] = htmlspecialchars($_POST['$haslo']);
$pol = @mysql_connect("localhost","root","krasnal");
echo $login;
   if (!$pol) {
     echo "nie można się połączyć z bazą danych!";
     exit;
   }
$wyb = @mysql_select_db("mojabaza");
   if (!$wyb) {
     echo "nie można wybrać bazy danych!";
     exit;
   }
$haslo = sha1($haslo);

   $zap = "SELECT * FROM `uzytkownicy` WHERE login='$login' AND haslo='$haslo'";
   $wyn = @mysql_query($zap);
   print mysql_error();
   $ile = @mysql_num_rows($wyn);
     if ($ile=="1") {
       $tekst = "Logowanie powiodło się!
$zap";
       $przenies = "<meta http-equiv=\"Refresh\" content=\"1; strona.php\">";
       $_SESSION['login'] = $login;
       $_SESSION['haslo'] = $haslo;
       $zap = "SELECT * FROM `uzytkownicy` WHERE login='$login' AND haslo='$haslo'";
       $wyn = mysql_query($zap);
       while($wiersz = mysql_fetch_row(($wyn))){
         $img = $wiersz[3];
       }
     }else{
       $tekst = "Logowanie nie powiodło się!
$login
$haslo";
     }
    
     /*zalogowani użytkownicy*/
     $q = mysql_query('select * from zalogowani;');
if(mysql_num_rows($q)==12){
    $q = mysql_query('delete from zalogowani where login = "'.$login.'";');
    if(mysql_affected_rows($q)==0){
        $q = mysql_query('delete from zalogowani order by id ASC limit 1');
    }
}
$q = mysql_query('insert into zalogowani(login, img) VALUES("'.$login.'","'.$img.'");');
   mysql_close($pol);
  
   echo $tekst;    
?>
decha-design
$_POST['$login']; co to w ogole jest? jak już to $_POST['login'] ... bo tamto i tak jest puste ...

Po drugie ... co Ci zwraca $login? Bo jak masz wylączone register_globals to jest puste ... poza tym, nie widzę, w pliku przypisania do $login = $_POST['login'], więc raczej jest puste ... zawsze korzystaj z $_POST[] ... nie z krótkich nazwa, czy jak to zwał ...
To samo z hasłem ...

$haslo = sha1($haslo); moim zdaniem mieszasz tutaj pustą zawartość (czyt. '') ...

Poza tym ... $ile=="1", czy jedynka musi być konwertowana na string skoro jest w int? $ile == 1, a raczej $ile > 0

Zamotałeś strasznie ten kod =)
sweter
decha-design nie bardzo cię zrozumiałem. Poniżej jest nowy kod.
Kod
<?php
session_start();
$_POST['$login'] = strip_tags($_POST['$login']);
$_POST['$haslo'] = strip_tags($_POST['$haslo']);
$_POST['$login'] = trim($_POST['$login']);
$_POST['$haslo'] = trim($_POST['$haslo']);
$_POST['$login'] = addslashes($_POST['$login']);
$_POST['$haslo'] = addslashes($_POST['$haslo']);
$_POST['$login'] = htmlspecialchars($_POST['$login']);
$_POST['$haslo'] = htmlspecialchars($_POST['$haslo']);
$pol = @mysql_connect("localhost","root","krasnal");
   if (!$pol) {
     echo "nie można się połączyć z bazą danych!";
     exit;
   }
$wyb = @mysql_select_db("mojabaza");
   if (!$wyb) {
     echo "nie można wybrać bazy danych!";
     exit;
   }
  
$_POST['$haslo'] = sha1($_POST['$haslo']);

   $zap = 'SELECT * FROM `uzytkownicy` WHERE login="'.$_POST['$login'].'" AND haslo="'.$_POST['$haslo'].'"';
   $wyn = @mysql_query($zap);
   print mysql_error();
   $ile = @mysql_num_rows($wyn);
     if ($ile>1) {
       $tekst = "Logowanie powiodło się!
$zap";
       $przenies = "<meta http-equiv=\"Refresh\" content=\"1; strona.php\">";
       $_SESSION['login'] = $_POST['$login'];
       $_SESSION['haslo'] = $_POST['$haslo'];
     }else{
       $tekst = "Logowanie nie powiodło się!
".$_POST['$login']."
".$_POST['$haslo'];
     }
   echo $tekst;    
?>

Jednak teraz nie mogę się zalogować, bo zmienna $login jest pusta.
decha-design
omg ... nie $_POST['$login'] a $_POST['login']! i alternatywnie do hasła ...

a najlepiej to zrób sobie print_r($_POST); i zobacz co zwraca sleep.gif'
sweter
OK, uporządkowałem cały kod. Oto plik login.php:
Kod
<?php
session_start();

$login = strip_tags(trim(addslashes(htmlspecialchars($_POST['login']))));
$haslo = strip_tags(trim(addslashes(htmlspecialchars($_POST['haslo']))));

$pol = @mysql_connect("localhost","root","krasnal");
  if (!$pol) {
    echo "nie można się połączyć z bazą danych!";
    exit;
  }
$wyb = @mysql_select_db("siedlczanin");
  if (!$wyb) {
    echo "nie można wybrać bazy danych!";
    exit;
  }
  
$_POST['haslo'] = sha1($_POST['haslo']);
if($_POST['haslo']!=NULL AND $_POST['login']!=NULL){
  $zap = "SELECT * FROM `uzytkownicy` WHERE login='$login' AND haslo=$haslo";
  $wyn = @mysql_query($zap);
  print mysql_error();
  $ile = @mysql_num_rows($wyn);
    if ($ile==1) {
      $tekst = "Logowanie powiodło się!<br>$zap<br>$login";
      $_SESSION['login'] = $login;
    }else{
      $tekst = "Logowanie nie powiodło się! <br>$login<br>$haslo<br> $zap";
    }
  }
  echo $tekst;
  print_r($_POST);    
?>


Jednak dalej nie działa mi if, o którym wspomniałem na początku.
Nawet jeżeli wpisuję przed if'a "print_r($_SESSION)", to nie wyświetla mi się nic(nawet samo "Array()"!).
A może ma znaczenie to, że ten plik z if'em jest zaincludowany questionmark.gif
patryczakowy
Najpierw robisz
  1. <?php
  2. $haslo = strip_tags(trim(addslashes(htmlspecialchars($_POST['haslo']))));
  3. ?>

póżniej
  1. <?php
  2. $_POST['haslo'] = sha1($_POST['haslo']);
  3. ?>

a do bazy pytasz sieę
  1. SELECT * FROM `uzytkownicy` WHERE login='$login' AND haslo=$haslo


zamień drógi kod na
  1. <?php
  2. $haslo = sha1($_POST['haslo']);
  3. ?>

powinno pomóc poprustu inną zmieną haszujesz a inną dajesz w zapytaniu

acha i zapomniałem po shaszowaniu zmienna hasło jest stringiem więc powinno być
  1. SELECT * FROM `uzytkownicy` WHERE login='$login' AND haslo='$haslo'


zmienna w cudzysłowiu i umnie działa
sweter
Ok, już sobie poradziłem z problemem w login.php.
Jednak wracając do głównego tematu tego wątku:
zauważyłem, że problem z tą pętlą:
Kod
<?php
if(!isset($_SESSION['login'])){
?>

jest taki, że znajduje się ona w zaincludowanym pliku, a tam sesje nie sięgają. Jak to naprawić?
decha-design
Mam takie pytanie ...

Czemu ma to slużyć?
  1. <?php
  2. $haslo = strip_tags(trim(addslashes(htmlspecialchars($_POST['haslo']))));
  3. ?>
skoro póżniej jest
  1. <?php
  2. $_POST['haslo'] = sha1($_POST['haslo']);
  3. ?>
... więc zmienna $hasło ma przypisaną wartość po przerobieniu przez te funkcje, a $_POST['haslo'] jest wymieszane przy pomocy sha1
Zapamiętaj $haslo nie równa się $_POST['haslo'] ... chyba, że przypiszesz $hasło = $_POST['haslo'] i będziesz korzystal poźniej tylko z $haslo, a nie na przemian bo tak sobie umyślałeś ...

Powinno być
  1. <?php
  2. $_POST['haslo'] = strip_tags(trim(addslashes(htmlspecialchars($_POST['haslo']))));
  3. ?>

A najlepiej zrób to w funkcji, aby nie przepisywać tego ponownie dla loginu etc.

i wtedy $_SESSION['login'] = $_POST['login'] ... i powinno działać sleep.gif'
sweter
Jak już napisałem:
Cytat
Ok, już sobie poradziłem z problemem w login.php.
Jednak wracając do głównego tematu tego wątku:
zauważyłem, że problem z tą pętlą:
Kod
<?php
   if(!isset($_SESSION['login'])){
   ?>

jest taki, że znajduje się ona w zaincludowanym pliku, a tam sesje nie sięgają. Jak to naprawić?
decha-design
ponoć print_r zwraca ci pusty wynik, tak? ...

to
  1. <?php
  2. $_SESSION['login'] = $login
  3. ?>
zamień na
  1. <?php
  2. $_SESSION['login'] = $_POST['login']
  3. ?>
... do jasnej cho%$#% ...
sweter
jak już napisałem, ale dla większej pewności powtórzę: Z PLIKIEM LOGIN.PHP JUŻ SOBIE PORADZIŁEM.
Sesje mi działają i jest prawie cacy, bo jedynie warunek
Kod
<span class="postcolor"><?php
    if(!isset($_SESSION['login'])){
    ?></span>

nie może zostać spełniony, bo jest w zaincludowanym pliku.
Inaczej mówiąc mam sobie plik strona.php w którym jest
Kod
session_start();
$login = $_SESSION['login'];
/* Zmienna $_SESSION['login'] zawiera wartość! */

Dopiero tutaj zaczynają się problemy, bo do powyższego pliku podłączyłem za pomocą funkcji incluce_once() plik logowanie.php, w którym jest warunek if, który nie chce mi działać.
W pliku strona.php na chwilę podmieniłem zamiast funkcji include_once() if'a i okazało się , że wszystko gra!
Czyli mój problem ogranicza się do zwiększenia zasięgu zmiennej $_SESSION['login'], tak aby była dostępna w pliku logowanie.php smile.gif
patryczakowy
w każdym pliku możesz dać session_start(); i na pewno będzie wszędzie widoczna
decha-design
w pliku logowanie.php daj session_start() ... również ...

Powinno pomóc, bo czasami nie wystarczy w nadrzędnym pliku ... w includowanych też muszą być

I nadal nie rozumiem tego $login = $_SESSION['login']; ... skoro nie korzystasz z $login ...
sweter
Cytat
w pliku logowanie.php daj session_start() ... również ...

Powinno pomóc, bo czasami nie wystarczy w nadrzędnym pliku ... w includowanych też muszą być

Niestety nie pomogło sad.gif

Cytat
I nadal nie rozumiem tego $login = $_SESSION['login']; ... skoro nie korzystasz z $login ...

To powinno być samo $_SESSION['login']?
decha-design
Czyli w includowanym pliku tablica globalna $_SESSION jest pusta, tak?

Warunek powinien byc poza tym
  1. <?php
  2. if(!empty($_SESSION['login'])) {
  3. ?>
sweter
Ale teraz, bez względu na to, czy jestem zalogowany, czy nie, ciągle mi się pojawia to co jest za else, czyli "Wyloguj się"
sad.gif
decha-design
sorki, źle Ci podałem ... zapomniałem juz jaką masz tam strutkure tego skryptu ... usuń ! z warunku ...
sweter
nie działa...
sad.gif sad.gif sad.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.