Toon posts:

Probleem met query

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0Henk 'm!

  • tomo-dj
  • Registratie: Februari 2010
  • Laatst online: 31-05 19:57
Dag beste PHPers,

Ik ben op het moment bezig met een ruilwaarde systeem voor de wel bekende community "habbohotel". De bedoeling is dat mijn script ook ruilwaardes gaat op halen van andere fansites (Ruilwaarde.nl, Habbopagina.nl), deze waardes worden opgeslagen in mijn database table "ruilwaarde_value" dit werkt allemaal prima.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-- 
-- Tabel structuur voor tabel `ruilwaarde_value`
-- 

CREATE TABLE `ruilwaarde_value` (
  `value_id` int(11) NOT NULL auto_increment,
  `furni_id` int(11) NOT NULL default '0',
  `furni_name` varchar(255) NOT NULL,
  `value_hc` varchar(11) NOT NULL,
  `value_credit` varchar(11) NOT NULL,
  `value_position` enum('1','2','3') NOT NULL default '2' COMMENT '1=Up, 2=Equal, 3=Down',
  `value_site` enum('1','hp','rw') NOT NULL,
  PRIMARY KEY  (`value_id`),
  FULLTEXT KEY `furni_name` (`furni_name`)
) ENGINE=MyISAM AUTO_INCREMENT=4087 DEFAULT CHARSET=utf8 AUTO_INCREMENT=4087 ;


De meubels worden aan de hand van de opgegeven category geladen uit de database table "ruilwaarde_furni". Vervolgens word er gekeken of de "furni_name" uit de table "ruilwaarde_furni" overeen komt met een "furni_name" uit de table "ruilwaarde_value", dit gebeurt nu dus nog met de mysql function LIKE %meubelname%.

code:
1
2
3
4
5
6
7
8
9
10
11
12
-- 
-- Tabel structuur voor tabel `ruilwaarde_furni`
-- 

CREATE TABLE `ruilwaarde_furni` (
  `furni_id` int(11) NOT NULL auto_increment,
  `category_id` int(11) NOT NULL,
  `furni_name` varchar(255) NOT NULL,
  `furni_img` varchar(255) NOT NULL,
  `furni_state` enum('1','2') NOT NULL default '2' COMMENT '1=Off, 2=On',
  PRIMARY KEY  (`furni_id`)
) ENGINE=MyISAM AUTO_INCREMENT=1345 DEFAULT CHARSET=utf8 AUTO_INCREMENT=1345 ;


Het probleem is nu alleen dat ruilwaarde.nl en habbopagina.nl niet allemaal de zelfde meubel namen hebben. Bijvoorbeeld "hc bank" en "hc-bank" wanneer ik nu dus met LIKE %hcbank% zal op vragen zal ik niet het resultaat "hc-bank" krijgen.

Dit probleem heb ik al proberen op te lossen op de volgende manier:
code:
1
"SELECT `furni_name`,`value_position`,`value_hc`,`value_credit` FROM `ruilwaarde_value` WHERE `value_site` = 'rw' AND `furni_id` = '" . $meubelAssoc['furni_id'] . "' OR MATCH (furni_name) AGAINST ('+" . str_replace(" ", " +", $meubelAssoc['furni_name']) . "' IN BOOLEAN MODE)";


Alleen krijg je dus ook dingen die niet kloppen bijvoorbeeld "blaue zeeduif" ook "witte zeeduif" als resultaat te zien.

Iemand enig ideé over hoe ik dit wel kan oplossen?

Acties:
  • 0Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 05-06 10:41

NMe

Quia Ego Sic Dico.

Consistente naamgeving afdwingen of eenduidige ID's afspreken...of inderdaad false positives voor lief nemen.

'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:
  • 0Henk 'm!

  • tomo-dj
  • Registratie: Februari 2010
  • Laatst online: 31-05 19:57
NMe schreef op dinsdag 24 mei 2011 @ 11:25:
Consistente naamgeving afdwingen of eenduidige ID's afspreken...of inderdaad false positives voor lief nemen.
Met ID's is eigenlijk geen optie. Aangezien er 1000de meubels in de database zijn en ze dan een voor een koppelen lijkt me niet leuk? De koppel mogelijkheid met ID's zit er wel al in voor de meubels die ik handmatig kan doen als ze dus helemaal de zelfde naam hebben.

