MySQL: Nagaan of gebruikers bestaan

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • VR46
  • Registratie: Januari 2005
  • Laatst online: 08-09 12:51
Hallo,

Ik ben bezig met een berichtensysteem voor een website, waar de gebruikers bij een nieuw bericht (vanzelfsprekend) zelf andere gebruikers in het "AAN:"-veld moeten kunnen opgeven.
Bij het versturen van het bericht moet echter wel worden nagegaan of de opgegeven gebruikersnamen (gescheiden door een ; teken) ook daadwerkelijk bestaan.

Nu heb ik echter nog niet helemaal door hoe ik dit het beste kan aanpakken, aangezien ik dit nog niet eerder heb gedaan. Het lijkt me behoorlijk onpraktisch om een array te maken dmv explode() (wat sowieso wel moet gebeuren) om vervolgens voor elk item in het array een query uit te voeren. Kan ik dit bijvoorbeeld met de MySQL functie EXISTS doen?

Alvast bedankt!

Acties:
  • 0 Henk 'm!

  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 21-08 11:20
SQL:
1
SELECT id, username FROM users WHERE username="Klaas" OR username="piet" OR username="henk" OR username="toos"


Geeft je als het goed is alle usernames terug die in de database aanwezig zijn (afhankelijk van je database). Vervolgens kijken in de resultset welke usernames matchen en welke niet (kwestie van elimineren uit een lijst) en je weet zo welke gebruikersnamen missen.

Edit: ohja, IN kan natuurlijk ook.

[ Voor 34% gewijzigd door Alex) op 22-02-2010 14:04 ]

We are shaping the future


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Niet exsist, maar IN lijkt me eerder het keyword waar je naar op zoek bent.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • FireDrunk
  • Registratie: November 2002
  • Laatst online: 20-09 11:06
Is LIKE niet beter?

SQL:
1
SELECT * FROM users WHERE username LIKE '%toos%'

Even niets...


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

thijs_cramer schreef op maandag 22 februari 2010 @ 14:04:
Is LIKE niet beter?

SQL:
1
SELECT * FROM users WHERE username LIKE '%toos%'
Nee.

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • VR46
  • Registratie: Januari 2005
  • Laatst online: 08-09 12:51
Dank voor de reacties.

Het idee van Alex lijkt me inderdaad effectief, alleen misschien niet heel netjes?

LIKE lijkt me te fouttollerant, geen goeie optie

Wat betreft IN; dat klinkt ook als een goeie;
klopt het dat ik dan eerst naar een array moet exploden en vervolgens een soortgelijke query moet bouwen?

SELECT * FROM users WHERE username LIKE ('piet','hein','karel','henk','dirk'); etc....

Vervolgens zou ik de resultaten uit de query moeten vergelijken met de array die uit de post is gekomen?

Acties:
  • 0 Henk 'm!

  • Morax
  • Registratie: Mei 2002
  • Laatst online: 20-09 00:30
cbernardini schreef op maandag 22 februari 2010 @ 14:09:
Dank voor de reacties.

Het idee van Alex lijkt me inderdaad effectief, alleen misschien niet heel netjes?

LIKE lijkt me te fout-intollerant, geen goeie optie

Wat betreft IN; dat klinkt ook als een goeie;
klopt het dat ik dan eerst naar een array moet exploden en vervolgens een soortgelijke query moet bouwen?

SELECT * FROM users WHERE username LIKE ('piet','hein','karel','henk','dirk'); etc....

Vervolgens zou ik de resultaten uit de query moeten vergelijken met de array die uit de post is gekomen?
Je zal aan de hand van de postwaardes de query moeten ombouwen naar:
SQL:
1
SELECT id, username FROM users WHERE username IN ('klaas', 'piet', 'henk', 'dirk');


De resultset zal vervolgens alle accounts bevatten die een username hebben die gelijk is aan 1 van die namen.

[ Voor 23% gewijzigd door Morax op 22-02-2010 14:14 ]

What do you mean I have no life? I am a gamer, I got millions!


Acties:
  • 0 Henk 'm!

  • VR46
  • Registratie: Januari 2005
  • Laatst online: 08-09 12:51
Bedankt, ik ga WHERE IN gebruiken samen met een array van de postwaarden

Hoe kan ik echter nagaan welke opgegeven usernames incorrect zijn (ofwel welke usernames die wel als receipients zijn opgegeven door de gebruiker maar niet uit de query blijken te bestaan)? Array_diff misschien?

//Edit:

Nog een probleempje met de query, de code ziet er als volgt uit:

