Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL]Logowanie + sesje + mysql
Forum PHP.pl > Forum > Przedszkole
einstein
Witam napisałem skrypt logowanie oparty na mysql i na sesjach lecz się nie uruchamia(nie wywala błędów). Oto on:
Formularz logowania:
Kod
<?PHP
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    
    session_start();
    
    if(isset($_POST['username']) && isset($_POST['password']))
    {
        $username = $_POST['username'];
        $password = $_POST['password'];
        
        $db_connect = new mysqli('localhost' , 'usa' , 'haslo', 'engtest');
        
        if(mysqli_connect_errno())
        {
            echo 'POŁĄCZENIE Z BAZĄ DANYCH NIE POWIODŁO SIE: '.mysqli_connect_error();
            exit();
        }
        
        $zapytanie = 'select * from member'
                     ." where username='$username' "
                     ." and password=sha1('$password')";
                    
        $result = $db_connect->query($zapytanie);
        if($result->num_rows > 0)
        {
            $_SESSION['prawid_uzyt'] =$username;
        }
        $db_connect->close();
        
    }
    
    ?>
    
    <HTML>
    <BODY>
    <BR><BR><BR><BR><BR><BR><BR><BR><BR>
    <?php
    
    if(isset($_SESSION['prawid_uzyt']))
    {
        echo 'Użytkownik zalogowany jako: '.$_SESSION['prawid_uzyt'];
    }
    
    else
    {
        if(isset($username))
        {
            echo 'Zalogowanie niemożliwe';
        }
        
        else
        {
            echo 'Użytkownik niezalogowany
    ';
        }
    }
    
    
      echo '<form method="post" action ="member.php">';
      
      echo '<center><TABLE frame="vsides" width = 216>';
      echo '<TR><TD><center>';
      echo '&nbsp;<IMG SRC="img/log.gif" WIDTH="199" HEIGHT="28" BORDER="0" ALT="LOGOWANIE">&nbsp;';
      echo '</center></TD>';
      
      echo '<TABLE frame="vsides" width = 216>';
      echo '<TR><TD><B><center>LOGIN:</center> </B></TD>';
      echo '<TD><B><center><input type="text" name="username" size = 10></center> </B></TD></TR>';
      echo '<TR><TD><B><center>HASŁO:</center> </B></TD>';
      echo '<TD><center><INPUT TYPE="password" NAME="password" size = 10></center></TD></TR>';
      echo '</center></TABLE></form>';
      echo'<INPUT TYPE="submit" value="Loguj">';
    ?>
      
     </BODY>
    </HTML>


Skrypt sprawdzający sesje:
Kod
<?php
  error_reporting(E_ALL);
  ini_set('display_errors', 1);
  
  session_start();
  if(isset($_SESSION['prawid_uzyt']))
  {
      header("Location: http://localhost/.../.../admin_pan.html");    
  }
  else
  {
      header("Location: http://localhost/.../.../logon_root.php");
  }
  ?>


Baza:
Kod
create database engtest;
  use member;
  
  create table member
  (username varchar(64) not NULL,
  haslo varchar(64) not null,
  mail varchar(100) not null,
  primary key(username)
  );
  
  insert into member values
  ('jacek' , sha1('jacek') , 'mail');

Sytuacja wygląda tak ze wpisuje login i hasło i ponownie zostaje przelogowany do formularz logowania. Nie wiem co mam zrobić. Siedziałem nad tym kodem i nie znalazłem żadnego błędu możne macie jakieś sugestie?

Bede naprawdę wdzięczny za pomoc. Pozdrawiam.
kaem
Nie przeglądałem tego Twojego całego skryptu ale co do tej linijki
  1. <?php
  2. ini_set('display_errors', 1);
  3. ?>

zobacz http://pl2.php.net/manual/pl/errorfunc.con....display-errors
a dokładnie
Cytat
Informacja: Although display_errors may be set at runtime (with ini_set()), it won't have any affect if the script has fatal errors. This is because the desired runtime action does not get executed.

czyli jeśli w skrypcie masz fatal error to zamierzony efekt(wyświetlanie errorów) nie zadziała, więc lepiej ustawić tą dyrektywę bezpośrednio w pliku konfiguracyjnym.
Piniek
Proszę o dodanie odpowiedniego tagu do tematu. Inaczej zostanie on zamknięty.