Misschien kan ik dit systeem gebruiken om nu alle ID's te koppelen met LIKE % % en de meubels die dan niet kloppen handmatig het goede "furni_id" gaan geven?

Acties:
  • 0Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 05-06 10:41

NMe

Quia Ego Sic Dico.

Bijvoorbeeld.

Overigens is LIKE geen functie maar een operator en kun je die beter vermijden als je juist precieze strings wil matchen omdat het een trage bedoening is. ;)

Overigens geeft MATCH een score terug die je óók kan selecteren. Je kan natuurlijk zelf die score selecteren en dan alleen resultaten met een bepaalde minimale score in je resultset opnemen met een simpele WHERE. ;)

[Voor 40% gewijzigd door NMe op 24-05-2011 12:44]

'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:
  • 0Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Je kan ook een eigen soort escape toepassen op de namen, strip alle spaces en streepjes weg en sla die naam erbij op. Probeer eerst daar een hit op te vinden (sneller) en als je dan niks vind probeer je het met LIKE danwel MATCH.

Acties:
  • 0Henk 'm!

  • tomo-dj
  • Registratie: Februari 2010
  • Laatst online: 31-05 19:57
Cartman! schreef op dinsdag 24 mei 2011 @ 13:07:
Je kan ook een eigen soort escape toepassen op de namen, strip alle spaces en streepjes weg en sla die naam erbij op. Probeer eerst daar een hit op te vinden (sneller) en als je dan niks vind probeer je het met LIKE danwel MATCH.
Als ik alles zonder spaties en streepjes ga opslaan kan ik bij het weergeven toch nooit weer spaties terug toveren?

Ik heb het hier even met de leraar op school over gehad hij zei kijk eens naar de mysql functie "SOUNDS LIKE"? Iemand hier enige ervaring met deze function?

Verder gaf hij ook advies om eens te kijken of mysql een stip function heeft en zo een strip uit te voeren op de colum die je wilt vergelijken en vervolgens een stip op de data die je wilt zoeken. Zo dat er van alle 2 de kanten word gezocht en verleken zonder spaties etc.

Acties:
  • 0Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Laatst online: 11:59

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

tomo-dj schreef op dinsdag 24 mei 2011 @ 13:52:
[...]


Als ik alles zonder spaties en streepjes ga opslaan kan ik bij het weergeven toch nooit weer spaties terug toveren?
Daar richt je dan een apart veld voor in slimmerik ;)

code:
1
2
3
4
id   name          fixedname
1    table foo     tablefoo
2    table-foo     tablefoo
3    table!-foo!~  tablefoo
tomo-dj schreef op dinsdag 24 mei 2011 @ 13:52:
Ik heb het hier even met de leraar op school over gehad hij zei kijk eens naar de mysql functie "SOUNDS LIKE"? Iemand hier enige ervaring met deze function?
Sounds like :? Nee, geen ervaring mee. Wel SOUNDEX
edit:
Ah; SOUNDS LIKE is een "alias" van SOUNDEX :D :X

[Voor 30% gewijzigd door RobIII op 24-05-2011 14:04]

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

Roses are red Violets are blue, Unexpected ‘{‘ on line 32.

Over mij


Acties:
  • 0Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 05-06 10:41

NMe

Quia Ego Sic Dico.

tomo-dj schreef op dinsdag 24 mei 2011 @ 13:52:
[...]

Als ik alles zonder spaties en streepjes ga opslaan kan ik bij het weergeven toch nooit weer spaties terug toveren?
Wie heeft gezegd dat je ze niet allebei kan opslaan in aparte velden?
Ik heb het hier even met de leraar op school over gehad hij zei kijk eens naar de mysql functie "SOUNDS LIKE"? Iemand hier enige ervaring met deze function?
SOUNDS LIKE is een operator, geen functie. De functie die deze operator makkelijker beschikbaar maakt heet SOUNDEX. Dergelijke functies zijn heel leuk maar vreten ook behoorlijk wat resources en ik zou er ver van weg blijven als je ze niet nodig hebt. (Sorry, ik verwarde soundex met levenshtein.) Sowieso zou je precies hetzelfde probleem hebben als met fulltext zoals je nu hebt.
Verder gaf hij ook advies om eens te kijken of mysql een stip function heeft en zo een strip uit te voeren op de colum die je wilt vergelijken en vervolgens een stip op de data die je wilt zoeken. Zo dat er van alle 2 de kanten word gezocht en verleken zonder spaties etc.
Dat is precies wat Cartman! zegt alleen wil hij dat daarbij ook nog eens redundant opslaan.

'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:
  • 0Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Laatst online: 11:59

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

NMe schreef op dinsdag 24 mei 2011 @ 14:03:

Dat is precies wat Cartman! zegt alleen wil hij dat daarbij ook nog eens redundant opslaan.
Je kunt ook de SOUNDEX al redundant opslaan ;) Scheelt weer :P

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

