Reactie plaatsen 
 
Waardering:
  • 0 stemmen - gemiddelde waardering is 0
  • 1
  • 2
  • 3
  • 4
  • 5
[MySQL] matched teveel
Auteur Bericht
Violent J Offline
Code Warrior
***

Berichten: 219
Lid sinds: 04-2006
Reputatie: 19
Bericht: #1
[MySQL] matched teveel
Ik heb een user-tabel met daarin de kolommen id en uid.
id is gewoon een int, auto_increment, pk
uid is een char(36), gevuld door de uuid() functie, unique index

twee records waar het nu om draait:
id: 6
uid: 8f253a4e-********
en
id: 8
uid: a5a0b5a4-********


Intern gebruik ik het id om gebruikers op te halen, extern wordt het uid gebruikt. In mn servicelayer heb ik dus een methode voor het ophalen van het gebruikersprofiel die 1 parameter accepteert, waar zowel het id als het uid in kan zitten. Vervolgens wordt de volgende query uitgevoerd:
Code:
select * from user where id = ? or uid = ?
(Nee, ik doe niet select * maar is voldoende voor het voorbeeld ;))
Vervolgens wordt de input aan beide placeholders gekoppeld.

Nu blijkt dat wanneer ik uid='8f253a4e' zoek, ik ook het record terugkrijg met id=8.

Dus de volgende query:
Code:
select * from user where id='8f253a4e'
levert het record met id=8 op!

Heeft iemand enig idee hoe ik dit aan de mysql kant kan oplossen?
(Ik heb wel een php-oplossing, met is_int() enzo, maar vindt het eigenlijk een bug aan de mysql kant, vandaar)

Thanks!

May the source be with you
12-03-2010 16:42:54
Alle berichten van deze gebruiker zoeken Reageren op dit bericht
Neophyte Offline
Senior Member
****

Berichten: 672
Lid sinds: 08-2006
Reputatie: 35
Bericht: #2
RE: [MySQL] matched teveel
Vaag ! echt iets voor Mysql, probeer eens zonder die enkele quotes?

12-03-2010 17:13:41
Alle berichten van deze gebruiker zoeken Reageren op dit bericht
Violent J Offline
Code Warrior
***

Berichten: 219
Lid sinds: 04-2006
Reputatie: 19
Bericht: #3
RE: [MySQL] matched teveel
dat gaat sowieso niet, het gaat om een string..

Ik had het nog wel met dubbele quote's geprobeerd, maar dat maakte geen verschil.

May the source be with you
12-03-2010 17:18:43
Alle berichten van deze gebruiker zoeken Reageren op dit bericht
Neophyte Offline
Senior Member
****

Berichten: 672
Lid sinds: 08-2006
Reputatie: 35
Bericht: #4
RE: [MySQL] matched teveel
Ok,

(12-03-2010 16:42:54)Violent J schreef:  Intern gebruik ik het id om gebruikers op te halen, extern wordt het uid gebruikt. In mn servicelayer heb ik dus een methode voor het ophalen van het gebruikersprofiel die 1 parameter accepteert, waar zowel het id als het uid in kan zitten. Vervolgens wordt de volgende query uitgevoerd:

Kun je dan niet beter twee abstracties maken een interne api en externe api ?

12-03-2010 17:34:32
Alle berichten van deze gebruiker zoeken Reageren op dit bericht
Violent J Offline
Code Warrior
***

Berichten: 219
Lid sinds: 04-2006
Reputatie: 19
Bericht: #5
RE: [MySQL] matched teveel
In a perfect world I could :)

Nee serieus, op zich zou het kunnen. Maar dat zie ik eigenlijk als een oplossing van het verkeerde probleem. Op zich vind ik het design wel ok namelijk. Tuurlijk, niet perfect, maar gezien de toepassing biedt het gewoon veel flexibiliteit.

May the source be with you
12-03-2010 17:49:51
Alle berichten van deze gebruiker zoeken Reageren op dit bericht
Aries-Belgium Offline
Open Source Promotor

Berichten: 8.654
Lid sinds: 04-2006
Reputatie: 310
Bericht: #6
RE: [MySQL] matched teveel
Als MySQL dezelfde manier gebruikt dan PHP om tekst naar integer om te zetten, is het vrij simpel. Het veld 'id' (niet 'uid') is waarschijnlijk gewoon een INT?

Doe met PHP dit maar eens:
PHP-code:
var_dump(intval("8f253a4e")); // = 8 

Of dit in MySQL:
Code:
SELECT CAST('8f253a4e' AS UNSIGNED);

[Afbeelding: 2wqbwas.gif]
"I like my women how I like my toast, hot and consumable with butter"
12-03-2010 19:33:44
Alle berichten van deze gebruiker zoeken Reageren op dit bericht
MichielV Offline
ep2'er
****

Berichten: 2.322
Lid sinds: 07-2006
Reputatie: 110
Bericht: #7
RE: [MySQL] matched teveel
Dat is inderdaad doordat MySQL deze naar een integer cast.

Snel opgelost in php lijkt mij:
Code:
$sql = 'select * from user where '.(is_numeric($waarde) ?  'id = ?' : 'uid = ?');

Of als je het echt in sql wil:
Code:
$sql = 'select * from user where CAST(id AS CHAR) = ? or uid = ? ';
(bah wat lelijk :P)


edit: bonus vreemde sql die je probleem oplost :P:
Code:
$sql = 'select * from user where id = ? or uid = ?  ORDER BY (uid=?) DESC LIMIT 1;
(Dit bericht is het laatst bewerkt op 12-03-2010 om 20:38:43 door MichielV.)
12-03-2010 20:27:30
Alle berichten van deze gebruiker zoeken Reageren op dit bericht
Violent J Offline
Code Warrior
***

Berichten: 219
Lid sinds: 04-2006
Reputatie: 19
Bericht: #8
RE: [MySQL] matched teveel
OK, thank guys!

Wanneer ik maandag weer op mn werk ben, zal ik even het een en ander gaan uittesten :)

Goed weekend!

May the source be with you
13-03-2010 08:59:03
Alle berichten van deze gebruiker zoeken Reageren op dit bericht
Violent J Offline
Code Warrior
***

Berichten: 219
Lid sinds: 04-2006
Reputatie: 19
Bericht: #9
RE: [MySQL] matched teveel
Thanks MichielV
Code:
$sql = 'select * from user where CAST(id AS CHAR) = ? or uid = ? ';
did the trick!

rep++

May the source be with you
15-03-2010 11:18:52
Alle berichten van deze gebruiker zoeken Reageren op dit bericht
Reactie plaatsen 


Ga naar locatie:


Contact opnemen | Ep2 | Naar boven | Naar inhoud | Archiefmodus | RSS-syndicatie