MAX karakters uit database

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Jurgen B

Jurgen B

13/02/2007 12:17:00
Quote Anchor link
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!
 
PHP hulp

PHP hulp

20/11/2024 04:51:57
 
Joren de Wit

Joren de Wit

13/02/2007 12:31:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
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
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
 
Robert Deiman

Robert Deiman

13/02/2007 12:38:00
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
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.
Gewijzigd op 01/01/1970 01:00:00 door Robert Deiman
 
Joren de Wit

Joren de Wit

13/02/2007 13:15:00
Quote Anchor link
Quote:
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.
 
Robert Deiman

Robert Deiman

13/02/2007 13:50:00
Quote Anchor link
Ok :) dat bedacht ik me net ook toen ik aan het eten was ;)
 
Joren de Wit

Joren de Wit

13/02/2007 14:13:00
Quote Anchor link
Het hield me toch bezig, dus de query maar even met check gemaakt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
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...
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
 
Robert Deiman

Robert Deiman

13/02/2007 14:20:00
Quote Anchor link
En om de ... weer toe te voegen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
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%'
 
Jurgen B

Jurgen B

13/02/2007 15:01:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
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
Gewijzigd op 01/01/1970 01:00:00 door Jurgen B
 
Joren de Wit

Joren de Wit

13/02/2007 15:22:00
Quote Anchor link
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)...
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
 
Jurgen B

Jurgen B

13/02/2007 15:27:00
Quote Anchor link
Ik heb aangepast!

:$ ik wist dat heel erg oud was!
 
Andries Louw Wolthuizen

Andries Louw Wolthuizen

13/02/2007 19:54:00
Quote Anchor link
Hmm, ik kom er zo 123 ook niet uit, is er iemand anders die nog een idee heeft?
 
Jurgen B

Jurgen B

13/02/2007 20:12:00
Quote Anchor link
Ik hoop het maar ... ik kom er zelf niet uit!
 
Joren de Wit

Joren de Wit

13/02/2007 20:47:00
Quote Anchor link
Wat snap je er nog niet aan dan? Er stond btw nog een foutje in mijn query, die heb ik er nu even uitgehaald...

ps. Even een voorbeeld om te laten zien dat het werkt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mysql> SELECT * FROM test;
+----+--------------------------------------------------------------+
| id | content                                                      |
+----+--------------------------------------------------------------+
| 1  | Een stukje waar ergens in het midden een blaat in voorkomt   |
| 2  | Een blaat aan het begin in een stuk tekst moet ook goed gaan |
+----+--------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> SELECT id,
    -> CASE
    -> WHEN LOCATE('blaat', content) - 10 < 0 THEN CONCAT(SUBSTRING(content, 1, 20), '...')
    -> ELSE CONCAT('...', SUBSTRING(content, LOCATE('blaat', content) - 10, 20), '...')
    -> END
    -> AS ingekorte_tekst
    -> FROM test
    -> WHERE content LIKE '%blaat%';
+----+----------------------------+
| id | ingekorte_tekst            |
+----+----------------------------+
| 1  | ...idden een blaat in v... |
| 2  | Een blaat aan het be...    |
+----+----------------------------+
2 rows in set (0.00 sec)
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
 
Jurgen B

Jurgen B

14/02/2007 09:20:00
Quote Anchor link
Oke ik heb nu dus dit:

$sql = "SELECT id,CASE WHEN LOCATE('".$_POST['zoekterm']." ', content) - 10 < 0 THEN CONCAT(SUBSTRING(content, 1, 20), '....')
ELSE CONCAT('...', SUBSTRING(content, LOCATE(' ".$_POST['zoekterm']."', content) - 10, 20), '...')
END
AS ingekorte_tekst
FROM test
WHERE content LIKE '%".$_POST['zoekterm']."%';";

Nu krijg ik de melding:
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource on line 23

Lijn 23 is: if (mysql_num_rows($res) >= 1)

Wat is daar niet goed aan?
 
Joren de Wit

Joren de Wit

14/02/2007 09:56:00
Quote Anchor link
Controleer je wel of je mysql query gelukt is? Daar lijkt het niet op. Die controle moet je sowieso uitvoeren en als de query mislukt is een error weergeven met behulp van mysql_error():
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
if(!$res = mysql_query($sql))
{

    echo '<pre>';
    trigger_error(mysql_errno().': '.mysql_error());
    echo 'Query: '.$sql;
    echo '</pre>';
}

else
{
    // Doorgaan met je script.
}
?>
 
Jurgen B

Jurgen B

14/02/2007 13:32:00
Quote Anchor link
Oké echt helemaal super!!!

Het werkt nu!

Mag ik iedereen bedanken?! :P Allemaal een bosje bloemen!!! ;)

Nu heb ik nog 1 ding ... kan ik het zoekwoord dik gedrukt maken?
 
Joren de Wit

Joren de Wit

14/02/2007 16:09:00
Quote Anchor link
In PHP een str_replace() toepassen op het resultaat van je query?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
// $content = resultaat van query
$content = str_replace($zoekwoord, '<b>'.$zoekwoord.'</b>', $content);
?>
 
Robert Deiman

Robert Deiman

14/02/2007 16:15:00
Quote Anchor link
Jurgen B schreef op 14.02.2007 13:32:
Oké echt helemaal super!!!

Het werkt nu!

Mag ik iedereen bedanken?! :P Allemaal een bosje bloemen!!! ;)

Nu heb ik nog 1 ding ... kan ik het zoekwoord dik gedrukt maken?


Zie mijn eerste post in dit topic
 
Jurgen B

Jurgen B

14/02/2007 23:27:00
Quote Anchor link
Dat werkt nog niet.

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

Hoe zal dat moeten worden?
 
Robert Deiman

Robert Deiman

15/02/2007 07:04:00
Quote Anchor link
Als je dat van mij gebruikt:

$content .= "Resultaat tekst: <b>".str_replace($row['ingekorte_tekst'],'<span class="strong">'.$row['ingekorte_tekst'].'</span>')."</b></p>";

En dan krijg je in je css een stukje:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
.strong{
   font-weight:bold;
   }
 
Jurgen B

Jurgen B

15/02/2007 19:24:00
Quote Anchor link
Dan krijg ik de volgende foutmelding:

Warning: Wrong parameter count for str_replace() on line 39

Warning: Wrong parameter count for str_replace() on line 39
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.