Roses are red Violets are blue, Unexpected ‘{‘ on line 32.

Over mij


Acties:
  • 0Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 05-06 10:41

NMe

Quia Ego Sic Dico.

RobIII schreef op dinsdag 24 mei 2011 @ 14:07:
[...]

Je kunt ook de SOUNDEX al redundant opslaan ;) Scheelt weer :P
True. :P Maar dat kan weer niet als je SOUNDS LIKE wil gebruiken, wel met SOUNDEX(). Deze twee betekenen hetzelfde:
MySQL:
1
2
3
veld1 SOUNDS LIKE veld2

SOUNDEX(veld1) = SOUNDEX(veld2)

'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:
  • 0Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Laatst online: 11:59

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

NMe schreef op dinsdag 24 mei 2011 @ 14:12:
Maar dat kan weer niet als je SOUNDS LIKE wil gebruiken, wel met SOUNDEX(). Deze twee betekenen hetzelfde:
Huh?
SQL:
1
2
3
4
5
insert into sometable (foo, bar, redundant_soundslike_veld) values (x, y, soundex(y))

--In de zoekquery:
Select ...
Where redundant_soundslike_veld SOUNDS LIKE myparameter

Niet dan?

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

Roses are red Violets are blue, Unexpected ‘{‘ on line 32.

Over mij


Acties:
  • 0Henk 'm!

  • tomo-dj
  • Registratie: Februari 2010
  • Laatst online: 31-05 19:57
NMe schreef op dinsdag 24 mei 2011 @ 14:12:
[...]

True. :P Maar dat kan weer niet als je SOUNDS LIKE wil gebruiken, wel met SOUNDEX(). Deze twee betekenen hetzelfde:
MySQL:
1
2
3
veld1 SOUNDS LIKE veld2

SOUNDEX(veld1) = SOUNDEX(veld2)
Maar zoals jullie zei levert dit het zelfde resultaat als "fulltext"? Dan is dit dus niet de oplossing. Ik zit zelf ook nog te denken om een cronjob in te stellen die de furni_id gewoon in gaat vullen en dat ik bij het ophalen wat de gebruikers dus zien alleen maar naar de ID's hoef te kijken? Of is het net zo makkelijk en net zo snel om naar de redundant naam te kijken?

Acties:
  • 0Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 05-06 10:41

NMe

Quia Ego Sic Dico.

RobIII schreef op dinsdag 24 mei 2011 @ 14:14:
[...]

Huh?
SQL:
1
2
3
4
5
insert into sometable (foo, bar, redundant_soundslike_veld) values (x, y, soundex(y))

--In de zoekquery:
Select ...
Where redundant_soundslike_veld SOUNDS LIKE myparameter

Niet dan?
Nee, want dan doe je onder water dit:
MySQL:
1
WHERE SOUNDEX(SOUNDEX(waarde)) = SOUNDEX(myparameter)

Geen idee of de soundex van een soundex hetzelfde teruggeeft; als dat zo is dan werkt het vast wel. :Y)
tomo-dj schreef op dinsdag 24 mei 2011 @ 14:16:
[...]

Maar zoals jullie zei levert dit het zelfde resultaat als "fulltext"?
Niet helemaal, ik verwarde soundex met levenshtein en dat is hier niet zo van toepassing. Je zou inderdaad soundex kunnen gebruiken.

[Voor 22% gewijzigd door NMe op 24-05-2011 14:18]

'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:
  • 0Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Laatst online: 11:59

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

NMe schreef op dinsdag 24 mei 2011 @ 14:17:
[...]

