Hallo mensen,

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]%'";

&

$content .= "Resultaat tekst: <b>$row[content]</b></p>";

Bedankt alvast!

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.

[edit]alias in query toegevoegd[/edit]
Voor het vetdrukken van je zoekwoord:

$inhoud=str_replace($zoekwoord,'<span id="strong">'.zoekwoord.'</span>');

en dan in je css:

#strong{
font-weight:bold;
}



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.
Ok :) dat bedacht ik me net ook toen ik aan het eten was ;)
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...
En om de ... weer toe te voegen:


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
En dan alleen $HTTP_POST_VARS nog vervangen door $_POST. Die eerste stamt namelijk nog uit het stenen tijdperk...

ps. Ik denk dat dit: ''%$HTTP_POST_VARS[zoekterm]%'' ook niet helemaal goed gaat. (Twee keer die enkele quote)...
Ik heb aangepast!

:$ ik wist dat heel erg oud was!
Hmm, ik kom er zo 123 ook niet uit, is er iemand anders die nog een idee heeft?

Reageren