Username check
Ik ben sinds kort begonnen met het leren van PHP en ben op het moment bezig met een registratie systeem.
Het registreren is mij gelukt alleen ik heb een probleem met het controleren van een username of die in gebruik is of niet.
Telkens als ik username controleer krijg ik een melding dat de username beschikbaar is terwijl de username al geregistreerd is in mijn database.
Iemand enig idee wat ik hier verkeerd doe?
Dit is wat ik op het moment heb gemaakt, en ja ik weet dat ik er nog geen beveiliging in heb zitten.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
<?php
if(isset($_POST['submit'])){
$username = $_POST['username'];
$email = $_POST['email'];
$pass1 = $_POST['password1'];
$pass2 = $_POST['password2'];
$error = "";
if($username == "" || $email === "" || $pass1 == "" || $pass2 == ""){
$error .= "* Fill in all fields!<br/>";
}
if($username == "" || strlen($username) < 5 || strlen($username) > 18){
$error .= "- Your username must be between 5 and 18 characters!<br/>";
}
if(!preg_match('/^[0-9a-zA-Z_\-]+$/i', $username)){
$error .= "- Your username contains invalid characters<br/>";
}
if(is_numeric($username[0])){
$error .= "Your username can not start with a number!";
}
if($pass1 != $pass2 ){
$error .= "* The passwords you entered do not match<br/>";
}
if(strlen($pass1) < 6 || strlen($pass1) > 20 ){
$error .= "* You password should contain 6 to 20 characters!<br/>";
}
if( filter_var($email, FILTER_VALIDATE_EMAIL) === false){
$error .= "* You have entered an invalid e-mail adress!<br/>";
}
if($error == ""){
$db_conx = mysqli_connect("xxxxx", "xxxxx", "xxxxx", "xxxxx");
if (mysqli_connect_errno()){
$error .= "connection error";
exit ();
}
$sql = "INSERT INTO `users2` (`username`, `email`, `password`) VALUES ('$username', '$email', '$pass2')";
$query = mysqli_query ($nz_conx, $sql);
$regSucces .= "Your account is created! :)!<br/> Thank you" ."\n". $username. "\n"."for joining noomz, we have send you an activation link to" ."\n".$email.". check your email inbox!";
}
}
if(isset($_POST['usernameCheck'])){
$db_conx = mysqli_connect("xxxxx", "xxxxx", "xxxxx", "xxxxx");
if (mysqli_connect_errno()){
$error .= "connection error";
exit ();
}
$sql = "SELECT * FROM `users2` WHERE `username` = '$username' ";
$query = mysqli_query($nz_conx, $sql);
$username_check = mysqli_num_rows($query);
$username_status= "";
if($username_check < 1){
$username_status .= "Username is available";
}
else{
$username_status .= "Username is not available";
}
}
if(isset($_POST['submit'])){
$username = $_POST['username'];
$email = $_POST['email'];
$pass1 = $_POST['password1'];
$pass2 = $_POST['password2'];
$error = "";
if($username == "" || $email === "" || $pass1 == "" || $pass2 == ""){
$error .= "* Fill in all fields!<br/>";
}
if($username == "" || strlen($username) < 5 || strlen($username) > 18){
$error .= "- Your username must be between 5 and 18 characters!<br/>";
}
if(!preg_match('/^[0-9a-zA-Z_\-]+$/i', $username)){
$error .= "- Your username contains invalid characters<br/>";
}
if(is_numeric($username[0])){
$error .= "Your username can not start with a number!";
}
if($pass1 != $pass2 ){
$error .= "* The passwords you entered do not match<br/>";
}
if(strlen($pass1) < 6 || strlen($pass1) > 20 ){
$error .= "* You password should contain 6 to 20 characters!<br/>";
}
if( filter_var($email, FILTER_VALIDATE_EMAIL) === false){
$error .= "* You have entered an invalid e-mail adress!<br/>";
}
if($error == ""){
$db_conx = mysqli_connect("xxxxx", "xxxxx", "xxxxx", "xxxxx");
if (mysqli_connect_errno()){
$error .= "connection error";
exit ();
}
$sql = "INSERT INTO `users2` (`username`, `email`, `password`) VALUES ('$username', '$email', '$pass2')";
$query = mysqli_query ($nz_conx, $sql);
$regSucces .= "Your account is created! :)!<br/> Thank you" ."\n". $username. "\n"."for joining noomz, we have send you an activation link to" ."\n".$email.". check your email inbox!";
}
}
if(isset($_POST['usernameCheck'])){
$db_conx = mysqli_connect("xxxxx", "xxxxx", "xxxxx", "xxxxx");
if (mysqli_connect_errno()){
$error .= "connection error";
exit ();
}
$sql = "SELECT * FROM `users2` WHERE `username` = '$username' ";
$query = mysqli_query($nz_conx, $sql);
$username_check = mysqli_num_rows($query);
$username_status= "";
if($username_check < 1){
$username_status .= "Username is available";
}
else{
$username_status .= "Username is not available";
}
}
Gewijzigd op 16/05/2014 15:49:33 door Achie Kaderr
En verder vroeg ik me af waarom je je tabel users2 noemt?
Vanwaar die cijfers? Ik mag hopen dat er geen users2, users3, users4 etc.. zijn?
en ik heb een var_dump op $username_check gedaan en uitkomst daarvan is int(0).
Gewijzigd op 16/05/2014 00:17:57 door Achie Kaderr
Plus dat er sql-injection mogelijk is.
Klopt, ik beveilig sql-injection later wel.
overal in het begin doe je het goed maar dan
2x == betekent is gelijk aan
1x = betekent gewoon IS
dus waarom overal == en dan != je kan gewoon prima !== doen
verder gebruik je soms een uitroepteken en soms gebruik je === false wees hier consistent in dus doe
of
verder is exit niet echt een goede manier van afhandelen, dit kan veel en veel beter. Overigens gebruik je nu 2 buttons dus eerst voor een check en dan voor een submit en ik denk dat daar de fout in zit hij submit de user sowieso omdat je niet controleert of er gesubmit is EN dat er niet op iets anders geklikt is.. dit klinkt vaag en is ook vaag dus dat zou ik veranderen. Voor een goed voorbeeldje
https://github.com/WouterJ/sql-boilerplate/blob/master/mysqli/producaal/query-select.php
Overigens heb je dit ook voor de overige queries
https://github.com/WouterJ/sql-boilerplate/tree/master/mysqli/producaal
En ik zal later wel 1 button hiervoor gebruiken, alleen mijn probleem is dus dat mijn username check niet functioneert zoals ik het wil. De users die in $users2 zitten geeft die aan als beschikbaar, dus ik vraag mij nu af of mijn username check wel klopt of totaal verkeerd is.
Als je het zelf wilt zien/proberen dan kan ik wel een link hier posten.
zou ik in dit geval (lui typ dat ik ben) doen als :
het verschil tussen "=" en "like" is dat "=" hoofdletter gevoelig mached en "like" niet. Verder heb ik even je variable buiten je string gezet.
Verder zou ik $sql een keer printen en uitvoeren via je phpMyAdmin om te kijken of je query wel echt terug geeft wat jij denkt dat hij terug geeft :)
Jacco like is hier niet handig aangezien er niet gezocht hoeft te worden.. Like vind ook andere gebruikersnamen het beste is gewoon = ( overigens gebruik je hem ook verkeerd )
Jacco = Jacco true
Jacco = jAcco false
Jacco like Jacco true
Jacco like jAcco true
Dus in mijn ogen is dit gewoon correct gebruik van like, tenzij je niets geeft om hoofdletter gevoeligheid van je gebruikersnamen
Verder zou ik graag van je vernemen hoe ik hem dan verkeerd gebruik volgens jou, ben niet te beroerd om nieuwe dingen te leren
Edit :
Overigens ben ik niet met je eens dat je niet wil zoeken. Een select is per definitie een zoekactie
Gewijzigd op 16/05/2014 12:27:18 door Jacco Engel
Reshad F op 16/05/2014 00:33:07:
overal in het begin doe je het goed maar dan
dus waarom overal == en dan != je kan gewoon prima !== doen
dus waarom overal == en dan != je kan gewoon prima !== doen
Waarom zou je !== gebruiken? Nergens voor nodig in dit geval. Je geeft zelf aan dat je consistent moet zijn; als je !== gebruikt, zou je dus ook overal === moeten gaan gebruiken.
Jacco Engel op 16/05/2014 12:23:50:
Reshad, dus als jij een table met usernames hebt ga jij voor alle mogelijke cases een aparte query doen :)?
Jacco = Jacco true
Jacco = jAcco false
Jacco like Jacco true
Jacco like jAcco true
Dus in mijn ogen is dit gewoon correct gebruik van like, tenzij je niets geeft om hoofdletter gevoeligheid van je gebruikersnamen
Jacco = Jacco true
Jacco = jAcco false
Jacco like Jacco true
Jacco like jAcco true
Dus in mijn ogen is dit gewoon correct gebruik van like, tenzij je niets geeft om hoofdletter gevoeligheid van je gebruikersnamen
Dit is incorrect gebruik van like. Like kijkt namelijk niet case insensitive. In jouw geval misschien wel, maar dat komt dan omdat je tabel een case insensitive collation heeft (zoals bijvoorbeeld latin1_general_ci. En in dat geval vergelijkt ook = gewoon case insensitive.
Kijk zo leer je nog eens wat, ipv alleen onjuist gebruik neer plempen :) Dank willem
En action="" ontbreekt bij <form>.
En action="" heb ik leeg gelaten omdat ik nog bezig met het testen van mijn registratie systeem.
Toevoeging op 16/05/2014 17:46:44:
Ik ben er nu uit waarom mijn script het niet deed zoals het moest.
Wat blijkt dat mijn variabelen dus $username $email etc. local variabelen waren, heb de variabelen nu als global en nu geeft hij aan wanneer een gebruikersnaam reeds in gebruik is.
Gewijzigd op 16/05/2014 17:48:03 door Achie Kaderr
Achie Kaderr op 16/05/2014 15:27:32:
En action="" heb ik leeg gelaten omdat ik nog bezig met het testen van mijn registratie systeem.
Nee je hebt helemaal geen action attribuut terwijl deze verplicht is bij het form element. een leeg action attribuut mag overigens wel en wordt zelfs aangeraden wanneer je naar dezelfde url wil posten.
Ik zou van regel vijf gewoon het volgende maken.
Usernames worden dan gewoon automatisch met kleine letters en dus ook met kleine letters in de database opgeslagen. het vergelijken wordt dan altijd case insensitive.
Gewijzigd op 16/05/2014 23:36:31 door Frank Nietbelangrijk