Meerdere zoektermenZoekmachine voor database
Ik ben bezig met een zoekmachine die gegevens uit een tabel (MySQL) haalt. Opzich werkt dit al wel, alleen als ik 2 zoektermen invul krijg ik meer resultaten ipv minder..
Ik heb eigenlijk nauwelijks php ervaring (alleen een beetje C) dus ik loop al snel vast. Maar wat ik dus tracht te krijgen is wanneer ik meerdere zoektermen invul ik alleen resultaten krijg die aan beide zoektermen voldoen.
Quote:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?
//Maak verbinding met database
$host = "localhost";
$user = "xxxxxxx";
$pass = "xxxxxxx";
$database = "xxxxxxxxx";
$table = "xxxxxxxx";
mysql_connect($host, $user, $pass) or die (mysql_error());
mysql_select_db($database) or die (mysql_error());
$sql = "SELECT id,tekst,plaats,provincie,soort,link FROM $table WHERE MATCH(tekst,plaats,provincie,soort) AGAINST('%$_POST[zoekterm]%' IN BOOLEAN MODE)";
$res = mysql_query($sql) or die(mysql_error());
if (mysql_num_rows($res) >= 1)
{
while ($row = mysql_fetch_array($res))
{
echo "
<b><p>
$row[tekst]<br></b>
$row[plaats]<br>
$row[provincie]<br>
$row[soort]<br>
<a href='http://$row[link]'>Website</a><br>
</p>";
}
echo "<a href=\"zoek.php\" title=\"zoek opnieuw\">zoek opnieuw</a>";
}
else
{
echo "<p>Er is niets gevonden op jou zoekterm:<b> $HTTP_POST_VARS[zoekterm]</b></p>";
echo "<p><a href=\"zoek.php\" title=\"zoek opnieuw\">zoek opnieuw</a></p>";
}
?>
//Maak verbinding met database
$host = "localhost";
$user = "xxxxxxx";
$pass = "xxxxxxx";
$database = "xxxxxxxxx";
$table = "xxxxxxxx";
mysql_connect($host, $user, $pass) or die (mysql_error());
mysql_select_db($database) or die (mysql_error());
$sql = "SELECT id,tekst,plaats,provincie,soort,link FROM $table WHERE MATCH(tekst,plaats,provincie,soort) AGAINST('%$_POST[zoekterm]%' IN BOOLEAN MODE)";
$res = mysql_query($sql) or die(mysql_error());
if (mysql_num_rows($res) >= 1)
{
while ($row = mysql_fetch_array($res))
{
echo "
<b><p>
$row[tekst]<br></b>
$row[plaats]<br>
$row[provincie]<br>
$row[soort]<br>
<a href='http://$row[link]'>Website</a><br>
</p>";
}
echo "<a href=\"zoek.php\" title=\"zoek opnieuw\">zoek opnieuw</a>";
}
else
{
echo "<p>Er is niets gevonden op jou zoekterm:<b> $HTTP_POST_VARS[zoekterm]</b></p>";
echo "<p><a href=\"zoek.php\" title=\"zoek opnieuw\">zoek opnieuw</a></p>";
}
?>
Alvast Bedankt!
Joep
Gewijzigd op 10/11/2010 20:21:08 door Joep Kleinmeulman
Quote:
Opzich werkt dit al wel, alleen als ik 2 zoektermen invul krijg ik meer resultaten ipv minder..
ja en dat is toch in het algemeen altijd zo?
--------------
En nu de bagger van je script:
- or die() is geen correcte foutafhandeling, als er iets fout gaat mag het script niet stoppen maar moet de vervolg code volgens een bepaalde defualt doorlopen kunnen worden!
- _fetch_array is niet optimaal in gebruik zonder 2de parameter, gebruik gewoon _fetch_assoc
- ik zie totaal geen post afhandeling / contoreles en validaties
- sql injectie
- de manier van quote staat me ook tegen, ga strings een quoten met enkele quotes en dan wordt je al gedwongen de variabelen naar buiten te halen
- er is ook geen foutafhandeling indien de queries mislukken
Noppes Homeland op 10/11/2010 20:20:02:
ja en dat is toch in het algemeen altijd zo?
--------------
En nu de bagger van je script:
- or die() is geen correcte foutafhandeling, als er iets fout gaat mag het script niet stoppen maar moet de vervolg code volgens een bepaalde defualt doorlopen kunnen worden!
- _fetch_array is niet optimaal in gebruik zonder 2de parameter, gebruik gewoon _fetch_assoc
- ik zie totaal geen post afhandeling / contoreles en validaties
- sql injectie
- de manier van quote staat me ook tegen, ga strings een quoten met enkele quotes en dan wordt je al gedwongen de variabelen naar buiten te halen
- er is ook geen foutafhandeling indien de queries mislukken
Quote:
Opzich werkt dit al wel, alleen als ik 2 zoektermen invul krijg ik meer resultaten ipv minder..
ja en dat is toch in het algemeen altijd zo?
--------------
En nu de bagger van je script:
- or die() is geen correcte foutafhandeling, als er iets fout gaat mag het script niet stoppen maar moet de vervolg code volgens een bepaalde defualt doorlopen kunnen worden!
- _fetch_array is niet optimaal in gebruik zonder 2de parameter, gebruik gewoon _fetch_assoc
- ik zie totaal geen post afhandeling / contoreles en validaties
- sql injectie
- de manier van quote staat me ook tegen, ga strings een quoten met enkele quotes en dan wordt je al gedwongen de variabelen naar buiten te halen
- er is ook geen foutafhandeling indien de queries mislukken
Bedankt voor de tips ik zal er aan werken!
Maar dan moet ik mijn vraag anders stellen; hoe krijg ik het voor elkaar om ervoor te zorgen dat er alleen resultaten weergegeven worden die aan alle (mooier misschien zelfs; minstens 2) zoektermen voldoet.
Joep
exact zoeken op de velden waarbij dit kan en dat kan je realiseren door je form anders op te zetten
Je zou kunnen explode() op een spatie, en elk woord in een afzonderlijke query behandelen en deze in één keer verwerken (kijk eens naar PDO exec()) en ook een keer op de hele string.
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?
$presql = "SELECT id, tekst, plaats, provincie, soort, link FROM $table WHERE
MATCH(tekst, soort)
AGAINST('%$_POST[zoekterm_wat]%' IN BOOLEAN MODE)";
$sql = "SELECT id, tekst, plaats, provincie, soort, link FROM $presql WHERE
MATCH(plaats,provincie) AGAINST('%$_POST[zoekterm_waar]%' IN BOOLEAN MODE)";
$res = mysql_query($sql) or die(mysql_error()); etc...
?>
$presql = "SELECT id, tekst, plaats, provincie, soort, link FROM $table WHERE
MATCH(tekst, soort)
AGAINST('%$_POST[zoekterm_wat]%' IN BOOLEAN MODE)";
$sql = "SELECT id, tekst, plaats, provincie, soort, link FROM $presql WHERE
MATCH(plaats,provincie) AGAINST('%$_POST[zoekterm_waar]%' IN BOOLEAN MODE)";
$res = mysql_query($sql) or die(mysql_error()); etc...
?>
Ik krijg wel een error, dus ik vrees ervoor.
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT id,tekst,plaats,provincie,soort,link FROM TABLE1 WHERE MATCH(tekst, soo' at line 1
Gewijzigd op 11/11/2010 19:44:00 door Joep Kleinmeulman
Jammer dat je die niet deelt met ons?
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
$split = split(" ",$_POST['zoekterm']);
$sql = "SELECT * FROM tabel WHERE (";
$a = '%';
$tekst = " gevonden voor de woorden: ";
while(list($key,$val)=each($split))
{
if($val<>" " and strlen($val) > 0)
{
$sql .= "(`kolom_van_de_tabel` LIKE '".$a.$val.$a."') AND";
}
}
$sql=substr($sql,0,(strLen($sql)-4));// this will eat the last AND
$sql .= ")";
$sql = "SELECT * FROM tabel WHERE (";
$a = '%';
$tekst = " gevonden voor de woorden: ";
while(list($key,$val)=each($split))
{
if($val<>" " and strlen($val) > 0)
{
$sql .= "(`kolom_van_de_tabel` LIKE '".$a.$val.$a."') AND";
}
}
$sql=substr($sql,0,(strLen($sql)-4));// this will eat the last AND
$sql .= ")";
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?
$presql = "SELECT id, tekst, plaats, provincie, soort, link FROM $table WHERE
MATCH(tekst, soort)
AGAINST('%$_POST[zoekterm_wat]%' IN BOOLEAN MODE)";
$preres = mysql_query($presql) or die(mysql_error());
$sql = "SELECT id, tekst, plaats, provincie, soort, link FROM $preres WHERE
MATCH(plaats,provincie)
AGAINST('%$_POST[zoekterm_waar]%' IN BOOLEAN MODE)";
$res = mysql_query($sql) or die(mysql_error());
?>
$presql = "SELECT id, tekst, plaats, provincie, soort, link FROM $table WHERE
MATCH(tekst, soort)
AGAINST('%$_POST[zoekterm_wat]%' IN BOOLEAN MODE)";
$preres = mysql_query($presql) or die(mysql_error());
$sql = "SELECT id, tekst, plaats, provincie, soort, link FROM $preres WHERE
MATCH(plaats,provincie)
AGAINST('%$_POST[zoekterm_waar]%' IN BOOLEAN MODE)";
$res = mysql_query($sql) or die(mysql_error());
?>
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'MATCH(plaats) AGAINST('%apeldoorn%' IN BOOLEAN MODE)' at line 2
Code (php)
1
2
3
4
2
3
4
<?php
AGAINST('%$_POST[zoekterm_waar]%' IN BOOLEAN MODE)";
AGAINST('".%$_POST[zoekterm_waar]%."' IN BOOLEAN MODE)";
?>
AGAINST('%$_POST[zoekterm_waar]%' IN BOOLEAN MODE)";
AGAINST('".%$_POST[zoekterm_waar]%."' IN BOOLEAN MODE)";
?>
plus tis zo lek als een zeef
Gewijzigd op 12/11/2010 14:13:47 door Teun Hesseling