Database zoekfuncite met Boolean Mode
Intro Er staat al een zoekscript op phphulp en andere sites, maar deze zoeken niet goed. Als je bijvoorbeeld Bart Nienhuis intoetst, en voor en achternaam staan in een aparte kolom, komt er geen resultaat. Dat is hier helemaal anders! Het maakt ook nog gebruik van Boolean. Hiermee kun je je zoekopdracht optimaliseren met bijvoorbeeld woorden die niet mogen voorkomen of juist wel. Dit moet u echter zelf in het formulier zetten, en zit niet ingebouwd. In een volgende versie zal ik het er in verwerken. Database Structuur Zo ziet de database eruit in het voorbeeld: Configureren Om dit script te laten werken moet je een fulltext index aan het CHAR, VARCHAR of TEXT veld maar ingezocht moet worden toevoegen. Dit kan in PhpMyAdmin door op het knopje: http://phphulp.jorendewit.nl/images/fulltext.png achter het betreffende veld te klikken of de volgende query uitvoeren: Hierin moet titel, inhoud veranderd worden door de betreffende veleden. (afbeelding van een phphulp tut gehaald) De volgende regels moet u aanpassen aan uw databse: (regel 143) moet een mysql connectie komen en een database geselecteerd worden (regel 159) bestanden moet veranderd worden naar de tabelnaam en name,username etc. moet veranderd worden door de gewenste velden die doorzocht moeten worden Wijzigingen @steen: Ingesprongen @han: heb de dubbele quotes weggehaalt Uitleg over fulltext index Demo en tabel toegevoegd. Slot Als u vragen heeft, of iets anders kwijt wild kunt u mij mailen op [email protected] Veel plezier ermee
[code]
<?php
// Gemaakt door bartje545, [email protected]
// Kijken of het formulier is ingevuld
if (isset($_POST['zoeken2'])) {
// functie om tekste te verkleinen ( van phphulp )
function dec_str($line, $len)
{
if (strlen($line) > $len)
$afgekort = substr($line, 0, $len) . "...";
else
$afgekort = $line;
return ($afgekort);
}
// functie om de zoekresultaten te scheiden, er een plus tussen te zetten enz.
function getMySQLZoekterm($zoekterm){
// Stripslashes, indien nodig
$zoekterm = (get_magic_quotes_gpc == 0 ? stripslashes($zoekterm) : $zoekterm);
// Vervang de spaties tussen " en " door een |
if (preg_match_all('/\"(.*?)\"/', $zoekterm, $matches, PREG_SET_ORDER)) {
foreach($matches as $match) {
$zoekterm = str_replace($match[0], str_replace(' ', '|', $match[0]), $zoekterm);
}
}
// Vervang de spaties tussen ( en } door een ~
if (preg_match_all('/\((.*?)\)/', $zoekterm, $matches, PREG_SET_ORDER)) {
foreach($matches as $match) {
$zoekterm = str_replace($match[0], str_replace(' ', '~', $match[0]), $zoekterm);
}
}
// Stop de zoektermen in een array
$zoektermTemp = preg_split("/[\s,]+/", $zoekterm);
// Doorloop de zoektermen, op zoek naar dubbele keywords achter elkaar
$aantalAND = 0;
$aantalOR = 0;
$zoekterm = array();
$i = 0;
while(list($key, $val) = each($zoektermTemp)){
if (strtoupper($val) == "AND" OR strtoupper($val) == "OR"){
// Als de term hiervoor ook al een operator is, deze verwijderen
if ($key != 0){
if (!( strtoupper($zoektermTemp[$key-1]) == "AND" OR
strtoupper($zoektermTemp[$key-1]) == "OR")){
$zoekterm[$i] = strtoupper($val);
$i++;
// Tel aantal AND en OR's die overblijven
if (strtoupper($val) == "AND"){
$aantalAND++;
}else{
$aantalOR++;
}
}
}
}else{
// Als de vorige term geen operator was, moet er nu een AND tussen
if ($i > 0){
if ($zoekterm[$i-1] != "AND" AND $zoekterm[$i-1] != "OR"){
$zoekterm[$i] = "AND";
$i++;
}
}
// Zoekterm toevoegen
$zoekterm[$i] = $val;
$i++;
}
}
// Doorloop de zoektermen, op zoek naar een AND
while(list($key, $val) = each($zoekterm)){
if (strtoupper($val) == "AND"){
// De term voor en na deze term zijn verplicht
if ($key != 0){
// Voorkom een dubbel plusje
if (substr($zoekterm[$key-1], 0, 1) != "+"){
$zoekterm[$key-1] = "+" . $zoekterm[$key-1];
}
}
if ($key != count($zoekterm) - 1){
$zoekterm[$key+1] = "+" . $zoekterm[$key+1];
}
}
}
// Als er AND én OR in de zoektermen voorkomt, moeten er ronde haken om het AND-deel
if ($aantalAND > 0 && $aantalOR > 0){
reset($zoekterm);
while(list($key, $val) = each($zoekterm)){
// Openingshaak: (
if ($key != count($zoekterm) - 1){
if ($zoekterm[$key+1] == "AND"){
$zoekterm[$key] = "(" . $zoekterm[$key];
}
}
// Sluithaak: )
if ($key != 0){
if ($zoekterm[$key-1] == "AND"){
$zoekterm[$key] = $zoekterm[$key] . ")";
}
}
}
}
// Haal de | en ~ weer weg
$zoekterm = str_replace("|", " ", $zoekterm);
$zoekterm = str_replace("~", " ", $zoekterm);
// Haal handmatig de AND en OR weg
$zoekterm = str_replace("AND", "", $zoekterm);
$zoekterm = str_replace("OR", "", $zoekterm);
// Plak de zoekterm weer aan elkaar
$zoekterm = implode(" ", $zoekterm);
return $zoekterm;
}
include ('../mysql_connect.php');
$zoeken2 = $_POST['zoeken2'];
$find = getMySQLZoekterm("$zoeken2");
//Kijken of er wat is ingevuld
if ($find == "")
{
echo '<p>U heeft geen zoekterm ingevuld';
exit;
}
//Nu de sql query uitvoeren met de fulltext in moolean mode
$data = mysql_query(" SELECT * FROM bestanden WHERE MATCH(naam, username, beschrijving, tags, vak, type) AGAINST('".$find."' IN BOOLEAN MODE)");
echo '<table>'; // netjes in een tebale zetten
echo '<tr><td><B>Naam</b></td><td><B>Beschrijving</B></td><td><B>Vak</B></td><td><B>Type</B></td></tr>';
// de resultaten doorzoeken
while($result = mysql_fetch_array($data))
{
$beschrijving = dec_str($result['beschrijving'], 15);
echo '<tr><td>';
echo $result['naam'];
echo '</td><td>';
echo $beschrijving;
echo '</td><td>';
echo $result['vak'];
echo '</td><td>';
echo $result['type'];
echo '</td></tr>';
}
echo '</table>';
// kijken of er wel resulaten zijn
$anymatches=mysql_num_rows($data);
if ($anymatches == 0)
{
echo 'Er zijn geen resultaten<br><br>';
}
//Nog even zeggen waar naar gezocht werd
echo "<b>Gezocht naar:</b> " .$find;
} else {
// het formulier
?>
<table>
<form action="" method="POST">
<tr><td>Zoekterm:</td><td><input name="zoeken2" type="text" /></td></tr>
<tr><td><input type="submit" name="submit" value="Zoek!" /></td></tr>
</form>
</table>
<?php
}
?>
[/code]
Reacties
0