Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Problem z rejestracją konta
Forum PHP.pl > Forum > Przedszkole
NeXt2k20
Cześć, chciałem się trochę że tak to ujmę 'Zabawić' z php
i chciałem skorzystać z gotowych funkcji uwierzytelniających
Logowanie i rejestracja.
Chciałem użyć tego: https://github.com/dynamiccodePL/PHP-System-Uwierzytelniania
Lecz jest problem z rejestracją, otrzymuje błąd 'Nie udało się zarejestrować.'
I nie wiem dlaczego tak się dzieje.Dane do db są na 100% poprawne

Localhost | PHP - 7.4.9
viking
Zajrzyj w logi swojego serwera. Zmieniłeś hasło i login?
NeXt2k20
A jak mogę zobaczyć logi na serwerze lokalnym ?
Tak wyglada połączenie bazy danych w pliku set-db-connection.php

  1. <?php
  2.  
  3. $dbh = new PDO('mysql:host=localhost;dbname=test', 'root', 'haslo');


db name - test
name - root
passwor - haslo

Więc wszystko się zgadza
nospor
Zamiast nic nie mowiacego
echo '<p>Nie udało się zarejestrować.</p>';

wyswietla tam blad jaki zwraca ci PDO a wszystko bedzie jasne

https://www.php.net/manual/en/pdo.errorinfo.php

ps: przenosze na przedszkole
NeXt2k20
Wszystko już działa

Poprawiona linia 52 w class.user.php

  1. $sth = $this->dbh->prepare("INSERT INTO users (id, registered_timestamp, username, email, password, ip) VALUES(null, CURRENT_TIMESTAMP(), :username, :email, :password, :ip)");


oraz set-db-connection.php

  1. $host = 'localhost';
  2. $port = '3306';
  3. $user = 'root';
  4. $pass = 'haslo';
  5. $dbname = 'test';
  6.  
  7. try{
  8. $dbh = new PDO('mysql:host='.$host.';dbname='.$dbname.';port='.$port, $user, $pass );
  9. $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  10. $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
  11.  
  12. }catch(PDOException $e){
  13. echo 'Połączenie nie mogło zostać utworzone.<br />';
  14. }


I zmieniono strukture tabeli

  1. CREATE TABLE IF NOT EXISTS `users` (
  2. `id` int(10) NOT NULL AUTO_INCREMENT,
  3. `registered_timestamp` varchar(50) DEFAULT NULL,
  4. `username` varchar(30) NOT NULL,
  5. `email` varchar(50) NOT NULL,
  6. `password` varchar(255) NOT NULL,
  7. `ip` varchar(100) NOT NULL,
  8. PRIMARY KEY (`id`)
  9. ) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;


Wszystko działa i dziękuje za pomoc
viking
`registered_timestamp` varchar(50) tutaj jakiś typ daty powinien być np datetime. Nie ma na poziomie bazy sprawdzania unikalności loginu więc można kilka identycznych kont założyć (zmieniając również wielkość znaków). Przy insert nie potrzebujesz null dla kolumny auto increment.
NeXt2k20
Typ varchar zmieniłem na datetime i wszystko, okay
A co do, "Przy insert nie potrzebujesz null dla kolumny auto increment."
To jest to koniecznie ponieważ, gdy usunę null to otrzymuje błąd.

Fatal error: Uncaught PDOException: SQLSTATE[21S01]: Insert value list does not match column list: 1136 Column count doesn't match value count at row 1 in C:\wamp64\www\class.user.php on line 52
A jeśli wstawie same ' ', otrzymuje:
Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 1366 Incorrect integer value: '' for column 'id' at row 1 in C:\wamp64\www\class.user.php on line 59
A przy użyciu null, wszystko działa.
viking
Oczywiście, lista kolumn musi się zgadzać. Dlatego id też możesz usunąć, wstawi się samo z automatu.
trueblue
Na registered_timestamp ustaw typ TIMESTAMP i pomiń to pole przy INSERT.
NeXt2k20
INSERT wygląda teraz tak:
  1. $sth = $this->dbh->prepare("INSERT INTO users ( username, email, password, ip) VALUES( :username, :email, :password, :ip)");


A struktura db tak:
  1. --
  2. -- Struktura tabeli dla tabeli `users`
  3. --
  4.  
  5. DROP TABLE IF EXISTS `users`;
  6. CREATE TABLE IF NOT EXISTS `users` (
  7. `id` int(10) NOT NULL AUTO_INCREMENT,
  8. `registered_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  9. `username` varchar(30) NOT NULL,
  10. `email` varchar(50) NOT NULL,
  11. `password` varchar(255) NOT NULL,
  12. `ip` varchar(100) NOT NULL,
  13. PRIMARY KEY (`id`)
  14. ) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
  15.  


Czy teraz wszystko jest tak jak powinno ?
nospor
email moze miec wiecej niz 50 znakow
zas IP chyba nie ma 100 znakow

ot taka drobnostka by sie do czegos przyczepic wink.gif
viking
Tak samo hash hasła też nie będzie miał 255 znaków. Zarejestruj 2 konta na ten sam email ale różna wielkość znaków.
NeXt2k20
A więc tak, w google wyczytałem że email może zawierać 255 znaków
więc ustawiłęm wartość na 255 zaś o ip wyczytałem że idealna wartość
to 15 i będzie okay, tak też zrobiłem. Każdy hash zawiera 60 znaków więc
ustawiłem varchar(60). A jeśli chodzi o "Zarejestruj 2 konta na ten sam email ale różna wielkość znaków."
Jest to nie możliwe tak samo jest w przypadku loginu.

Struktura tabeli
  1. CREATE TABLE IF NOT EXISTS `users` (
  2. `id` int(10) NOT NULL AUTO_INCREMENT,
  3. `registered_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  4. `username` varchar(30) NOT NULL,
  5. `email` varchar(255) NOT NULL,
  6. `password` varchar(60) NOT NULL,
  7. `ip` varchar(15) NOT NULL,
  8. PRIMARY KEY (`id`)
  9. ) ENGINE=MyISAM AUTO_INCREMENT=21 DEFAULT CHARSET=utf8;
nospor
Cytat
Tak samo hash hasła też nie będzie miał 255 znaków

Akurat tutaj niekoniecznie. Ok, teraz nie bedzie mial, ale moze sie zmienic. On uzywa DEFAULT dla hasha i w manualu zalecaja by w takim przypadku trzymac wielkosc 255 poniewaz DEFAULT moze sie zmienic. Temu nie lubie nigdy dawac DEFAULT wink.gif
viking
Jeśli się zmieni to długość hasha będzie najmniejszym problemem.
NeXt2k20
Na chwile obecną zostane przy PASSWORD_DEFAULT i chciał bym wszystki podziękować za pomoc
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.