Nee, want dan doe je onder water dit:
Ah; duh 8)7 Ofcourse.

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

Roses are red Violets are blue, Unexpected ‘{‘ on line 32.

Over mij


Acties:
  • 0Henk 'm!

  • tomo-dj
  • Registratie: Februari 2010
  • Laatst online: 31-05 19:57
Ik zal eens gaan kijken hoe ver ik met deze function ga komen, alvast bedankt!

code:
1
select * from ruilwaarde_value where soundex(furni_name) = soundex('Camp Rock TV')

Acties:
  • 0Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Laatst online: 11:59

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Als je maar goed in je achterhoofd de "limitaties" van Soundex houdt.
SQL:
1
select soundex('bird'), soundex('bord'), soundex('bard'), soundex('brt'), soundex('brrrt')

'B630', 'B630', 'B630', 'B630', 'B630'

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

Roses are red Violets are blue, Unexpected ‘{‘ on line 32.

Over mij


Acties:
  • 0Henk 'm!

  • creator1988
  • Registratie: Januari 2007
  • Laatst online: 07-06 23:20
RobIII schreef op dinsdag 24 mei 2011 @ 14:44:
Als je maar goed in je achterhoofd de "limitaties" van Soundex houdt.
SQL:
1
select soundex('bird'), soundex('bord'), soundex('bard'), soundex('brt'), soundex('brrrt')

'B630', 'B630', 'B630', 'B630', 'B630'
En beseft dat dit een Engelse Soundex variant is.

Acties:
  • 0Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Laatst online: 11:59

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

creator1988 schreef op dinsdag 24 mei 2011 @ 15:28:
[...]


En beseft dat dit een Engelse Soundex variant is.
Ook nog inderdaad, maar een Nederlandse zou vergelijkbare "issues" hebben ;)
Overigens; ik weet niet hoe 't bij MySQL geregeld is maar voor MSSQL kun je volgens mij een taalspecifieke soundex afdwingen door dat ergens op DB-niveau in te stellen. Ik weet alleen zo snel niet meer waar/hoe :P
Of ben ik nou in de war met FT word breakers... ik weet 't effe niet meer :P

Overigens2: Een soundex zou altijd een 4 karakters tellende "hash" moeten opleveren (letter-cijfer-cijfer-cijfer); althans: dat is het "originele" algoritme. MySQL maakt daar (bij mij althans) vrolijk een veel langere string van wanneer nodig
SQL:
1
select soundex('hottentottententententoonstelling')

H35353535353523452

SQL Server geeft netjes:
H353


En nou zit ik hiermee in m'n kop :D :P

[Voor 76% gewijzigd door RobIII op 24-05-2011 16:16]

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

Roses are red Violets are blue, Unexpected ‘{‘ on line 32.

Over mij


Acties:
  • 0Henk 'm!

  • tomo-dj
  • Registratie: Februari 2010
  • Laatst online: 31-05 19:57
Dag allen deze function lijkt het goed te doen! Alleen heb ik nu een probleem met de data die in de database verwerkt word waar door hij niet goed werk.

Aloë Vera! // Aloë Vera! :: Deze komen namelijk niet overeen officiaal zou deze in de database opgeslagen moeten zijn als (Aloë Vera!) helaas heeft hij dit niet gedaan.

Ik dacht dat je de speciale karakters op de volgende manier om moest zetten naar HTML tekens? Of licht het aan de mysql_real_escape_string?

code:
1
`furni_name` = '" . mysql_real_escape_string(htmlspecialchars($aapje['naam'], ENT_QUOTES)) . "'


EDIT:

Probleem gevonden de furni_name word namelijk al gevonden als "Röntgenscherm" en dan gooit hij er nog een keer htmlspecialchars oven en dan krijg ik dus "Aloë Vera!" is dit ook op te lossen?

[Voor 15% gewijzigd door tomo-dj op 24-05-2011 20:01]


Acties:
  • 0Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Daar zijn echt absurd veel topics over. Escapen doe je voor een bepaalde context. Zo gebruik je bijvoorbeeld mysql_real_escape_string() als je een string echt :+ voor mysql wilt escapen. En html zooi gebruik je dan als je met, jawel, html bezig gaat. Die functies hebben op dit punt niets te zoeken.

{signature}

Pagina: 1


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee