[PHP/MySQL] LIKE en mysql_num_rows

Pagina: 1
Acties:
  • 666 views

Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
Ik heb een beetje een vreemd probleem.

Ik wil een query doen waarbij ik tel hoeveel items ik terug krijg in een database. De query die ik doe is de volgende:

PHP:
1
SELECT username FROM usernames WHERE username LIKE 'vinyl%'


De wildcard geef ik mee omdat onze usernames bestaan uit bv: vinyl01, vinyl02 etc
Als ik deze query in bv phpmyadmin doe krijg ik keurig 2 rijen terug.

Nu wil ik dit ook in PHP doen in mijn code maar dan heb ik een raar probleem.

Ik doe de query daar als volgt:

PHP:
1
2
3
$query = mysql_query("SELECT username FROM usernames WHERE username LIKE '$username%'") or die(mysql_error());
$num_rows = mysql_num_rows($query);
echo $num_rows;


Daar krijg ik ineens als antwoord: 3230, wat het totaal aantal rijen wat ik heb!

Enig idee wat ik fout doe?

Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
Argh solved it, mijn POST variable kwam niet goed door! Daardoor deed ik alleen een search met de wildcard

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Moraal van het verhaal: debuggen en je daadwerkelijke query afdrukken, niet raden. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Hipska
  • Registratie: Mei 2008
  • Laatst online: 22-09 15:54
En natuurlijk doe je het op deze manier:

SQL:
1
SELECT COUNT(*) AS aantal FROM usernames WHERE username LIKE :username

Acties:
  • 0 Henk 'm!

  • rvanlooijen
  • Registratie: Oktober 2001
  • Laatst online: 21-06-2021
Hipska schreef op woensdag 06 januari 2010 @ 11:39:
En natuurlijk doe je het op deze manier:

SQL:
1
SELECT COUNT(*) AS aantal FROM usernames WHERE username LIKE :username
Je bedoelt natuurlijk:

SQL:
1
SELECT COUNT(username) AS aantal FROM usernames WHERE username LIKE 'vinyl%'


;)

Acties:
  • 0 Henk 'm!

  • Hipska
  • Registratie: Mei 2008
  • Laatst online: 22-09 15:54
Nee

http://dev.mysql.com/doc/...tions.html#function_count

[ Voor 93% gewijzigd door Hipska op 06-01-2010 11:45 . Reden: Documentatie toegevoegd ]


Acties:
  • 0 Henk 'm!

  • rvanlooijen
  • Registratie: Oktober 2001
  • Laatst online: 21-06-2021
Dan heb je ook deze gelezen: "This optimization applies only to MyISAM tables only", ietwat onhandig ;) Ervan uitgaande dat er met InnoDB gewerkt wordt moet hij door alle kolommen knagen. Een nog sneller alternatief dan alleen het username veld:

SELECT COUNT(1) AS aantal FROM usernames WHERE username LIKE 'vinyl%' GROUP BY username

Acties:
  • 0 Henk 'm!

  • Hipska
  • Registratie: Mei 2008
  • Laatst online: 22-09 15:54
Dat het ge-optimaliseerd is voor MyISAM tabellen wil toch ook niet zeggen dat het trager zal werken op andere tabellen? Vandaar dat ik overal gewoon * gebruik bij het simpele tellen van rijen.

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Wees dan ook meteen duidelijk dat je PDO wilt gebruiken, naast die COUNT(*):

PHP:
1
2
3
$stmt = $db->prepare("SELECT COUNT(*) AS aantal FROM usernames WHERE username LIKE :username");
$stmt->bindParam(':username', $username.'%');
$stmt->execute();

Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 21-09 18:37

Saven

Administrator

ViNyL schreef op woensdag 06 januari 2010 @ 11:31:
Argh solved it, mijn POST variable kwam niet goed door! Daardoor deed ik alleen een search met de wildcard
ik mag toch hopen dat je wel de input escapet. en ook raad ik je aan om variablen niet binnen de quotes te doen

Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
Saven schreef op woensdag 06 januari 2010 @ 12:25:
[...]

