login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Vreemde resultaten Zoeksript

Offline markla - 11/07/2008 23:23
Avatar van marklaPHP interesse ik heb een simpele zoek functie gemaakt om in mijn newsitems te zoeken, maar er is iets vreemds wat ik niet kan verklaren.

Als ik een zoekopdracht in vul dan krijg ik soms wel en soms niet een resultaat.

Voorbeeld:
den haag -> geen resultaat
haag -> geen resultaat
dijk -> wel resultaat
sparta -> wel resultaat
spart -> geen resultaat
'den haag' -> geen resultaat +foutmeldingen mysql_num_rows(): supplied argument is not a valid MySQL result resource in ...on line36
mysql_num_rows(): supplied argument is not a valid MySQL result resource in ...on line37

dit is mijn zoekscript"
  1. $search = stripslashes($_POST['search']);
  2. $srch="%".$search."%";
  3.  
  4.  
  5. $sql = "SELECT
  6. *,
  7. DATE_FORMAT(NewsItem_Date, '%d-%m-%Y') AS Game_Date_short
  8. FROM newsitems
  9. WHERE MATCH(NewsItem_Titel,NewsItem_Content) AGAINST('$srch') AND NewsItem_Publist='Y' ORDER BY NewsItem_Date DESC";


dit is mijn tabel
newsitems
Veld Type Null Standaardwaarde
NewsItem_ID int(5) Ja NULL
NewsItem_Position tinyint(2) Ja 00
Author_ID int(4) Ja 0000
NewsItem_Titel varchar(75) Ja
NewsItem_Content text Ja
NewsItem_Date date Ja NULL
NewsItem_Time time Ja 00:00:00
NewsItem_Update date Ja NULL
NewsItem_Category varchar(15) Ja news
NewsItem_TopNews enum('Y', 'N') Ja N
NewsSource_ID varchar(5) Ja
NewsItem_Publist enum('Y', 'N') Ja N
Newsitem_OnFrontpage enum('Y', 'N') Ja Y
NewsItem_seasonID tinyint(2) Ja 00

Indexen: Sleutel naam Type Kardinaliteit Veld
PRIMARY PRIMARY 2550 NewsItem_ID
search FULLTEXT 1 NewsItem_Titel
NewsItem_Content

Ruimte gebruik: Type Gebruik
Data 5.408 KB
Index 3.739 KB
Totaal 9.147 KB
Rij statistiek: Opdrachten Waarde
Formatteren dynamisch
Rijen 2.550
Lengte van de rij ø 2.171
Grootte van de rij ø 3.673 Bytes
Volgende Autoindex 2.628
Gecreëerd 11 Jul 2008 om 11:05
Laatst bijgewerkt 11 Jul 2008 om 11:05
Laatst gecontroleerd 11 Jul 2008 om 11:05




9 antwoorden

Gesponsorde links
Offline phpenguin - 12/07/2008 00:57 (laatste wijziging 12/07/2008 01:00)
Avatar van phpenguin Nieuw lid saniteer variabelen die in een query gaan altijd met PHP.net: mysql_real_escape_string.

Wat er nu gebeurt (in het geval van 'den haag') is dat je query er zo uitziet

...WHERE MATCH(NewsItem_Titel,NewsItem_Content) AGAINST(''den haag'')..

en dit zijn geen double quotes maar telkens 2 singele quotes. Daar slaat mysql dus tilt 

dus pas dit aan:

  1. $srch="%".$search."%";


tot

  1. $srch=mysql_real_escape_string("%".$search."%");





Offline JBke - 12/07/2008 09:19
Avatar van JBke PHP gevorderde pas ook op met CamelCase te gebruiken ik raad dat sterk af gebruik gewoon _ tussen je woordonderdelen. EN inderdaad gebruik mysql_real_escape_string als je geen Zend_Db of een ander ORM gebruikt.
Offline markla - 12/07/2008 10:19
Avatar van markla PHP interesse @ phpenguin
gelijk even aangepast

@ JBke
CamelCase??????



Offline JBke - 12/07/2008 10:20
Avatar van JBke PHP gevorderde CamelCase wil zeggen dat je steeds de eerste letter van een woord Capitalized..

AlbumId en AfbeeldingOnderwerpId

doe beter album_id en afbeelding_onderwerp_id

CamelCase is uppercaseFisrt.....
Offline markla - 12/07/2008 11:53 (laatste wijziging 12/07/2008 11:53)
Avatar van markla PHP interesse @ JBke
thanks

Maar heeft iemand een idee waarom de resultaten zo vreemd zijn?
Offline phpenguin - 12/07/2008 15:31
Avatar van phpenguin Nieuw lid je moet er rekening bij houden dat een FULLTEXT search bepaalde gevolgen heeft:

wanneer het aantal resultaten meer dan 50% bedraagt, dan krijg je geen resultaat. In principe betekent dit: er zijn te veel resultaten, zorg dat je specifieker bent

dit kan misschien een oorzaak zijn waarom hij bij enkel van die bepaalde queries geen resultaat geeft.
Offline markla - 12/07/2008 23:00
Avatar van markla PHP interesse @phpenguin

Dat zal inderdaad de reden zijn.

Maar is er een manier om uit te filteren of er echt geen zoek resultaten zijn of dat er teveel resultaten zijn.
Kan ik een top 25% score in bouwen en dan melden "uw zoek opdracht heeft te veel resultaten. Hierbij de top 25%"


Offline phpenguin - 13/07/2008 00:45 (laatste wijziging 13/07/2008 00:46)
Avatar van phpenguin Nieuw lid je kan een full text search doen in boolean mode,

hiervoor gebruik je de keywords IN BOOLEAN MODE in de AGINSTfunctie

vb
  1. $search = stripslashes($_POST['search']);
  2. $srch="%".$search."%";
  3.  
  4.  
  5. $sql = "SELECT
  6. *,
  7. DATE_FORMAT(NewsItem_Date, '%d-%m-%Y') AS Game_Date_short
  8. FROM newsitems
  9. WHERE MATCH(NewsItem_Titel,NewsItem_Content) AGAINST('$srch' IN BOOLEAN MODE) AND NewsItem_Publist='Y' ORDER BY NewsItem_Date DESC";


er zijn dan wel enkele aandachtspunten:
-de 50 procent regel is niet van toepassing (dus alle resultaten)
-er wordt niet automatisch gesorteert op relevantie (dus het eerste resultaat is niet per se het beste resultaat)
-er moeten hier geen full text indices zijn (wat bij normale dus wel moet). Dit kan vertraging opleveren

het is niet echt een oplossing, maar je kan bv deze query gebruiken als 'backup'. Dus als je originele query geen resultaten oplevert, deze 'boolean' query gebruiken.

Offline markla - 13/07/2008 20:44
Avatar van markla PHP interesse IN BOOLEAN MODE :-|

Oke bedankt, ga ik daar eens mee stoeien
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.23s