Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [HTML][PHP]Formularz rejestracji i logowania bez bazy danych
Forum PHP.pl > Forum > Przedszkole
badowl
Witam mam pewien problem. To treść zadania z książki którą czytam:

"Napisz program, który zapyta użytkownika nazwę użytkownika oraz hasło.
(...)Nazwa użytkownika oraz nowe hasło powinny być przechowywane w pliku o nazwie
db.password. Następnie Utwórz program PGP pytający o nazwę użytkownika oraz hasło
i wpuszczający użytkownika tylko wtedy, gdy poda on prawidłowe dane.
Jeśli dane uwierzytelniające będą prawidłowe należy wyświetlić zawartość pliku datebook."

Plik index.php:
  1. <?php
  2. if (isset($_POST['submit'])){
  3. $login = $_POST['login'];
  4. $pass = $_POST['pass'];
  5. $pass1 = $_POST['pass1'];
  6. if($pass === $pass1){
  7. $filename = "$_SERVER[DOCUMENT_ROOT]/file/bd.password";
  8. $file = fopen($filename, 'r+');
  9. $nowy = $login . " " . $pass . "\r\n";
  10. $filehandle = fopen($filename, 'ab');
  11. fwrite($filehandle, $nowy, strlen($nowy));
  12. print " rejstracja powiodła się! za 2 sekund zostaniesz automatycznie przekierowany do strony logowania.";
  13. header("Refresh: 2; URL=index2.php");
  14. }
  15. else{
  16. echo "Podane hasła muszą być identyczne!";
  17. header("Refresh: 2; URL=index.php");
  18. }
  19. }
  20. else {
  21. ?>
  22. Jeśli nie masz konta utwórz je!
  23. <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method='post'>
  24. login
  25. <input type="text" name="login" /> <br />
  26. hasło
  27. <input type="password" name="pass" /> <br />
  28. powtórz hasło
  29. <input type="password" name="pass1" /> <br />
  30. <input type="submit" name="submit" value="rejestruj" />
  31. </form>
  32. Jeśli masz już konto kliknij <a href="index2.php">tutaj</a> aby sie zalogować.
  33. <?php
  34. }
  35. ?>


Plik index2.php
  1. <?php
  2. if (isset($_POST['submit'])){
  3. $login = trim($_POST['login']);
  4. $pass = trim($_POST['pass']);
  5. $password = "$_SERVER[DOCUMENT_ROOT]/file/bd.password";
  6. $list = file($password);
  7. $count = 0;
  8. foreach($list as $key => $val){
  9. $log = explode(' ', $val);
  10. if(strcasecmp($login, $log[0]) == 0 && strcasecmp($pass, $log[1]) == 0){ //// PRAWDOPODOBNIE COŚ TU JEST ŹLE.
  11. $filename = "$_SERVER[DOCUMENT_ROOT]/file/datebook";
  12. $text = file_get_contents($filename);
  13. echo $text;
  14. $count++;
  15. }
  16. }
  17. if($count == 0){
  18. print "Użytkownik $login nie istnieje w bazie! Zarejstruj się!";
  19. }
  20. }
  21. else {
  22. ?>
  23. Wpisz nazwę użytkownika i hasło.
  24. <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method='post'>
  25. login
  26. <input type="text" name="login" /> <br />
  27. hasło
  28. <input type="password" name="pass" /> <br />
  29. <input type="submit" name="submit" value="loguj" />
  30. </form>
  31. <?php
  32. }
  33. ?>


Zawartość pliku db.password
Kod
uzytkownik1 haslo1
uzytkownik2 haslo2


Zawartość pliku datebook:
Kod
Imie Nazwisko dd\mm\rrrr Adres
Imie2 Nazwisko2 dd\mm\rrrr Adres2