ik mag toch hopen dat je wel de input escapet. en ook raad ik je aan om variablen niet binnen de quotes te doen
Over het escapen: Dat mag je hopen en dat doe ik ook zeker :) Ik filter de input etc voor deze in de query geplakt wordt.

De query zelf doe ik dan als volgt:

PHP:
1
$query = mysql_query("SELECT COUNT(*) AS aantal FROM usernames WHERE username LIKE '".$username."%'") or die(mysql_error());


Heb dus ook de opmerking hierboven meegenomen om mijn query aan te passen.. Lijkt me prima zo toch.

[ Voor 39% gewijzigd door ViNyL op 06-01-2010 13:06 ]


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
COUNT(kolomnaam) is alleen zinvol als kolomnaam NULL kan zijn. Anders is het alleen maar verwarrend, en een enkele keer ook trager (nml. als de index die voor COUNT gebruikt wordt dan opeens geen covering index meer is).
Gewoon COUNT(*) gebruiken voor niet-null kolommen dus :)

En wat MyISAM betreft: voor een niet-null kolom is een COUNT(kolomnaam) zonder WHERE even snel als een COUNT(*) zondere WHERE.

[ Voor 18% gewijzigd door GlowMouse op 06-01-2010 17:19 ]


Acties:
  • 0 Henk 'm!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
Aanvulling op GlowMouse:
COUNT(kolomnaam) zal NULL's niet meetellen, COUNT(*) zal NULL's ook als record meetellen. Je krijgt dus verschillende resultaten.

Het is handiger om je bij de SELECT af te vragen of je NULL's nu wel of niet wil meetellen, dan dat je afhankelijk wordt van een constraint. Die kan veranderen, daar weet jouw SELECT niets vanaf.

Acties:
  • 0 Henk 'm!

Verwijderd

ViNyL schreef op woensdag 06 januari 2010 @ 11:31:
Argh solved it, mijn POST variable kwam niet goed door! Daardoor deed ik alleen een search met de wildcard
Post variabele zie ik niet terug in je code, ik ga er van uit (hoop..) dat je ergens iets als dit hebt:
PHP:
1
$username = $_POST['username'];


En niet register_globals aan staan? :Y

Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
Verwijderd schreef op woensdag 06 januari 2010 @ 18:40:
[...]

Post variabele zie ik niet terug in je code, ik ga er van uit (hoop..) dat je ergens iets als dit hebt:
PHP:
1
$username = $_POST['username'];


En niet register_globals aan staan? :Y
Nee die post heb ik weggelaten, dat leek me duidelijk. register_globals staat inderdaad uit... :+

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Verwijderd schreef op woensdag 06 januari 2010 @ 18:40:
[...]

Post variabele zie ik niet terug in je code, ik ga er van uit (hoop..) dat je ergens iets als dit hebt:
PHP:
1
$username = $_POST['username'];
Dat hoop ik niet, want dan is er dus geen escaping.

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

Voutloos schreef op woensdag 06 januari 2010 @ 22:40:
[...]
Dat hoop ik niet, want dan is er dus geen escaping.
:') :') :') :') :') :')

Acties:
  • 0 Henk 'm!

Verwijderd

Wat bedoel je nou eigenlijk precies? Eerst post je onzin, en nu reageer je ook nog eens raar. Leg eens in normale mensentaal uit wat je bedoelt of bedoelde.

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Ik zou eerder kiezen voor de :'( in plaats van de :'), want Voutloos heeft wel gelijk. Het is te hopen dat jij geen code schrijft die user-input moet verwerken.

Het juiste antwoord:

PHP:
1
$username = mysql_real_escape_string($_POST['username']);

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op woensdag 06 januari 2010 @ 22:52:
[...]

