Meerdere zoekwoorden in database search

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Arthur Diependaal

Arthur Diependaal

10/05/2007 07:07:00
Quote Anchor link
Mijn zoekmachine heeft 1 keyword-veld, en ik wil graag dat bezoekers meerdere keywords kunnen opgeven. Het resultaat moet tenminste een van de woorden bevatten. (Of meerdere).

Mijn query ziet er op dit moment als volgt uit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?

$keyword
= $_GET['key'];
 
$sql = "SELECT DISTINCT(title), desc, url, timestamp, lang FROM table WHERE title LIKE '%$keyword%' OR desc LIKE '%$keyword%' AND lang='en' ORDER BY timestamp DESC LIMIT 0,10";

?>


Ik kan op dit moment helaas geen fulltext gebruiken. $keyword heeft mogelijk meerdere waardes, die niet perse naast elkaar staan. Heeft iemand een idee hoe ik dit aan kan pakken?
 
PHP hulp

PHP hulp

23/11/2024 21:31:01
 
- -

- -

10/05/2007 08:01:00
Quote Anchor link
Twee tabellen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
table
------------------
id
title
desc
url
enzovoorts

keywords
------------------
id
table_id
keyword


Nu kun je keywords toevoegen door een rij in de tabel 'keywords' aan te maken en daar het id van je rij uit de andere tabel als 'table_id' te gebruiken. Voor het zoeken doe je dan zoiets:

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
SELECT
    DISTINCT(t.title),
    t.desc,
    t.url,
    t.timestamp,
    t.lang
FROM table t
LEFT JOIN keywords k
ON k.table_id = t.id
WHERE t.title LIKE '%$keyword%'
OR t.desc LIKE '%$keyword%'
OR k.keyword LIKE '$keyword'
AND t.lang='en'
ORDER BY t.timestamp DESC
GROUP BY t.id
LIMIT 0,10


Verder wil ik je er even op wijzen dat het veiliger is om variabelen met user-input nog even te checken (SQL Injection) en dat het netter is om variabelen buiten quote's te houden: $sql = "iets ".$var." nogiets";
 
Arthur Diependaal

Arthur Diependaal

10/05/2007 08:15:00
Quote Anchor link
Hoi Herjan,

Bedankt voor je berichtje. Natuurlijk wordt de user input gecheckt, maar het leek me simpeler om het even zo te schetsen. Ik kan geen aparte database maken met keywords, omdat ik een paar honderd posts per dag heb, en geen keywords kan gaan zitten invullen :)

Is het mogelijk om dit op een andere manier op te lossen?
Gewijzigd op 01/01/1970 01:00:00 door Arthur Diependaal
 
Martijn Wieringa

Martijn Wieringa

10/05/2007 08:44:00
Quote Anchor link
Je kunt de input van de bezoeker eenvoudig splitsen en speciale karakters negeren.

Vervolgens voor elk deel van de zoekstring je query uitbreiden..

Voorbeeld is niet getest, maar zou er ong. zo uit moeten zien:

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
25
<?php

    $searchstring
= stripslashes($_POST["searchstring"]);
    $keywords = preg_split('/[^a-z0-9]/i', $searchstring);

    if(sizeof($keywords) > 0)
    {

        $sql = "SELECT * FROM `table` WHERE ";

        for($i = 0; $i < sizeof($keywords); $i++)
        {

            if($i > 0)
            {

                $sql .= " AND ";
            }


            $sql .= "(`column1` LIKE '%" . $keywords[$i] . "%' OR `column2` LIKE '%" . $keywords[$i] . "%' OR `column3` LIKE '%" . $keywords[$i] . "%')";
        }
    }

    else
    {
        echo 'Er is geen geldige zoekstring opgegeven.';
    }


?>
Gewijzigd op 01/01/1970 01:00:00 door Martijn Wieringa
 
- wes  -

- wes -

10/05/2007 09:00:00
Quote Anchor link
@phol FOEEIIII weg backticks weg verdwijn aaaaaaaaaaaa
 
- SanThe -

- SanThe -

10/05/2007 09:25:00
Quote Anchor link
Tabelnaam desc? Dat is een gereserveerd word van mysql.
 
Crispijn -

Crispijn -

10/05/2007 09:43:00
Quote Anchor link
vandaar de backticks van Pholeron??? ;)

Nee, en toch is het niet slim om desc als veldnaam te gebruiken. De kans op fouten wordt veel te groot
Gewijzigd op 01/01/1970 01:00:00 door Crispijn -
 
Steff   an

Steff an

10/05/2007 09:50:00
Quote Anchor link
Crispijn: Lezen! Waar staat dat Pholeron 'desc' als veldnaam gebruikt?
 
Martijn Wieringa

Martijn Wieringa

10/05/2007 16:29:00
Quote Anchor link
@Steffan

Het gaat om de eeuwige discussie hoe nauw we ons aan de syntax moeten houden :P Ik ga voor 'zeer nauw' waar Wes kennelijk kiest voor een 'iets lossere' aanpak (:

Zolang je geen '(my)sql keywords' of andere speciale karakters in de naam van de tabel/kolom gebruikt hoef je geen backticks te gebruiken. Maar mét backticks gaat het altijd goed, en dat is voor mij reden genoeg ze ALTIJD te gebruiken
 
- -

- -

10/05/2007 16:59:00
Quote Anchor link
@Arthur: hetzelfde wat Pholeron dus doet met die keywords bij het zoeken, kun je dus ook doen bij het invoeren. Je laat degene die het bericht post een aantal keywords invullen, gescheiden door komma's, spaties, slashes, punten, wat je maar wilt. Vervolgens voeg je die toe aan de database.
 



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.