Wie ktoś na czym polega błąd?
Pozdrawiam smile.gif
zend
Ok, napiszesz coś o błędzie czy mamy się sami domyślać?
badowl
z rejestracją jest wszystko ok. Nazwa Użytkownika i hasło się dodają. Problem jest przy logowaniu. Jeśli wpisze się złe dane to wyświetla się komunikat że użytkownik nie istnieje ale kiedy się dobrze poda dane do nie dzieje się nic sad.gif( Pusta strona.


Gdy w pliku index2.php w lini 10 zamiast
  1. if(strcasecmp($login, $log[0]) == 0 && strcasecmp($pass, $log[1]) == 0){

wpisze się
  1. if(strcasecmp($login, $log[0]) == 0){

I przy logowaniu poda dobrą nazwę użytkownika to wszystko jest ok
zend
  1. ini_set('display_errors' , 'on'); //na poczatku skryptów
  2.  
  3. //po $log = explode(' ', $val); dodaj
  4. echo '<pre>'; print_r($log); echo '</pre>';


Podaj wyniki tego
badowl
Kod
Array
(
    [0] => uzytkownik1
    [1] => haslo1

)
Array
(
    [0] => uzytkownik2
    [1] => haslo2

)
Array
(
    [0] => uzytkownik3
    [1] => haslo3

)
zend
Spróbuj dać, albo porównuj $pass == $log[1]
  1. strcasecmp($pass, trim($log[1]))
badowl
Nadal nic ;/

Kod
Użytkownik uzytkownik1 nie istnieje w bazie! Zarejstruj się!


Nikt nie zna rozwiązania?
zend
Spróbuj jeszcze i sprawdź czy dane są poprawne
  1. echo '<pre>'; print_r($_POST); echo '</pre>';
badowl
Kod
Array
(
    [login] => uzytkownik1
    [pass] => haslo1
    [submit] => loguj
)
zend
Spróbuj tak i powiedz czy się coś wyświetli
  1. if(strcasecmp($login, $log[0]) == 0 && strcasecmp($pass, $log[1]) == 0){ exit('dane poprawne');
  2. //dalsza część skryptu
badowl
Kod
Użytkownik uzytkownik1 nie istnieje w bazie! Zarejstruj się!
mortus
W pliku index2.php zamień albo linijkę 6 na:
  1. $list = file($password, FILE_IGNORE_NEW_LINES);

albo linijkę 10 na:
  1. if(strcasecmp($login, $log[0]) == 0 && strcasecmp($pass, trim($log[1])) == 0){

Mam nadzieję, że zdajesz sobie sprawę, że funkcja strcasecmp jest cese-insensitive, co oznacza, że TomeK = toMEk, przy porównywaniu tą funkcją.
Po pomyślnym zalogowaniu należałoby przerwać pętlę foreach (słówko break) i dopiero wtedy wykonywać pozostałe operacje.
Poza tym przy rejestracji nie sprawdzasz, czy użytkownik o podanym loginie i haśle już istnieje, czy nie istnieje i można go utworzyć (zatem możesz mieć użytkowników TomeK, ToMeK, tOMEk, itp. z różnymi hasłami, co będzie powodować problemy).
badowl
Pierwszy sposób nic nie daje ;/ a drugi próbowałem. Zaproponował go już użytkownik Zend.
Tak, wiem ze ta funkcja nie rozróżnia wielkości liter wcześniej użyłem strcmp() ale myślałem że to może być powód błędu i dlatego ją zmieniłem.
To ze sprawdzaniem czy użytkownik już nie istnieje zamierzałem dodać później. Teraz męczy mnie inny problem ;/
Kompletnie nie mam pojęcia o co może chodzić ;/

Nikt mi nie potrafi pomóc ? co_jest.gif
mortus
U mnie ten sam skrypt po zastosowaniu funkcji trim() działa bez zarzutu.

Opcjonalnie przed warunkiem:
  1. if(strcasecmp($login, $log[0]) == 0 && strcasecmp($pass, trim($log[1])) == 0){

sprawdź zawartość wszystkich zmiennych potrzebnych do logowania, czyli:
  1. var_dump($login, $log[0], $pass, $log[1]);

Zamiast funkcji spróbuj użyć operatorów porównania (na razie tylko kontrolnie):
  1. if($login == $log[0] && $pass == trim($log[1])) {
badowl
Ok działa smile.gif wystarczyło zamiast funkcji strcasecmp() użyć operatorów porównania. Wielkie dzięki smile.gif chociaż dalej nie rozumiem dlaczego dlaczego nie działało to z tą funkcją..
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.