Wat bedoel je nou eigenlijk precies? Eerst post je onzin, en nu reageer je ook nog eens raar. Leeg eens in normale mensentaal uit wat je bedoelt of bedoelde.
Tering, wat nou ik post onzin. Dus nu moet ik het in normale mensentaal "uitlegen"? Ik heb geen idee wat uitlegen is, als je nog even uitlegt wat je daar mee bedoeld, dan begrijp ik je ook... :')

Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 00:32

TeeDee

CQB 241

Verwijderd schreef op woensdag 06 januari 2010 @ 23:33:
[...]

Tering, wat nou ik post onzin. Dus nu moet ik het in normale mensentaal "uitlegen"? Ik heb geen idee wat uitlegen is, als je nog even uitlegt wat je daar mee bedoeld, dan begrijp ik je ook... :')
Anders reageer je alleen op een tikfout ipv een volkomen terechte reactie.

@Raynman: ;)

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

Verwijderd

Je zegt min of meer dat register_globals evil is. Daar heb je gelijk in. Je geeft echter een alternatief waarin niets wordt geëscapet. Wat is de meerwaarde daarvan dan? Je kunt nog beter scripten met register_globals en magic_quotes_gpc aan, dan met dat soort code (die ik inderdaad classeer als onzin).

En ik reken je dat aan omdat er Zend Certified Engineer onder je naam staat. Dat blijkt niet echt.
Je had beter de kans kunnen aangrijpen om nog iets van je reacties te maken.

Acties:
  • 0 Henk 'm!

  • Raynman
  • Registratie: Augustus 2004
  • Laatst online: 00:00
TeeDee schreef op woensdag 06 januari 2010 @ 23:44:
[...]