PHP:
1
2
3
4
5
6
7
8
$receipients = explode(";", $_POST['receipients']);
$query = "SELECT u.user_id, u.usernameFROM database.users AS u WHERE u.username IN (" . $receipients . ")";
$result = $link->query($query);
if ($result->num_rows > 0)  {
            if ($result->num_rows < count($receipients))    {
                $row = $result->fetch_assoc();

etc...


Nu resulteert de query echter nooit iets, ookal voer ik bestaande gebruikersnamen in... Doe ik iets fout door de array direct in de query te plaatsen soms?

[ Voor 51% gewijzigd door VR46 op 22-02-2010 14:38 ]


Acties:
  • 0 Henk 'm!

  • Dorgaldir
  • Registratie: September 2009
  • Laatst online: 10-04 22:52

Dorgaldir

Creature of the web

je kan ook een loopje door je array doen en in_array dan kan je ineens de fouten afhandelen in je loop.

Er zullen wel meerder oplossingen zijn maar zo zou ik het doen

Just me


Acties:
  • 0 Henk 'm!

  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 21-08 11:20
Array_diff is een goede mogelijkheid ja.

Vergeet natuurlijk niet je usernames te mysql_real_escape_string'en voordat je ze in de array zet ;)

We are shaping the future


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

cbernardini schreef op maandag 22 februari 2010 @ 14:25:
PHP:
1
2
3
$receipients = explode(";", $_POST['receipients']);
$query = "SELECT u.user_id, u.usernameFROM database.users AS u WHERE u.username IN (" . $receipients . ")";
$result = $link->query($query);


Nu resulteert de query echter nooit iets, ookal voer ik bestaande gebruikersnamen in... Doe ik iets fout door de array direct in de query te plaatsen soms?
Debuggen. :) Echo de query eens.

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • VR46
  • Registratie: Januari 2005
  • Laatst online: 08-09 12:51
Galen, Alex, bedankt nu moet ik eruit komen.

Zie edit van mijn eerdere bericht echter

Acties:
  • 0 Henk 'm!

  • VR46
  • Registratie: Januari 2005
  • Laatst online: 08-09 12:51
CodeCaster schreef op maandag 22 februari 2010 @ 14:36:
[...]

Debuggen. :) Echo de query eens.
SELECT u.UserID, u.UserNickname FROM gheide_cuidado.cdd_users AS u WHERE u.UserNickname IN (Array)

Daar zit de fout dus, lijkt me. Moet ik nu met loops de inhoud van de array in de querystring gaan plaatsen? Of kan dat anders?

Acties:
  • 0 Henk 'm!

  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 21-08 11:20
Je voert nu direct een Array aan een string, PHP zet 'm om in "Array". Je zult je array terug moeten omvormen naar een string.

Bijvoorbeeld:
PHP:
1
2
3
4
5
6
7
$sqlRecip = "";
foreach ($recip in $recipients)
{
    $sqlRecip = $sqlRecip . " '" . mysql_real_escape_string($recip) . "',";
}

$sqlRecip = substr($sqlRecip, strlen($sqlRecip) - 1);


(Deze code heeft wel wat aanpassingen nodig, en is vast nodeloos complex, maar ik heb al een tijd geen PHP meer gedaan :+)

[ Voor 19% gewijzigd door Alex) op 22-02-2010 14:43 ]

We are shaping the future


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

cbernardini schreef op maandag 22 februari 2010 @ 14:39:
Moet ik nu met loops de inhoud van de array in de querystring gaan plaatsen? Of kan dat anders?
Dat kan, maar er is ook gewoon implode(), dan hoef je de laatste komma niet weg te halen ;)

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • VR46
  • Registratie: Januari 2005
  • Laatst online: 08-09 12:51
Alex) schreef op maandag 22 februari 2010 @ 14:42:
Je voert nu direct een Array aan een string, PHP zet 'm om in "Array". Je zult je array terug moeten omvormen naar een string.

Bijvoorbeeld:
PHP:
1
2
3
4
5
6
7
$sqlRecip = "";
foreach ($recip in $recipients)
{
    $sqlRecip = $sqlRecip . " '" . mysql_real_escape_string($recip) . "',";
}

$sqlRecip = substr($sqlRecip, strlen($sqlRecip) - 1);


(Deze code heeft wel wat aanpassingen nodig, en is vast nodeloos complex, maar ik heb al een tijd geen PHP meer gedaan :+)
Ah! zo had ik het eerst, maar ik dacht dat het mogelijk was direct arrays in een query te plaatsen naar aanleiding van wat ik hier las: linkje

Acties:
  • 0 Henk 'm!

  • VR46
  • Registratie: Januari 2005
  • Laatst online: 08-09 12:51
CodeCaster schreef op maandag 22 februari 2010 @ 14:43:
[...]

Dat kan, maar er is ook gewoon implode(), dan hoef je de laatste komma niet weg te halen ;)
Mja... Verschil met implode is dat je dan een dergelijke query krijgt:
SQL:
1
WHERE u.username IN ('klaas,jan,piet,henk,dirk')

...in plaats van...
SQL:
1
WHERE u.username IN ('klaas','jan','piet','henk','dirk')


Laatste lijkt me wat foutintolleranter?

