[mysql] query met "like 6" levert ook 9.7 op...

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • rokas
  • Registratie: Februari 2007
  • Niet online
In mijn tabel heb ik kolomnaam decimal(16,15)

Tabel: waarde
record1: 5
record2: 6
record3: 9.7

$argument="6"
$query = "SELECT * FROM tabel WHERE kolomnaam LIKE '%$argument%' "

Resultaat:
Record 2
Record 3

Ik begrijp niet dat ik record3 terugkrijg.
Dat ik LIKE gebruik komt omdat $argument soms ook wel eens % is en alle records getoond moeten worden

Iemand een hint?

Acties:
  • 0 Henk 'm!

  • ThinkPad
  • Registratie: Juni 2005
  • Laatst online: 22:02
Kun je niet "groter dan" en "kleiner dan" gebruiken?

Groter dan 5, kleiner dan 7

Acties:
  • 0 Henk 'm!

  • Freeaqingme
  • Registratie: April 2006
  • Laatst online: 23:15
Moet een LIKE clause niet standaard bestaan uit minimaal 3 alfanumeriek tekens?

No trees were harmed in creating this message. However, a large number of electrons were terribly inconvenienced.


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Gewoon geen like gebruiken voor getallen. Indien empty($argument) laat je dat stuk where clause gewoon weg. :z

{signature}


Acties:
  • 0 Henk 'm!

  • dragontje124
  • Registratie: Mei 2009
  • Laatst online: 07-09 17:50
anders doe je toch gewoon dit?
SQL:
1
$query = "SELECT * FROM tabel WHERE kolomnaam = '".$argument."' OR '".$argument."' = '' ";

hoewel ik een check in PHP eigenlijk netter vind inderdaad
doe maar gewoon een php check ;)

[ Voor 38% gewijzigd door dragontje124 op 31-12-2010 00:40 ]


Acties:
  • 0 Henk 'm!

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 18-08 21:31
De reden is dat als er strings worden gebruikt in een numerieke vergelijking, dan worden de nummers als double precision floating point getallen gezien.

Jouw getal 9,7 is niet exact als een double uit te drukken, het wordt afgerond naar ~ 9,699999809265137, en daar staat dus wel de 6 in.

De oplossing is geen strings gebruiken als je decimals wilt vergelijken.

Acties:
  • 0 Henk 'm!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
Voutloos schreef op vrijdag 31 december 2010 @ 00:24:
Gewoon geen like gebruiken voor getallen. Indien empty($argument) laat je dat stuk where clause gewoon weg. :z
Precies, het gebruik van LIKE slaat nergens op.

Uit de handleiding:
Simple pattern matching
Dan heb je dus een string nodig om te gaan matchen en niet een getal. In andere databases werkt bovenstaande query niet eens, krijg je direct een foutmelding op de operator.

Mocht je toch een stringvergelijking willen doen, moet je de boel eerst casten naar een string. Dan blijf je uiteraard nog steeds het probleem met de floating point houden.

Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
Je moet overigens ook dat argument geen database logica meegeven. Als het % is, in jouw geval, moet je PHP code dat afvangen door de SQL code aan te passen. Het toestaan om dat argument direct in de query te proppen kan negatieve consequenties hebben, zie ook SQL injectie en dergelijke.

Verder, wat de rest zegt: String functies zoals like moet je niet misbruiken voor getallen.

[ Voor 14% gewijzigd door YopY op 31-12-2010 10:13 ]


Acties:
  • 0 Henk 'm!

  • rokas
  • Registratie: Februari 2007
  • Niet online
Allen dank voor het meedenken, ik ben zo gelukkig als een oliebol.

De reden was inderdaad dat ik zocht met een string in een nummerieke waarde (dom!).

De oplossing (voor mij) was:
converteren naar nummerieke waarde met floatval($argument) te gebruiken (ik heb ook waarden achter de komma/punt nodig)
Niet zoeken met LIKE
Query conditioneel maken, als argument leeg is dan dan die niet gebruiken.

Een mooi jaar zonder bugs gewenst.

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 02:01

MueR

Admin Tweakers Discord

is niet lief

Freeaqingme schreef op vrijdag 31 december 2010 @ 00:20:
Moet een LIKE clause niet standaard bestaan uit minimaal 3 alfanumeriek tekens?
Dat is Full Text Search ;)

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • JochemK
  • Registratie: Maart 2003
  • Laatst online: 22-09 09:35
*weg*

[ Voor 95% gewijzigd door RobIII op 02-01-2011 03:46 ]


Acties:
  • 0 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

MueR schreef op vrijdag 31 december 2010 @ 12:25:
[...]

Dat is Full Text Search ;)
En dat is instelbaar. (Maar op 1 instellen is vrij kansloos en op 2 gaat hard die richting op.)

All my posts are provided as-is. They come with NO WARRANTY at all.

Pagina: 1