Pozdrawiam
einstein
W pliku konfiguracyjnym php.ini mam coś takiego:
Kod
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Error handling and logging;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; error_reporting is a bit-field.  Or each number up to get desired error
; reporting level
; E_ALL             - All errors and warnings (doesn't include E_STRICT)
; E_ERROR           - fatal run-time errors
; E_WARNING         - run-time warnings (non-fatal errors)
; E_PARSE           - compile-time parse errors
; E_NOTICE          - run-time notices (these are warnings which often result
;                     from a bug in your code, but it's possible that it was
;                     intentional (e.g., using an uninitialized variable and
;                     relying on the fact it's automatically initialized to an
;                     empty string)
; E_STRICT            - run-time notices, enable to have PHP suggest changes
;                     to your code which will ensure the best interoperability
;                     and forward compatibility of your code
; E_CORE_ERROR      - fatal errors that occur during PHP's initial startup
; E_CORE_WARNING    - warnings (non-fatal errors) that occur during PHP's
;                     initial startup
; E_COMPILE_ERROR   - fatal compile-time errors
; E_COMPILE_WARNING - compile-time warnings (non-fatal errors)
; E_USER_ERROR      - user-generated error message
; E_USER_WARNING    - user-generated warning message
; E_USER_NOTICE     - user-generated notice message


Wiec wygląda na to że wszystko jest ustawione ok. Co teraz?
kaem
Wkleiłeś fragment, który nic nam nie mówi, bo jest tylko opisem możliwych ustawień błędów
Ogólnie ustaw error_reporting na On i displays_errors też na On. U mnie te fragmenty pliku php.ini wyglądają tak:
Cytat
...
;error_reporting = E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR
;
; - Show all errors, except coding standards warnings
;
error_reporting = E_ALL
i
Cytat
; To output errors to STDERR with CGI/CLI:
;display_errors = "stderr"
;
; Default
;
display_errors = On

Pamiętaj, że średnik przed wierszem w php.ini oznacza, że ta linijka jest pomijana przez serwer.
Jak już będziesz miał tak ustawiony plik konfiguracyjny możesz wywalić ze skryptu
  1. <?php
  2.    ini_set('display_errors', 1);
  3. ?>
. Teraz ewentualne błędy powinny się wyświetlić chyba, że w skrypcie jest jakiś logiczny błąd, ale nie sprawdzałem, bo mam dzisiaj zły dzień hehe.


EDIT Offtopic:
Mój setny post! guitar.gif
einstein
Sprawdziłem i mam tak samo jak kaem w php.ini.
Wywaliłem także:
Kod
<?php
error_reporting(E_ALL);
     ini_set('display_errors', 1);
?>


Lecz nic to nie pomogło.

Już nie wiem co mam robić sciana.gif
Czy jeszcze ktoś ma jakieś pomysły?

Wydaje mi się że coś jest nie tak z zapamiętywaniem sesji skoro mnie przelogowuje. Jest gdzieś takie ustawienie w php.ini?


P.S. Czy mógłby ktoś przetestować mój skrypt u siebie? Będę naprawdę bardzo wdzięczny bo być możne coś jest nie tak z moim serwerem. Używam xampp'a.
rodia
Błąd masz w zapytaniu:
Kod
$zapytanie = 'select * from member'
                       ." where username='$username' "
                       ." and password=sha1('$password')";

nie możesz wywolac funkcji wewnątrz cudzysłowów, bo wewnątrz cudzysłowów mozesz używać tylko zmiennych. A druga sprawa, że brakuje apostrofów wokol funkcji sha1.
Efekt twojego zapytania jest taki, ze zmienna $zapytanie wygląda tak:
Kod
"select * from member where username='jan' and password=sha1('mojehaslo')";

Widzisz w zapytaniu masz SHA1(...) - a tu powinno być chyba coś innego czyli to co ta funkcja zwraca:
Kod
select * from member where username='jan'  and password='506da6907f960f50cad09ca45512519f91515237'


Czemu nie otrzymujesz błędów na ekranie? Ano dlatego, ze takowych nie ma. Bo twoje zapytanie SQL jest poprawne, tyle, ze w bazie nie znajdujesz rekordów spełniających warunki tego zapytania.


Powinno być tak:

Kod
$zapytanie = 'select * from member'
                       ." where username='$username' "
                       ." and password='".sha1('$password')."'";
melkorm
najszybciej to
  1. <?php
  2. var_dump('a');
  3. ?>
itp za warunkami itp wtedy pięknie widzisz przezco przechodzi skrypt winksmiley.jpg (mozesz ta mdać mzienną i widzisz co się dzieje ze zmeinną odrazu xP)
einstein
rodia zrobiłem tak jak pisałeś ale niestety ciągle taka sama reakcja. Może jeszcze jakaś propozycja?
rodia
Mowisz, ze jak sie logujesz to wyświetla i tak formularz logowania. No oczywiście przecież niezależnie od stanu zalogowania formularz jest zawsze wyświetlany w twoim kodzie, zobacz twoj kod:
Kod
   <?php
    
     if(isset($_SESSION['prawid_uzyt']))
     {
         echo 'Użytkownik zalogowany jako: '.$_SESSION['prawid_uzyt'];
     }
    
     else
     {
         if(isset($username))
         {
             echo 'Zalogowanie niemożliwe';
         }
        
         else
         {
             echo 'Użytkownik niezalogowany';
         }

     } // << TEN NAWIAS POWINIEN BYC DALEJ
    
    
       echo '<form method="post" action ="index.php">';
      
       echo '<center><TABLE frame="vsides" width = 216>';
       echo '<TR><TD><center>';
       echo '&nbsp;<IMG SRC="img/log.gif" WIDTH="199" HEIGHT="28" BORDER="0" ALT="LOGOWANIE">&nbsp;';
       echo '</center></TD>';
      
       echo '<TABLE frame="vsides" width = 216>';
       echo '<TR><TD><B><center>LOGIN:</center> </B></TD>';
       echo '<TD><B><center><input type="text" name="username" size = 10></center> </B></TD></TR>';
       echo '<TR><TD><B><center>HASŁO:</center> </B></TD>';
       echo '<TD><center><INPUT TYPE="password" NAME="password" size = 10></center></TD></TR>';
       echo '</center></TABLE></form>';
       echo'<INPUT TYPE="submit" value="Loguj">';

   // TUTAJ POWINIEN BYC TEN NAWIAS O KTORYM PISALEM WYZEJ

   ?>


Zauważ, że cały fragment wyświetlający formularz nie znajduje sie w klamrach {} poprzedniego warunku IF ani ELSE. W tym kodzie zaznaczylem ktory nawias trzeba przenieść w inne miejsce, żęby było dobrze.

Uruchomilem twoj kod u siebie i wprowadzilem tą zmianę o ktorej piszę wyżej i dziala tak, ze jak sie zaloguje to wyswietla sie komunikat "Użytkownik zalogowany jako:...." i formularz sie juz nie wyświetla. Rozumiem, że tak mialo byc
Aha, i ponieważ nie chcialo mi sie bazy tworzyć to do testow z twojego kodu wykroilem polaczenie z bazą i zastapilem sobie sprawdzeniem w kodzie php hasla i uzytkownika - pisze o tym zeby bylo wiadomo ze nie badalem poprawnosci kodu odpowiedzialnego za polaczenie z bazą
-einstein-
rodia zmieniłem ta klamrę ale dalej to samo więc podejrzewam ze coś nie tak ma z baza danych skoro u Ciebie działa. Czy jest jakaś funkcja która sprawdza czy dane z bazy zostały odczytane?
rodia
U ciebie wynik zapytania jest w zmiennej $result.
Mozesz sprawdzić czy nie wystapil błąd funkcją is_resource($result) - zwraca true jeżeli w $result jest poprawny wynik i zwraca false jak w wystapil blad podczas pracy z baza.

Jeśli chcesz mieć pewność, że cokolwiek z bazy zostanie na pewno odczytane (nieważne czy nazwa użytkownika i haslo sie zgadzają - to pominmy do testow) to zmień zapytanie :
$zapytanie = 'select * from member'
." where username='$username' "
." and password=sha1('$password')";

na:
$zapytanie = 'select * from member where 1";

Wtedy na 100% wczytają sie wszystkie rekordy a dalszy warunek na pewno zwróci prawdę "$result->num_rows > 0"
jeżeli jednak to nie pomoże to znaczy, ze rzeczywiście połączenie z bazą szwankuje.
einstein
Wszystko sprawdzilem i dalej nic. Gdy używam funkcji is_resource($result) nie otrzymuje zadnego wyniku.

Zmiana mojego zapytania na $zapytanie = 'select * from member where 1"; tez nic nie zmieniła. Wiec coś jest z baza danych. Teraz tylko co?:/
rodia
Zamiast twojego kodu do łącznia z bazą wstaw ten:
Kod
$db = mysql('localhost' , 'usa' , 'haslo');
if (!$db)
    die("nie połączono z bazą");
    mysql_select_db('engtest', $db);

$result = mysql_query($zapytanie, $db);
if (!$result)
    die ("Błędny rezultat zapytania");

if (mysql_num_rows($result)>0)
..........................................i dalej tak jak u ciebie


Jak uruchomisz ten kod to w razie niepowodzenia wyświetli ci sie czy problem jest w połączeniu z bazą czy w wyniku zapytania.
einstein
to tak zastąpiłem kod twoim kodem i nie wyświetla mi żadnych błędów. Czyli połączenie z baza jest.
rodia
podaj mi adres serwera mySql to sprawdze co jest nie teges. chodzi o nazwę ktorą wpisuej się tam gdzie w funkcji mysql_connect jest wpisane "localhost", podaj na gg: 8903696
einstein
Już wszystko działa. Dzięki użytkownikowi rodia który znalazł błędy i je poprawił. Wielkie dzięki i pozdrawiam.
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.