Acties:
  • 0 Henk 'm!

  • Morax
  • Registratie: Mei 2002
  • Laatst online: 20-09 00:30
cbernardini schreef op maandag 22 februari 2010 @ 14:44:
[...]


Ah! zo had ik het eerst, maar ik dacht dat het mogelijk was direct arrays in een query te plaatsen naar aanleiding van wat ik hier las: linkje
Dan moet je implode() gebruiken om de query op te bouwen :)

Edit:
PHP:
1
$query = "WHERE IN ('" . implode("','", $array) . "');";


en vergeet de usernames niet te escapen ;)

[ Voor 12% gewijzigd door Morax op 22-02-2010 14:51 ]

What do you mean I have no life? I am a gamer, I got millions!


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Want er is geen enkele mogelijkheid om die enkele quotes als glue-argument te gebruiken? :)

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • VR46
  • Registratie: Januari 2005
  • Laatst online: 08-09 12:51
CodeCaster schreef op maandag 22 februari 2010 @ 14:49:
[...]

Want er is geen enkele mogelijkheid om die enkele quotes als glue-argument te gebruiken? :)
Hmm daar zeg je me wat :)

Heb nu het volgende, wat me niet erg netjes lijkt (maar wel werkt)...
PHP:
1
2
3
4
5
6
7
$i = 0;
foreach ($receipients as $k => $v)  {
    if ($i == 0) { $sqlreceipients = "'" . $link->real_escape_string($v) . "',"; }
    $sqlreceipients .= "'" . $link->real_escape_string($v) . "',";
    $i++;
}
$sqlreceipients = substr($sqlreceipients, 0, -1);


//Edit: @CodeCaster bedoel jij zoiets?
PHP:
1
2
3
4
$sqlreceipientsnew = "'";
$sqlreceipientsnew .= implode("','", $receipients);
$sqlreceipientsnew .= "'";
$sqlreceipientsnew = $link->real_escape_string($sqlreceipientsnew);

[ Voor 16% gewijzigd door VR46 op 22-02-2010 14:55 ]


Acties:
  • 0 Henk 'm!

  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 21-08 11:20
Dat laatste gaat 'm niet worden, want alleen quotes in de usernames wil je escapen, niet in je hele array. ;)

We are shaping the future


Acties:
  • 0 Henk 'm!

  • VR46
  • Registratie: Januari 2005
  • Laatst online: 08-09 12:51
Alex) schreef op maandag 22 februari 2010 @ 14:58:
Dat laatste gaat 'm niet worden, want alleen quotes in de usernames wil je escapen, niet in je hele array. ;)
Klopt, ik heb er zojuist het volgende van gemaakt:
PHP:
1
2
3
4
5
6
$receipients = str_replace(" ", "", $_POST['receipients']);
$receipients = explode(";", $link->real_escape_string($_POST['receipients']));

$sqlreceipientsnew = "'";
$sqlreceipientsnew .= implode("','", $receipients);
$sqlreceipientsnew .= "'";


Beter?

Acties:
  • 0 Henk 'm!

Verwijderd

Zonder een Grammar Nazi te willen zijn, maak er dan even "recipients" van :)

Acties:
  • 0 Henk 'm!

  • VR46
  • Registratie: Januari 2005
  • Laatst online: 08-09 12:51
Verwijderd schreef op maandag 22 februari 2010 @ 15:47:
Zonder een Grammar Nazi te willen zijn, maak er dan even "recipients" van :)
Oeps :)

Acties:
  • 0 Henk 'm!

  • Raynman
  • Registratie: Augustus 2004
  • Laatst online: 01:30
Betere plek om te escapen, maar die str_replace kun je nu net zo goed weglaten (en dan bedoel ik niet dat het geen goed idee is om spaties weg te halen, maar dat het nog niet helemaal klopt).

[ Voor 41% gewijzigd door Raynman op 22-02-2010 15:53 ]


Acties:
  • 0 Henk 'm!

  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 21-08 11:20
Kun je in plaats van een str_replace niet beter exploden op puntkomma, en dan iedere entry trimmen? Je kunt tenslotte users met een spatie ín hun naam hebben en die zou je anders ook wegreplacen.

We are shaping the future


Acties:
  • 0 Henk 'm!

  • Spiked
  • Registratie: Mei 2008
  • Laatst online: 17-09 15:30
Wat dacht je van:

PHP:
1
2
3
4
5
6
7
$receipients = explode(";", $_POST['receipients']);
$receipients = array_map('trim', $receipients);
$receipients = array_map('mysql_real_escape_string', $receipients);

$sqlreceipientsnew = "'";
$sqlreceipientsnew .= implode("','", $receipients);
$sqlreceipientsnew .= "'";

[ Voor 15% gewijzigd door Spiked op 22-02-2010 16:31 . Reden: Trim toegevoegd ]

Pagina: 1