Probleem dubbelaccountcheck
ik dacht dat mijn code die telkens bij het inloggen word uitgevoerd vlekkeloos was, namelijk volgende code:
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
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
$gebruikersnaam = strtolower($gebruikersnaam);
$sql = 'SELECT Username, Password FROM users WHERE Username="'.$gebruikersnaam.'" AND Password="'.$wachtwoord.'"';
$resultaat = mysqli_query($db, $sql) OR die ('Er liep wat fout, als dit blijft terugkomen neem dan contact op met ons!');
$aantal = mysqli_num_rows($resultaat);
$sql = 'SELECT Username FROM ip WHERE Ip = "'.$_SERVER['REMOTE_ADDR'].'" AND Username = "'.$gebruikersnaam.'"';
$resultaat = mysqli_query($db, $sql) OR die ('Er liep wat fout, als dit blijft terugkomen neem dan contact op met ons!');
$dubbel = mysqli_num_rows($resultaat);
if($dubbel == 0)
{
$sql = 'INSERT INTO ip(Username, Ip, Date) VALUES ("'.$gebruikersnaam.'", "'.$_SERVER['REMOTE_ADDR'].'", NOW())';
$resultaat = mysqli_query($db, $sql) OR die ('Er liep wat fout, als dit blijft terugkomen neem dan contact op met ons!');
}
$sql = 'SELECT Username FROM ip WHERE Ip = "'.$_SERVER['REMOTE_ADDR'].'"';
$resultaat = mysqli_query($db, $sql);
$hoeveel = mysqli_num_rows($resultaat);
if($hoeveel != 0)
{
for($i = 0; $i < $hoeveel; $i++)
{
$deze = mysqli_result($resultaat, $i);
if($deze != $gebruikersnaam)
{
$sql = 'UPDATE ip SET Dubbel = "1" WHERE Username="'.$deze.'" AND Ip="'.$_SERVER['REMOTE_ADDR'].'"';
$uitvoer = mysqli_query($db, $sql) OR die ('Er liep wat fout, als dit blijft terugkomen neem dan contact op met ons!');
$sql = 'UPDATE ip SET Dubbel = "1" WHERE Username="'.$gebruikersnaam.'" AND Ip="'.$_SERVER['REMOTE_ADDR'].'"';
$uitvoer = mysqli_query($db, $sql) OR die ('Er liep wat fout, als dit blijft terugkomen neem dan contact op met ons!');
}
}
}
if($aantal == '0')
{
echo "Gebruikersnaam en wachtwoord komen niet overeen, ga terug naar de <a class='one' href='index.php'>Home-pagina</a>!<br /><a class='one' href='wwvergeten.php'>Wachtwoord vergeten?</a>";
}
$sql = 'SELECT Username, Password FROM users WHERE Username="'.$gebruikersnaam.'" AND Password="'.$wachtwoord.'"';
$resultaat = mysqli_query($db, $sql) OR die ('Er liep wat fout, als dit blijft terugkomen neem dan contact op met ons!');
$aantal = mysqli_num_rows($resultaat);
$sql = 'SELECT Username FROM ip WHERE Ip = "'.$_SERVER['REMOTE_ADDR'].'" AND Username = "'.$gebruikersnaam.'"';
$resultaat = mysqli_query($db, $sql) OR die ('Er liep wat fout, als dit blijft terugkomen neem dan contact op met ons!');
$dubbel = mysqli_num_rows($resultaat);
if($dubbel == 0)
{
$sql = 'INSERT INTO ip(Username, Ip, Date) VALUES ("'.$gebruikersnaam.'", "'.$_SERVER['REMOTE_ADDR'].'", NOW())';
$resultaat = mysqli_query($db, $sql) OR die ('Er liep wat fout, als dit blijft terugkomen neem dan contact op met ons!');
}
$sql = 'SELECT Username FROM ip WHERE Ip = "'.$_SERVER['REMOTE_ADDR'].'"';
$resultaat = mysqli_query($db, $sql);
$hoeveel = mysqli_num_rows($resultaat);
if($hoeveel != 0)
{
for($i = 0; $i < $hoeveel; $i++)
{
$deze = mysqli_result($resultaat, $i);
if($deze != $gebruikersnaam)
{
$sql = 'UPDATE ip SET Dubbel = "1" WHERE Username="'.$deze.'" AND Ip="'.$_SERVER['REMOTE_ADDR'].'"';
$uitvoer = mysqli_query($db, $sql) OR die ('Er liep wat fout, als dit blijft terugkomen neem dan contact op met ons!');
$sql = 'UPDATE ip SET Dubbel = "1" WHERE Username="'.$gebruikersnaam.'" AND Ip="'.$_SERVER['REMOTE_ADDR'].'"';
$uitvoer = mysqli_query($db, $sql) OR die ('Er liep wat fout, als dit blijft terugkomen neem dan contact op met ons!');
}
}
}
if($aantal == '0')
{
echo "Gebruikersnaam en wachtwoord komen niet overeen, ga terug naar de <a class='one' href='index.php'>Home-pagina</a>!<br /><a class='one' href='wwvergeten.php'>Wachtwoord vergeten?</a>";
}
Bij de meeste inloggegevens werkt het, maar nu is er 1 account waarbij dit niet goed functioneert, namelijk een account met de naam lisalovestormy, dit word regelmatig als dubbelaccount bekeken terwijl er ofwel vergeten word het andere account ook als dubbelaccount aan te geven, of dit onterecht als dubbelaccount aangegeven word, wat uiteraard niet de bedoeling is, om de dubbelaccounts te weergeven vraag ik gewoon de namen op waarbij dubbel hoog staat, ik ben in de database gaan kijken en deze staat bij lisalovestormy ook hoog, vandaar dat ik zeker ben dat hier het probleem optreed.
Nu is mijn vraag hoe dit probleem mogelijk ontstaat en hoe ik dit kan oplossen.
De velden die uniek moeten zijn (bv. username en email), moet je op UNIQUE zetten (bv. met phpMyAdmin).
Dan kan je geen dubbele inserts maken
Dit heeft toch niets met mijn vraag te maken? Er zijn geen dubbele entries hoor, het probleem is dat 1 account als dubbel bekeken word, mar het staat ook maar 1 keer in de database, trouwens als unique ;)
inloggen doe je met je email en wachtwoord. Het email moet uniek zijn. Telkens als een gebruiker zich registreert moet ie een e-mailadres opgeven dat nog niet in de database voorkomt. er wordt in de validatie van het formulier op gecontroleerd. Tevens staat de kolom email in de users tabel op unique. Ook als een lid zijn e-mailadres wil wijzigen zal er weer gecheckt worden of het een e-mailadres is dat nog niet voorkomt in de database.
Of begrijpen we je niet? dan moet je de vraag misschien duidelijker stellen.
Hier doe je dat bijvoorbeeld erg onlogisch:
$sql = 'SELECT Username FROM ip
WHERE Ip = "'.$_SERVER['REMOTE_ADDR'].'"
AND Username = "'.$gebruikersnaam.'"';
En hier doe je er nog een schepje bovenop:
$sql = 'SELECT Username FROM ip
WHERE Ip = "'.$_SERVER['REMOTE_ADDR'].'"';
ik vergelijk dingen die ik al ken met de nieuwe dingen, zelfde gebruikersnaam bij zelfde ip ok, verder zonder iets, andere gebruiker zelfde ip? aanpassing doen en verder, die aanpassing gebeurd ten onrechte bij een bepaald account.
Hier word nergens gecontroleerd op dubbele gebruikersnaam, wat niet kan omdat dit al lang unique staat, en mail hetzelfde verhaal.
Gewijzigd op 13/11/2013 18:27:06 door Kristof Hendrickx
Wat bedoel je dan met een "dubbelaccount"?
Inderdaad 2 accounts met hetzelfde ip, dan word er iets veranderd, ik begrijp jullie probleem niet.
Kristof Hendrickx op 15/11/2013 16:20:17:
Twee accounts met hetzelfde IP-adres is geen beveiligingsprobleem. Er kunnen vanaf één IP-adres gerust tientallen gebruikers tegelijk online zijn.Inderdaad 2 accounts met hetzelfde ip, dan word er iets veranderd, ik begrijp jullie probleem niet.
Zo is je definitie van een 'dubbelaccount' nu niet echt gebruikelijk. Jij bedoelt ermee dat je wil bijhouden of een user vanaf meerdere ip adressen is ingelogd (al dan niet tegelijk), terwijl over het algemeen onder een dubbelaccount wordt verstaan dat iemand meerdere usernames heeft op hetzelfde emailadres, of dat iemand met meerdere emailadressen een account heeft. Verwarrend dus.
Daarnaast is ook de vraag wat wil je helemaal hiermee bereiken? Wat is het doel? Je moet het natuurlijk helemaal zelf weten, maar soms helpt dat wel om oplossingen te vinden.
Verder wat je code betreft, dit deel vind ik erg opvallend:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$sql = 'SELECT Username FROM ip WHERE Ip = "'.$_SERVER['REMOTE_ADDR'].'"';
$resultaat = mysqli_query($db, $sql);
$hoeveel = mysqli_num_rows($resultaat);
if($hoeveel != 0)
{
for($i = 0; $i < $hoeveel; $i++)
{
$deze = mysqli_result($resultaat, $i);
if($deze != $gebruikersnaam)
{
$sql = 'UPDATE ip SET Dubbel = "1" WHERE Username="'.$deze.'" AND Ip="'.$_SERVER['REMOTE_ADDR'].'"';
$uitvoer = mysqli_query($db, $sql) OR die ('...');
$sql = 'UPDATE ip SET Dubbel = "1" WHERE Username="'.$gebruikersnaam.'" AND Ip="'.$_SERVER['REMOTE_ADDR'].'"';
$uitvoer = mysqli_query($db, $sql) OR die ('...');
}
}
}
?>
$sql = 'SELECT Username FROM ip WHERE Ip = "'.$_SERVER['REMOTE_ADDR'].'"';
$resultaat = mysqli_query($db, $sql);
$hoeveel = mysqli_num_rows($resultaat);
if($hoeveel != 0)
{
for($i = 0; $i < $hoeveel; $i++)
{
$deze = mysqli_result($resultaat, $i);
if($deze != $gebruikersnaam)
{
$sql = 'UPDATE ip SET Dubbel = "1" WHERE Username="'.$deze.'" AND Ip="'.$_SERVER['REMOTE_ADDR'].'"';
$uitvoer = mysqli_query($db, $sql) OR die ('...');
$sql = 'UPDATE ip SET Dubbel = "1" WHERE Username="'.$gebruikersnaam.'" AND Ip="'.$_SERVER['REMOTE_ADDR'].'"';
$uitvoer = mysqli_query($db, $sql) OR die ('...');
}
}
}
?>
Probeer eens uit te leggen wat hier nu de bedoeling van is, want ik probeer er achter te komen, maar begrijp er echte helemaal niets van. Je haalt alle users op die blijkbaar eens hebben ingelogd vanaf een bepaald ip. Daar filter je de nu ingelogde gebruiker uit (in php, waarom niet in sql?), om vervolgens alle records met het betreffende ip op te hogen, ook voor de nu ingelogde gebruiker. Waarom dus eerst filteren en dan toch weer wel opvoeren? En waarom in een loop, waardoor je de records met die gebruiker elke keer weer aanpast?
Volgens mij kan je het gewoon in 1 simpele query doen:
Uiteindelijk is dat namelijk wel het effect van de bovenstaande code, alleen dan wat minder omslachtig.
Gewijzigd op 15/11/2013 16:42:37 door Erwin H