Meerdere zoekwoorden in database search
Mijn query ziet er op dit moment als volgt uit:
Code (php)
1
2
3
4
5
6
7
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";
?>
$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?
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
table
------------------
id
title
desc
url
enzovoorts
keywords
------------------
id
table_id
keyword
------------------
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
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";
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
Vervolgens voor elk deel van de zoekstring je query uitbreiden..
Voorbeeld is niet getest, maar zou er ong. zo uit moeten zien:
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
25
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.';
}
?>
$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
@phol FOEEIIII weg backticks weg verdwijn aaaaaaaaaaaa
Tabelnaam desc? Dat is een gereserveerd word van mysql.
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 -
Crispijn: Lezen! Waar staat dat Pholeron 'desc' als veldnaam gebruikt?
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
@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.