Login system - molim pomoc

Radim login system pomocu cistog PHP koda i PDO baze, do sada sam radila samo Front-end development, pa ne mogu se snaci jos u PHP, a PDO bazu tek ucim.

Pronašla sam ovaj jako dobar tutorijal o tome PHP Login Script with Session Tutorial - Step by Step Guide! te sam ga pratila.

Ja sam uradila sve kako je tu i taj system radi dobro, ali meni treba da se korisnik moze logovati preko usernama i emaila, u tom tutorijalu je postavljeno da se korisnik moze logovati samo preko emaila.

Ja sma pokusala uraditi ovako:

WHERE username=? AND email=?;
$stmt->bindParam(1,$username);
$stmt->bindParam(2,$email);

U sessiju sam dodala isto tako $email u bazi se nalazi username i email.

Ali to nije radilo, nije mi izbacivalo nikakvu gresku, ali nisam mogla da se ulogujem ni pomocu emaila, a ni username. Mogla sam prepraviti umjesto emaila, postaviti username i onda se logovati samo pomocu usernama, ali to mi nije bio cilj.

Ukoliko neko ima vremena i dobre volje i zeli pomoci, bila bi zahvalna. L.P

Šta si uradila prije toga?
Jesi li dodala polje username u bazi?
Možeš li postaviti kratki blok koda forme da se vidi kako očekuješ popunjenje input polja?
Tj. nisam razumio da l’ ti želiš da username i email koristiš interchangeable (odnosno, da li izbacuješ password iz forme).

Username, email, password vec postoje u bazi.

Input kontakt forme

<input type='text' name='email' class='form-control' placeholder='Email or Username'>
<input type='password' name='password' class='form-control' placeholder='Password'>

Kontakt forma već nudi korisniku da se prijavi sa email i password-om.

Ja zelim omoguciti korisniku da pored emaila, moze koristiti i username za login.

Ok, znači dodala si username polje naknadno? Ok.

Koristiš kod sa linka 1:1 - identično?

Da, trenutno je tako

Ovo može raditi jedino ako si obezbijedila uniqueness za username.
Odnosno da bi ovo radilo, ne smiješ dopustiti da se u tabeli nadju dva jednaka username-a.
Recimo da smo to već obezbijedili.
Jedino gdje si sigurna je da ako nije nešto email to će definitivno biti osnova za provjeru da l’ je validan username. Sa druge strane ako neko ima username u formi email-a onda stvari postaju još kompleksnije.
U tački 7.7 imaš funkciju

$email_exists = $user->emailExists();

Prije te linije treba da provjeriš da l’ prihvataš email formu il’ username formu.
Primjerom vodjeni, neko je kuc’o u polja email=biljana&password=pass123.

Prije pomenute linije ćeš provjeriti da li je ono što sje stiglo u parametru email ustvari email il’ username. Ja bi uradio na sljedeći način:

$emailUserrname = 'email';
if (filter_var($user->email, FILTER_VALIDATE_EMAIL) {
    $emailUsername = 'username';
}

Nakon toga, u zavisnosti koje vrijednosti je $emailUsername varijabla, vršićeš query tog polja u tabeli.
Moguće da postoje elegntnija rješenja, ali testiraj ovo da se vidi da li radi.

Warning : Use of undefined constant FILTER_VALIDATE_EMAIL - assumed ‘FILTER_VALIDATE_EMAIL’ (this will throw an Error in a future version of PHP)

Warning : filter_var() expects parameter 2 to be int, string given in *C:\XAMPP\htdocs*

To mi izbacuje kada se pokusam prijaviti

Ima još stvari ovde gore gdje sam napomen’o da se uradi ali da se krene redom.

<?php
$email = "[email protected]"; //Note the .com added
echo "PHP Version: ".phpversion().'<br>';
if(filter_var($email, FILTER_VALIDATE_EMAIL)){
    echo $email.'<br>';
    var_dump(filter_var($email, FILTER_VALIDATE_EMAIL));
}else{
    var_dump(filter_var($email, FILTER_VALIDATE_EMAIL));   
}

Provjeri da l’ ti ovo radi (izvrši iz nekog test fajla) a moralo bi.

I još jedna stvar, tutorijal poprilično vrlo star sad i ne koristi trenutnu standardizaciju niti naming convention call, import i ostale tipove uvriježene za industrijski standard sad. Drugim riječima tutorijal je koristio PHP 5.4 ili 5.3 pa to treba imati na unu ako ti je lokalno na XAMPP-u PHP 7.x.

Problem sam rijesila tako sto sam dodala

WHERE email = ? OR username = ?

I s obzirom da se email nalazi u istoj varijabli kao i username samo sam dodala još

$stmt->bindParam(1, $email);
$stmt->bindParam(2, $email);

I to sada radi

1 Like

Ustvari, da.
S tim da ono što sam rek’o ostaje - username mora imati unique constraint index da se ne bi desile nepredvidjenosti.

Email isto.

WHERE (email = ? OR username = ?) and password = ?
$stmt->bindParam(1, $email);
$stmt->bindParam(2, $email);
$stmt->bindParam(3, $password);

To bi se trebalo podrazumijevati.

Ovaj drugi dio

WHERE (email = ? OR username = ?) and password = ?
$stmt->bindParam(1, $email);
$stmt->bindParam(2, $email);
$stmt->bindParam(3, $password);

ne treba već će taj red uporediti sa poslanom lozinkom.

Ima na postavljenom linku kako funkcioniše.
Dosta servisa radi na način da izvadi preko mejla row pa onda radi komplikovane rehash algoritme samo u slučaju ako taj red postoji.

Al’ još jednom:

tabela treba da bude funkcionalna sama po sebi, prvenstveno.
email i username na sebi moraju imati unique index.
Trebalo bi da može i kompozitni index ali to je već tema specifičnija puno od teme kako da se logujem.

1 Like