Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php]Skrypt logowania nie chce działać
Forum PHP.pl > Forum > Przedszkole
zurek
Jestem początkującym programistą PHP. Chciałem napisać skrypt logowania na swojej stronie z użyciem sesji na podstawie książki, z której się uczę. Poniżej przedstawiam kod tego skryptu:

To jest add_admin.php, który dodaje administratorów do bazy danych:



  1. <?
  2.  
  3. //połączenie z bazą danych
  4. require_once('../mysql_connect.php');
  5.  
  6. //funkcja wstawiaąca przed znakami specjalnymi znak odwrotnego ukośnika.
  7.  
  8. function escape_data ($data){
  9.  
  10. //Potrzebne połączenie
  11. global $dbc;
  12.  
  13. if(ini_get('magic_quotes_gpc')){
  14. $data = stripslashes($data);
  15. }
  16.  
  17. return mysql_real_escape_string(trim($data), $dbc);
  18. }
  19.  
  20. //tablica typu array na błędy
  21. $errors = array();
  22.  
  23. if($_POST['wyslij']){
  24.  
  25. //sprawdzanie, czy wszystkie pola są wypełnione
  26.  
  27. //nazwa admina
  28. if(empty($_POST['name'])){
  29. $errors[] = "Nie podano nazwy admina.";
  30. }
  31. else{
  32. $name = escape_data($_POST['name']);
  33. }
  34.  
  35. //email
  36. if(empty($_POST['email'])){
  37. $errors[] = "Nie podano adresu e-mail admina.";
  38. }
  39. else{
  40. $email = escape_data($_POST['email']);
  41. }
  42.  
  43. //haslo
  44. if(empty($_POST['password'])){
  45. $errors[] = "Nie podano hasła admina.";
  46. }
  47. else{
  48. $password = escape_data($_POST['password']);
  49. }
  50.  
  51. //jeśli nie ma błędów
  52. if(empty($errors)){
  53.  
  54. //zapytanie
  55. $query = "INSERT INTO admins (name, email, password, date) VALUES ('$name', '$email', SHA('$password'), NOW())";
  56. $result = mysql_query($query);
  57.  
  58. //jeśli zapytanie zostało przyjęte
  59. if($result){
  60. print "Dodano nowy rekord do bazy danych.";
  61. }
  62. else{
  63. print "Nie można dodać nowego rekordu do bazy danych z powodu prawdopodobnych błęd
    ów w serwisie."
    ;
  64. }
  65.  
  66. }
  67. //a jeśli błędy są
  68. else{
  69. print 'Wystąpiły następujące błędy w formularzu: <br/><br/>';
  70.  
  71. foreach($errors AS $raport){
  72. print " - $raport <br/>";
  73. }
  74. }
  75.  
  76. }
  77.  
  78. ?>


A to jest plik logowanie.php:

  1. <?
  2.  
  3. //jeśli formularz został wysłany
  4. if($_POST['wyslij']){
  5.  
  6. //połączenie z bazą danych
  7. require_once('../mysql_connect.php');
  8.  
  9. //////////////////////FUNCTION ESCAPE DATA//////////////////////////////
  10.  
  11. //funkcja wstawiaąca przed znakami specjalnymi znak odwrotnego ukośnika.
  12.  
  13. function escape_data ($data){
  14.  
  15. //Potrzebne połączenie
  16. global $dbc;
  17.  
  18. if(ini_get('magic_quotes_gpc')){
  19. $data = stripslashes($data);
  20. }
  21.  
  22. return mysql_real_escape_string(trim($data), $dbc);
  23. }
  24. ////////////////////KONIEC FUNKCJI ESCAPE DATA//////////////////////////
  25.  
  26. //tablica typu array przechowująca błędy
  27. $errors = array ();
  28.  
  29. //sprawdzanie pól formularza
  30.  
  31. //email
  32. if(empty($_POST['email'])){
  33. $errors [] = "Nie podano adresu mailowego.";
  34. }
  35. else{
  36. $email = escape_data($_POST['email']);
  37. }
  38.  
  39. //haslo
  40. if(empty($_POST['password'])){
  41. $errors [] = "Nie podano hasła.";
  42. }
  43. else{
  44. $password = escape_data($_POST['password;']);
  45. }
  46.  
  47. //jeśli nie ma błędów
  48. if(empty($errors)){
  49.  
  50. //pobranie identyfikatora administratora i nazwy do kombinacji loginu i hasła
  51. //zapytanie
  52. $query = "SELECT admin_id, name FROM admins WHERE email='$email' AND password=SHA('$password')";
  53. $result = @mysql_query($query);
  54. $row = mysql_fetch_array($result, MYSQL_NUM);
  55.  
  56. //jeśli zapytanie zwróciło jakiś rekord
  57. if($row){
  58.  
  59. /////////////////////////////USTAWIENIE SESJI///////////////////////////
  60. //ustawienie danych sesji
  61.  
  62. $_SESSION['admin_id'] = $row[0];
  63. $_SESSION['name'] = $row[1];
  64.  
  65. ///////////////////////KONIEC USTAWIANIA SESJI//////////////////////////
  66.  
  67. //przekierowanie do strony loggedin.php
  68. //definicja adresu URL
  69.  
  70. ///////////////////////////DEFINICJA ADRESU URL ////////////////////////
  71.  
  72. $url = 'http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']);
  73.  
  74. //sprawdzenie końcowego ukośnika
  75.  
  76. if((substr($url, -1) == '/') OR (substr($url, -1) == '//')){
  77.  
  78. //definicja adresu URL - ciąg dalszy
  79. //odcinamy ukośnik
  80. $url = substr($url, 0, -1);
  81. }
  82.  
  83. //definicja adresu URL - ciąg dalszy
  84. //dodanie strony
  85. $url .= './loggedin.php';
  86.  
  87. ////////////////////KONIEC DEFINICJI ADRESU URL ////////////////////////
  88.  
  89. //przekierowanie do wcześniej zdefiniowanego adresu url
  90. header("Location: $url");
  91.  
  92. exit(); //koniec działania skryptu
  93.  
  94. } //koniec klauzuli wyyrażenia warunkowego if($row)
  95.  
  96. //a jeśli zapytanie nie zwróciło żadnego rekordu
  97. else{
  98. print "Wprowadzony login i hasło są niepoprawne.";
  99. }
  100.  
  101.  
  102. } //zamknięcie klałzuli wyrażenia warunkowego if(empty($errors))
  103.  
  104. //koniec połączenia z bazą danych
  105.  
  106.  
  107. } //zamknięcie klałzuli wyrażenia warunkowego if($_POST['wyslij'])
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114. ?>




