Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MYSQL]Logowanie + sesje + mysql, problem z logowaniem
einstein
post 29.09.2008, 17:59:23
Post #1





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 28.09.2008

Ostrzeżenie: (0%)
-----


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.

Ten post edytował einstein 29.09.2008, 19:05:05
Go to the top of the page
+Quote Post
kaem
post 29.09.2008, 18:50:24
Post #2





Grupa: Zarejestrowani
Postów: 248
Pomógł: 38
Dołączył: 29.06.2008

Ostrzeżenie: (0%)
-----


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.

Ten post edytował kaem 29.09.2008, 18:50:38
Go to the top of the page
+Quote Post
Piniek
post 29.09.2008, 18:56:37
Post #3





Grupa: Przyjaciele php.pl
Postów: 463
Pomógł: 49
Dołączył: 27.12.2007
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Proszę o dodanie odpowiedniego tagu do tematu. Inaczej zostanie on zamknięty.

Pozdrawiam


--------------------
Go to the top of the page
+Quote Post
einstein
post 29.09.2008, 19:10:33
Post #4





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 28.09.2008

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
kaem
post 29.09.2008, 19:48:23
Post #5





Grupa: Zarejestrowani
Postów: 248
Pomógł: 38
Dołączył: 29.06.2008

Ostrzeżenie: (0%)
-----


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

Ten post edytował kaem 29.09.2008, 19:53:57
Go to the top of the page
+Quote Post
einstein
post 29.09.2008, 20:51:02
Post #6





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 28.09.2008

Ostrzeżenie: (0%)
-----


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.

Ten post edytował einstein 30.09.2008, 11:41:00
Go to the top of the page
+Quote Post
rodia
post 30.09.2008, 12:34:15
Post #7





Grupa: Zarejestrowani
Postów: 21
Pomógł: 5
Dołączył: 29.07.2008

Ostrzeżenie: (0%)
-----


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')."'";


Ten post edytował rodia 30.09.2008, 12:51:39


--------------------
Strony internetowe http://rodia.eu
Go to the top of the page
+Quote Post
melkorm
post 30.09.2008, 12:41:08
Post #8





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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)


--------------------
Go to the top of the page
+Quote Post
einstein
post 30.09.2008, 19:01:25
Post #9





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 28.09.2008

Ostrzeżenie: (0%)
-----


rodia zrobiłem tak jak pisałeś ale niestety ciągle taka sama reakcja. Może jeszcze jakaś propozycja?
Go to the top of the page
+Quote Post
rodia
post 30.09.2008, 21:02:36
Post #10





Grupa: Zarejestrowani
Postów: 21
Pomógł: 5
Dołączył: 29.07.2008

Ostrzeżenie: (0%)
-----


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ą

Ten post edytował rodia 30.09.2008, 21:06:03


--------------------
Strony internetowe http://rodia.eu
Go to the top of the page
+Quote Post
--einstein--
post 30.09.2008, 21:39:29
Post #11





Goście







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?
Go to the top of the page
+Quote Post
rodia
post 30.09.2008, 21:59:33
Post #12





Grupa: Zarejestrowani
Postów: 21
Pomógł: 5
Dołączył: 29.07.2008

Ostrzeżenie: (0%)
-----


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.


--------------------
Strony internetowe http://rodia.eu
Go to the top of the page
+Quote Post
einstein
post 30.09.2008, 22:13:47
Post #13





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 28.09.2008

Ostrzeżenie: (0%)
-----


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?:/
Go to the top of the page
+Quote Post
rodia
post 30.09.2008, 22:21:08
Post #14





Grupa: Zarejestrowani
Postów: 21
Pomógł: 5
Dołączył: 29.07.2008

Ostrzeżenie: (0%)
-----


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.


--------------------
Strony internetowe http://rodia.eu
Go to the top of the page
+Quote Post
einstein
post 30.09.2008, 22:28:13
Post #15





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 28.09.2008

Ostrzeżenie: (0%)
-----


to tak zastąpiłem kod twoim kodem i nie wyświetla mi żadnych błędów. Czyli połączenie z baza jest.
Go to the top of the page
+Quote Post
rodia
post 30.09.2008, 22:48:43
Post #16





Grupa: Zarejestrowani
Postów: 21
Pomógł: 5
Dołączył: 29.07.2008

Ostrzeżenie: (0%)
-----


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


--------------------
Strony internetowe http://rodia.eu
Go to the top of the page
+Quote Post
einstein
post 1.10.2008, 00:12:26
Post #17





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 28.09.2008

Ostrzeżenie: (0%)
-----


Już wszystko działa. Dzięki użytkownikowi rodia który znalazł błędy i je poprawił. Wielkie dzięki i pozdrawiam.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 4.07.2025 - 16:43