MAX karakters uit database
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!
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
SELECT
id,
SUBSTRING(content, LOCATE('blaat', content)-10, 20) AS ingekort
FROM
pagina
WHERE
content LIKE '%blaat%'
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
$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:
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.
SQL aangepast aan de hand van Blanche zijn post:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
SELECT
id,
CONCAT('...',SUBSTRING(content, LOCATE('blaat', content)-40, 60),'...')
FROM
pagina
WHERE
content LIKE '%blaat%'
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
Quote:
Ik bedoelde die 'LOCATE() - 10' ;)Als je je query gebruikt met die WHERE is de LOCATE van het zoekwoord altijd >=0 ;)
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 ;)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
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%'
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
Code (php)
1
2
3
4
5
6
7
8
9
10
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]%'
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
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
:$ 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?
Ik hoop het maar ... ik kom er zelf niet uit!
ps. Even een voorbeeld om te laten zien dat het werkt:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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)
+----+--------------------------------------------------------------+
| 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
$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?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
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.
}
?>
if(!$res = mysql_query($sql))
{
echo '<pre>';
trigger_error(mysql_errno().': '.mysql_error());
echo 'Query: '.$sql;
echo '</pre>';
}
else
{
// Doorgaan met je script.
}
?>
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?
Code (php)
1
2
3
4
2
3
4
<?php
// $content = resultaat van query
$content = str_replace($zoekwoord, '<b>'.$zoekwoord.'</b>', $content);
?>
// $content = resultaat van query
$content = str_replace($zoekwoord, '<b>'.$zoekwoord.'</b>', $content);
?>
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?
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
Ik heb nu:
$content .= "Resultaat tekst: <b>$row[ingekorte_tekst]</b></p>";
Hoe zal dat moeten worden?
$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:
Warning: Wrong parameter count for str_replace() on line 39
Warning: Wrong parameter count for str_replace() on line 39