Anders reageer je alleen op een tikfout ipv een volkomen terechte reactie.
offtopic:
En dan ook nog met 'je bedoeld' (Skitt's Law), maar goed, dit topic lijkt me verder wel afgerond.

En vrolijk verder met 'je escaped'. (Sorry, kon het niet laten; dat laatste zie ik hier zo vaak: Engels voltooid deelwoord/onvoltooid verleden tijd als persoonsvorm in (min of meer) Nederlandse zinnen.)

[ Voor 30% gewijzigd door Raynman op 07-01-2010 00:09 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op woensdag 06 januari 2010 @ 23:50:
[...]

Je zegt min of meer dat register_globals evil is. Daar heb je gelijk in. Je geeft echter een alternatief waarin niets wordt geëscapet. Wat is de meerwaarde daarvan dan? Je kunt nog beter scripten met register_globals en magic_quotes_gpc aan, dan met dat soort code (die ik inderdaad classeer als onzin).

En ik reken je dat aan omdat er Zend Certified Engineer onder je naam staat. Dat blijkt niet echt.
Je had beter de kans kunnen aangrijpen om nog iets van je reacties te maken.
Dat je escaped is toch logisch, daar ging het toch helemaal niet over? Mijn opmerking was over de register_globals. Ik mag er toch van uit gaan dat iedereen die een beetje serieus met PHP/MySQL bezig is wel snapt dat je de variabelen escaped?

Er staat ook "iets als".. En misschien was de volgende regel wel:
PHP:
1
$username = mysql_real_escape_string($username);
:+
(wat nog steeds bagger is, sowieso heeft het meestal geen meerwaarde om $_POST['username'] eerst in $username te gooien, maar goed..)

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op donderdag 07 januari 2010 @ 00:02:

Dat je escaped is toch logisch, daar ging het toch helemaal niet over? Mijn opmerking was over de register_globals. Ik mag er toch van uit gaan dat iedereen die een beetje serieus met PHP/MySQL bezig is wel snapt dat je de variabelen escaped?
Nou, dat was dus niet duidelijk. Jouw simpele regeltje code kan mensen toch echt de indruk geven dat er niet geëscapet hoeft te worden. Toen er opheldering werd gevraagd, maakte je het niet veel duidelijker. Dus ik had wat moeite om ":') :') :') :') :') :')" te interpreteren. Het devalueerde direct ook je eerdere post.

Het gevaar was dus dat mensen blindelings van je aannemen dat wat daar stond "goed" is. En dat was het niet. Het was kort door de bocht, derhalve onduidelijk, en foutgevoelig voor beginnende copy/paste-developers. En ja, daar zijn er heel veel van.

Vandaar dus het verzoek duidelijker te communiceren. Losse snippets zijn vaak "onzin". Meestal kun je dan beter in 2 of 3 zinnen uitleggen wat er moet gebeuren.

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op donderdag 07 januari 2010 @ 00:14:
[...]

Nou, dat was dus niet duidelijk. Jouw simpele regeltje code kan mensen toch echt de indruk geven dat er niet geëscapet hoeft te worden. Toen er opheldering werd gevraagd, maakte je het niet veel duidelijker. Dus ik had wat moeite om ":') :') :') :') :') :')" te interpreteren. Het devalueerde direct ook je eerdere post.

Het gevaar was dus dat mensen blindelings van je aannemen dat wat daar stond "goed" is. En dat was het niet. Het was kort door de bocht, derhalve onduidelijk, en foutgevoelig voor beginnende copy/paste-developers. En ja, daar zijn er heel veel van.

Vandaar dus het verzoek duidelijker te communiceren. Losse snippets zijn vaak "onzin". Meestal kun je dan beter in 2 of 3 zinnen uitleggen wat er moet gebeuren.
Voor de mensen voor wie het niet duidelijk is dat er geëscapet moet worden is het aan te raden om eerst eens goed in php te verdiepen en niet alles klakkeloos over te nemen, ik ga niet bij alles wat ik hier typ over na denken of er mensen zijn die het verkeerd kunnen gaan gebruiken. Ze kunnen zelf toch ook nadenken, als ze dit niet weten moeten ze nog maar een boek lezen of zo. :Y Zo niet, lekker laat ze dan maar dat kopieeren, dan leren ze het "the hard way".

Acties:
  • 0 Henk 'm!

  • Martine
  • Registratie: Mei 2002
  • Niet online
Het kan toch niet de bedoeling zijn om hier een vraag te stellen en er 'quick and dirty' een voorbeeldcode bij zetten? Een beetje inzet en kwaliteit kan nooit kwaad. ;)

Acties:
  • 0 Henk 'm!

Verwijderd

Martine schreef op donderdag 07 januari 2010 @ 00:38:
Het kan toch niet de bedoeling zijn om hier een vraag te stellen en er 'quick and dirty' een voorbeeldcode bij zetten? Een beetje inzet en kwaliteit kan nooit kwaad. ;)
Jawel? De vraag was alleen of hij hem zelf geset heeft en niet met register_globals! Moet ik dan een hele uitgebreide post maken met alle mogelijke dingen die fout kunnen gaan en elk detail uitleggen? :+

En kwaliteit is vaak al ver te zoeken, ook de code van de TS is nou niet bepaald hoogstaand. :9 Sorry dat ik probeer te helpen, ik zal het niet meer doen..

Acties:
  • 0 Henk 'm!

  • sky-
  • Registratie: November 2005
  • Niet online

sky-

qn nna 👌

@GuidoH - Gedraag je toch gewoon normaal. Niet iedereen is een Zend Certified Engineer (:') wat overigens niet wil zeggen dat je kan programmeren). Dus komop zeg, iedereen moet het leren.

don't be afraid of machines, be afraid of the people who build and train them.


Acties:
  • 0 Henk 'm!

Verwijderd

sky- schreef op donderdag 07 januari 2010 @ 00:50:
@GuidoH - Gedraag je toch gewoon normaal. Niet iedereen is een Zend Certified Engineer (:') wat overigens niet wil zeggen dat je kan programmeren). Dus komop zeg, iedereen moet het leren.
Haha, wat jij wilt.. :') Tering, wat een stelletje mierenneukers hier zeg, ga nu maar ontopic want ik reageer niet meer. :w

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Nah. Het was weer gezellig.

:w

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1

Dit topic is gesloten.