Ik zit met een probleempje en ik kan even niet zo goed bedenken hoe ik dat moet doen. Weet iemand hoe ik leden kan laten zien op een pagina die meerdere accounts op 1 IP adres hebben?Dus dat ik dan een pagina heb met de namen, maar dan alleen van degene met dubbelaccounts en niet de leden die dat niet hebben?

Account vraagje
-
-
-
Simpele SQL-query? Moet je wel de IP-informatie hebben uiteraard:
Ik ken de exacte tabel- en kolomnamen uiteraard niet, maar bovenstaande query dekt de lading wel lijkt mij.
Ook zou je iets als GROUP_CONCAT(gebruikersnaam) kunnen doen, om gelijk de bijbehorende account- of gebruikersnamen weer te geven. En als je hostingprovider een soort controlepaneel heeft zit daar vaak ook iets bij als phpMyAdmin. En als je shell access hebt doe je het direct via de prompt :p.
-
Deze doet het niet, hij geeft nu 2 verschillende ip adressen aan, in plaats van dezelfde.
-
met een where van de ip..
-
En hoe moet ik dat doen dan? SELECT ip From speler Where ???
-
SELECT ip FROM users where ip = data ip
Dan tel je of er meer zijn dan 2..
-
Met mijn query vraag je de IP's op via welke meerdere accounts (meer dan één) geregistreerd staan. Vervolgens kun je daarbij de concrete accounts zoeken, of, zoals aangegeven, iets met GROUP_CONCAT() doen.
Deze doet het niet, hij geeft nu 2 verschillende ip adressen aan, in plaats van dezelfde.
Dit houdt in dat beide IP's meerdere accounts herbergen. De "aantal" kolom geeft aan hoeveel accounts onder elk IP-adres geregistreerd staan.
Als dit aantal laag is wil dat in principe niet veel zeggen. Denk aan een huishouden of een studentenhuis, naar buiten toe hebben vaak alle, of in ieder geval meerdere, computers eenzelfde IP-adres omdat ze via hetzelfde netwerk aan het internet hangen.
-
SELECT ip FROM users where ip = data ip
Dan tel je of er meer zijn dan 2..
Met data ip weergeeft die alleen het ip van mijn eigen account en niet de andere accounts die ook een dubbelaccount hebben.
-
Met mijn query vraag je de IP's op via welke meerdere accounts (meer dan één) geregistreerd staan. Vervolgens kun je daarbij de concrete accounts zoeken, of, zoals aangegeven, iets met GROUP_CONCAT() doen.
Dit houdt in dat beide IP's meerdere accounts herbergen. De "aantal" kolom geeft aan hoeveel accounts onder elk IP-adres geregistreerd staan.
Als dit aantal laag is wil dat in principe niet veel zeggen. Denk aan een huishouden of een studentenhuis, naar buiten toe hebben vaak alle, of in ieder geval meerdere, computers eenzelfde IP-adres omdat ze via hetzelfde netwerk aan het internet hangen.Deze deed het helaas niet, misschien dat ik iets fout deed?
"SELECT `rank`,`ip`,`username` FROM `leden` WHERE `username` != 'Admin' AND `dead` = '0' ORDER BY `ip` DESC LIMIT 0,30");
-
in sommige scripts.vind je dubbel account scripts.
-
Bekijk mijn query nogmaals. Als je het principe begrijpt kun je dit omschrijven naar wat jij wilt hebben.
De eerste regel bevat de kolomnamen waarin je geinteresseerd bent en een COUNT() op de IP-kolom, dit is het argument waar je op gaat groeperen. Deze sla je op als de (alias)kolom "aantal" om hier later makkelijker aan te refereren.
De tweede regel bevat de betrokken tabel(len).
Het argument waarop je de resultaatrijen samenvoegt. Dit doe je op IP-adres.
Hiermee geef je aan dat je alleen in de IP-adressen geinteresseerd bent die meer dan één keer voorkomen in je leden-tabel. Dit is dus een soort van filter op je resultaatset. Alle accounts met een uniek IP vallen hierdoor af uit de resultaten. Wat je overhoudt is een lijst van IP-adressen waaronder meerdere accounts (ten minste twee) geregistreerd staan.
Omdat je groepeert op IP wordt het lastig om meer informatie in een enkele resultaatkolom te proppen omdat de resultaten al worden samengevoegd maar je zou hier bijvoorbeeld de waarden van de gebruikersnamen in op kunnen nemen door middel van GROUP_CONCAT().
Toegepast op de informatie hierboven wordt dit dus zoiets als:
Wil je vervolgens meer account informatie ophoesten kun je dit het beste met een aparte query doen. Ik ging er in eerste instantie vanuit dat je vlug een overzicht wilde van mensen die zich mogelijk meerdere keren hadden geregistreerd.
-
Het hoeft ook niet perse meer info te zijn als de naam en het ip er maar op staan. Maar met jouw query krijg ik echter maar 2 accounts te zien met verschillende ip adressen terwijl er meer accounts zijn en meerdere accounts op 1 ip zijn geregistreerd. Hij werkt nog steeds niet. Het enige wat erop moet staat is de naam en het ip adres, de rest is allemaal bijzaak en hoeft eigenlijk niet als het maar correct werkt.
-
Realiseer je je dat elk IP-adres maar één keer voorkomt in de resultaatset omdat je groepeert op IP?
Weet niet precies wat er misgaat maar als ik dit test werkt dit prima.
SQL
Toon MeerCREATE TABLE leden ( ip VARCHAR(255) NOT NULL, username VARCHAR(255) NOT NULL ) ENGINE=InnoDb DEFAULT CHARSET=utf8; INSERT INTO leden VALUES ('127.0.0.1', 'Henk'), ('127.0.0.1', 'Piet'), ('127.0.0.1', 'Klaas'), ('127.0.0.2', 'Harry'), ('127.0.0.2', 'Hennie'), ('127.0.0.3', 'Gonnie');
De volgende query:
Levert precies wat ik verwacht: -
Realiseer je je dat elk IP-adres maar één keer voorkomt in de resultaatset omdat je groepeert op IP?
Weet niet precies wat er misgaat maar als ik dit test werkt dit prima.
SQL
Toon MeerCREATE TABLE leden ( ip VARCHAR(255) NOT NULL, username VARCHAR(255) NOT NULL ) ENGINE=InnoDb DEFAULT CHARSET=utf8; INSERT INTO leden VALUES ('127.0.0.1', 'Henk'), ('127.0.0.1', 'Piet'), ('127.0.0.1', 'Klaas'), ('127.0.0.2', 'Harry'), ('127.0.0.2', 'Hennie'), ('127.0.0.3', 'Gonnie');
De volgende query:
Levert precies wat ik verwacht:
Ik snap het nu inderdaad wel. Maar hoe krijg ik dan de juiste namen bij het IP adres? Want nu krijg ik maar één naam daar te staan en niet 2 of 3 zoals jij het hebt. Maar dan heb ik wel SELECT naam,ip gedaan om die naam daar zichtbaar te maken. Hoe doe jij dat dan, want anders heb ik daar geen naam staan?
-
Dat is het "nadeel" van het groeperen: je groepeert meerdere account-records op basis van IP. Het is dan redelijk willekeurig welke (enkele) naam wordt getoond in een resultaatrij. Daarom gebruik je GROUP_CONCAT(). Deze trekt de namen van meerdere kolommen samen in één rij.
Zoals ik al aangaf, een alternatief is dat je, uitgaande van die IP's een nieuwe query (of subquery) bakt waarin je die records dus wel apart (in meerdere rijen) opvraagt.
Maar dan nog, als je deze informatie vervolgens toont op een scherm dan zul je deze IP's toch op een of andere manier "grafisch" moeten groeperen, door tijdens het uitlezen bij te houden welke accounts -op basis van IP- bij elkaar horen.
Misschien heb je iets aan het volgende, voortbordurend op het vorige voorbeeld:
PHP
Toon Meer<?php // Voor debugging. error_reporting(E_ALL); ini_set('display_errors', 'stdout'); // Voor output. header('Content-Type: text/html; charset=UTF-8'); // Maak database connectie. $db = new mysqli('<host_of_ip>', '<username>', '<password>', '<database>'); $db->set_charset('utf8'); // We maken hier gebruik van een subquery die bepaalt welke IP's meerdere keren voorkomen. // Vervolgens vragen we alle relevante account-informatie op met die IP's. $res = $db->query( 'SELECT l.ip, l.username FROM leden l WHERE l.ip IN ( SELECT ip FROM leden GROUP BY ip HAVING COUNT(ip) > 1 ) ORDER BY l.ip, l.username' ); $currentIp = ''; while ($row = $res->fetch_assoc()) { // Wanneer het IP verandert tijdens het uitlezen van accounts met eenzelfde IP, toon nieuw kopje. if ($row['ip'] != $currentIp) { // IP is veranderd sinds vorige iteratie, sla deze op. $currentIp = $row['ip']; ?><h2><?php echo $row['ip'] ?></h2><?php } // Toon informatie van account, dit kun je uiteraard nog uitbreiden met meer informatie. ?><p><?php echo $row['username'] ?></p><?php } // Geef resultaat vrij. $res->free(); ?>
En als dit allemaal abracadabra is, dan loont het misschien de moeite om je ofwel wat meer te verdiepen in de materie, of een programmeur in te huren/aan te nemen.
-
Dat is het "nadeel" van het groeperen: je groepeert meerdere account-records op basis van IP. Het is dan redelijk willekeurig welke (enkele) naam wordt getoond in een resultaatrij. Daarom gebruik je GROUP_CONCAT(). Deze trekt de namen van meerdere kolommen samen in één rij.
Zoals ik al aangaf, een alternatief is dat je, uitgaande van die IP's een nieuwe query (of subquery) bakt waarin je die records dus wel apart (in meerdere rijen) opvraagt.
Maar dan nog, als je deze informatie vervolgens toont op een scherm dan zul je deze IP's toch op een of andere manier "grafisch" moeten groeperen, door tijdens het uitlezen bij te houden welke accounts -op basis van IP- bij elkaar horen.
Misschien heb je iets aan het volgende, voortbordurend op het vorige voorbeeld:
PHP
Toon Meer<?php // Voor debugging. error_reporting(E_ALL); ini_set('display_errors', 'stdout'); // Voor output. header('Content-Type: text/html; charset=UTF-8'); // Maak database connectie. $db = new mysqli('<host_of_ip>', '<username>', '<password>', '<database>'); $db->set_charset('utf8'); // We maken hier gebruik van een subquery die bepaalt welke IP's meerdere keren voorkomen. // Vervolgens vragen we alle relevante account-informatie op met die IP's. $res = $db->query( 'SELECT l.ip, l.username FROM leden l WHERE l.ip IN ( SELECT ip FROM leden GROUP BY ip HAVING COUNT(ip) > 1 ) ORDER BY l.ip, l.username' ); $currentIp = ''; while ($row = $res->fetch_assoc()) { // Wanneer het IP verandert tijdens het uitlezen van accounts met eenzelfde IP, toon nieuw kopje. if ($row['ip'] != $currentIp) { // IP is veranderd sinds vorige iteratie, sla deze op. $currentIp = $row['ip']; ?><h2><?php echo $row['ip'] ?></h2><?php } // Toon informatie van account, dit kun je uiteraard nog uitbreiden met meer informatie. ?><p><?php echo $row['username'] ?></p><?php } // Geef resultaat vrij. $res->free(); ?>
En als dit allemaal abracadabra is, dan loont het misschien de moeite om je ofwel wat meer te verdiepen in de materie, of een programmeur in te huren/aan te nemen.
Het is toch gelukt. GROUP_CONCAT(username) moest zijn GROUP_CONCAT(username) AS gebruikersnaam. Net zoals die IP. Evengoed bedankt voor de hulp. Hier kan een slotje op.
Participate now!
Heb je nog geen account? Registreer je nu en word deel van onze community!