Ik ben bezig met een zoekscriptje en ik wil die op een website zetten.
Nou zit ik met het volgende:
De gegevens haalt hij wel uit de database, maar dan de hele pagina. Ik zou graag dat er van die pagina een selectie wordt gemaakt van het stukje waar het zoekwoord in voorkomt. Is dat mogelijk? Het liefst ook nog dat het zoekwoord dikgedrukt wordt, maar dat is waarschijnlijk moeilijker.
De query waarmee ik de gegevens uit de database haal zijn:
$sql = "SELECT id,content FROM pagina WHERE content LIKE '%$HTTP_POST_VARS[zoekterm]%'";
SELECT
id,
SUBSTRING(content, LOCATE('blaat', content)-10, 20) AS ingekort
FROM
pagina
WHERE
content LIKE '%blaat%'
Ik denk dat het zoiets moet zijn, is niet getest. Hoogstwaarschijnlijk zul je nog een check moeten toevoegen dat het resultaat van LOCATE() wel >= 0 blijft, aangezien SUBSTRING zich anders gedraagt als je voor de tweede parameter een negatieve waarde opgeeft.
'blaat' kun je natuurlijk vervangen door een variabele. Oja, gebruik geen $HTTP_POST_VARS, dat is echt uit de steentijd. Tegenwoordig gebruik je gewoon $_POST.
Voor wat betreft je vraag over de selectie, zou ik altijd met het begin van het stukje beginnen waarin het voorkomt. Vaak staat er een soort van inleiding, waaraan je gauw kan zien of het onderwerp juist is.
Met een MySQL query, waarbij de 0 het beginpunt is en 80 de lengte van het stuk wat je weer wil geven. Door de CONCAT functie die erin staat, komt er aan het eind van het stukje automatisch ... te staan:
SELECT CONCAT(SUBSTRING(kolomnaam,0,80),'...') AS short_content FROM tabel
Blanche schreef op 13.02.2007 12:31
Ik denk dat het zoiets moet zijn, is niet getest. Hoogstwaarschijnlijk zul je nog een check moeten toevoegen dat het resultaat van LOCATE() wel >= 0 blijft, aangezien SUBSTRING zich anders gedraagt als je voor de tweede parameter een negatieve waarde opgeeft.
Als je je query gebruikt met die WHERE is de LOCATE van het zoekwoord altijd >=0 ;)
[edit]
SQL aangepast aan de hand van Blanche zijn post:
SELECT
id,
CONCAT('...',SUBSTRING(content, LOCATE('blaat', content)-40, 60),'...')
FROM
pagina
WHERE
content LIKE '%blaat%'
Het "mooie" van het op deze manier werken met SQL vind ik dat je nu kan zien dat het een stukje uit het midden van de pagina is. Ik heb -40 en 60 gedaan, omdat je dan voldoende kan zien wat de context is waarin het zoekwoord voorkomt, doordat de tekst met ... begint en ook met ... eindigd.
[/edit]
Als je je query gebruikt met die WHERE is de LOCATE van het zoekwoord altijd >=0 ;)
Ik bedoelde die 'LOCATE() - 10' ;)
Als het begin van het zoekwoord op plaats 5 gevonden wordt, is het resultaat van die uitdrukking dus -5. In dat geval zal SUBSTRING() zich anders gedragen.
Het hield me toch bezig, dus de query maar even met check gemaakt:
SELECT
id,
CASE
WHEN LOCATE(content, 'blaat') - 10 < 0 THEN SUBSTRING(content, 1, 20)
ELSE SUBSTRING(content, LOCATE(content, 'blaat') - 10, 20)
END
AS ingekorte_tekst
FROM
pagina
WHERE
content LIKE '%blaat%'
ps. De waarden 'blaat', 10 en 20 kun je natuurlijk door variabelen vervangen...
SELECT
id,
CASE
WHEN LOCATE(content, 'blaat') - 10 < 0 THEN CONCAT(SUBSTRING(content, 1, 20),'...') AS ingekorte_tekst
ELSE CONCAT('...',SUBSTRING(content, LOCATE(content, 'blaat') - 10, 20),'...') AS ingekorte_tekst
END
FROM
pagina
WHERE
content LIKE '%blaat%'
SELECT
id,
CASE
WHEN LOCATE(content, 'blaat') - 10 < 0 THEN CONCAT(SUBSTRING(content, 1, 20),'...') AS ingekorte_tekst
ELSE CONCAT('...',SUBSTRING(content, LOCATE(content, '%$POST[zoekterm]%') - 10, 20),'...') AS ingekorte_tekst
END
FROM
pagina
WHERE
content LIKE '%$POST[zoekterm]%'
Is dit zoals het uiteindelijk moet zijn?
Echt super dat jullie allemaal zo helpen!
(Nee dus :P Zo krijg ik een foutmelding)
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in