Problem jest następujący. Gdy dodaję admina i wpisuję jego odpowiednie dane, do panelu logowania wyświetla mi się za każdym razem:

Cytat
Wprowadzone dane są niepoprawne!


Tabela bazy danych admins została utworzona w serwisie cba.pl przez PHPMyAdmina.
drPayton
1. Popraw BBCode na php, będzie łatwiej czytać
2. Co to są "klałzule"?
3. $_POST['email;'] - wywal średnik
4. Tego nie jestem pewien, ale chyba raczej SHA1 ?!?
  1. VALUES ('$name', '$email', SHA('$password'), NOW())";


Na razie tyle, popraw i sprawdź rezultat (najpierw na nowo dodaj usera)
zurek
Niestety dalej to samo. Poprawiłem te błędy i dalej jest to samo...
markotny
Nie rozumiem dlaczego tak skomplikowałeś cały algorytm logowania na strone. Dane login hasła użytkownik wpisuje w formularzu przesyłasz na strone z przekierowaniem zwrotnym gdzie pobierasz z mysql hasło dla danego loginu. Sprawdzasz czy obie zmienene są równe i ustawiasz użytkownika jako zalogowanego.
Ja taki system stosuję i chodzi szybko i sprawnie bez tak rozbudowanego kodu.
Pozdrowienia

P.S. Rozbudowana złożoność kodu nie świadczy o większej umiejętności programowania, a wręcz odwrotnie. smile.gif
zurek
Cytat(markotny @ 5.09.2007, 20:13:53 ) *
P.S. Rozbudowana złożoność kodu nie świadczy o większej umiejętności programowania, a wręcz odwrotnie. smile.gif

Dobrze o tym wiem. Ale ja jestem narazie amatorem i nie umiem dokładnie i skutecznie zoptymalizować kodu php. Jak na początku mówiłem, ten kod jest napisay z pomocą książki.

markotny, czy możesz dokładniej mi to wytłumaczyć, bo ja za bardzo jeszcze tych wszystkich pojęć nie kapuję (np. przekierowanie zwrotne).
Krzysztof Klimonda
Pokaż co siedzi w admins (select * from admins;) bo kod (przynajmniej ten z logowanie.php) wygląda w porządku nie licząc średnika o którym pisał drPayton (bo np. SHA() i SHA1() są równoznaczne z tego co pamiętam).. no może za dużo komentarzy i brak wcięć ale to nie stanowi problemu (dla parsera bo czyta się to jak dziennik ustaw ;] ).

EDIT:

to nie jest powód ale zamień
if($_POST['wyslij']) {
na
if(isset($_POST['wyslij'])) {

a dodatkowo ustaw parser php by wyświetlał wszystkie błędy, warningi i inne informacje (info jak to zrobić jest na forum na pewno).
markotny
Przekierowanie zwrotne - ja tak to sobie nazywam - polega na tym że formularz logowania jest na stronie np. index.php jest tam formularz gdzie wysyłane dane wysyłasz na strone logowanie.php. Tam zachodzi cały proces zapisywania zmiennych, ustawiania sesji, pobierania danych z mysql'a, sprawdzania poprawności logowania i ustawiania statusu zalogowanego, ale jak na wtępie strony w nagłówku wpszesz
<?
header ("Location:index.php");
?>
to wrócisz na strone główna jako zalogowany smile.gif

Nie wiem czy da się to jakoś inaczej wytłumaczyć. smile.gif
zurek
Mniej więcej wiem o co chodzi. Jednak nie rozumiem jak teoretycznie poprawny skrypt nie może działać. Błąd napewno jest gdzieś w porównywaniu adresu mailowego i hasła. To jest niemożliwe! Bazę danych mam raczej poprawną.
Krzysztof Klimonda
To wstaw po 52 linijce print $query;, z 53 linijki usuń @ i odpal jeszcze raz - może wyrzuci błąd ew. po zawartości zapytania dojdziesz co jest nie tak.. albo po prostu wkleisz i będziemy dochodzić (sic!) wpólnymi siłami ;]
zurek
Przeglądnałem jeszcze raz cały kod i zauważyłem w linii 44 niepotrzebny średnik. I chyba się teraz udało.
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.