#!/usr/bin/perl -w use strict; use CGI qw(:standard); use HTML::Template; use extra; my $q = new CGI; my $tpl = HTML::Template->new(filename => "templates/zoeken.tmpl", die_on_bad_params => 0); my $termen = param('q'); my $sessie; my $type; my $mode; my $wie; $sessie = extra::init_sessie(10, {}); my %account = %extra::account; if($account{type} < 10) { $tpl->param(INGELOGD => 1, LOGIN => $account{naam}); } my $dbh; $dbh = extra::init_database(); $type = $account{type}; $mode = extra::typetomode($type); $wie = $account{id}; extra::init_pagina($q); my @t; sub lijstjevancategorieen { my $sth; my $r; my @p; my $aid; my $anaam; $sth = extra::database_exec($dbh, "SELECT id, naam FROM categorie WHERE ouder=0 AND id!=0 ORDER BY naam, id"); while(($aid, $anaam) = $sth->fetchrow_array()) { my $sth2; my @subs; my $bid; my $bnaam; @subs = ({ ID => 0, NAAM => "Maak een selectie" }); $sth2 = extra::database_exec($dbh, "SELECT id, naam FROM categorie WHERE ouder=$aid ORDER BY naam, id"); while(($bid, $bnaam) = $sth2->fetchrow_array()) { push(@subs, { ID => $bid, NAAM => $bnaam }); } $sth2->finish(); push(@p, { ID => $aid, NAAM => $anaam, SUB => \@subs }); } $tpl->param(CATS => \@p); $sth->finish(); } if(defined($termen) && $termen ne "") { my $sth; my $sth2; my $r; my $v = 0.0; my @tt; my $a; my $c; my $tabel; $tpl->param( GEZOCHT => 1 ); if(length($termen) <= 3) { $tpl->param(TEKORT => 1); goto EINDE; } my @subcat = param('subcategorie'); { my $cat = param('categorie'); my $freetext; if(defined($cat) && $cat != 0) { if(!defined(@subcat)) { push(@subcat, $cat); } } else { @subcat = (); } } $sth = extra::database_exec($dbh, "SELECT id, onderwerp, beschrijving, afzender, afzendertype, categorie, categorietekst FROM publicatie WHERE publiek=\'t\'"); while ($r = $sth->fetchrow_hashref()) { $v = 0.0; foreach my $x (@subcat) { foreach my $y (split(",", $r->{categorie})) { if($x == $y) { $v += 10.0; } } } foreach $a (split(' ', $termen)) { # Een term als losstaand woord in onderwerp if($c = ($r->{onderwerp} =~ s/(^|\W)$a(\W|$)/$&/gi)) { $v += 0.2 * length($a) * $c; } # Een term als onderdeel van woord in onderwerp if($c = ($r->{onderwerp} =~ s/$a/$&/gi)) { $v += 0.05 * length($a) * $c; } # Een term als losstaand woord in beschrijving if($c = ($r->{beschrijving} =~ s/(^|\W)$a(\W|$)/$&/gi)) { $v += 0.15 * length($a) * $c; } # Een term als onderdeel van woord in beschrijving if($c = ($r->{beschrijving} =~ s/$a/$&/gi)) { $v += 0.035 * length($a) * $c; } } $r->{MATCH} = sprintf("%.2f", $v); $r->{SESSID} = $sessie; if(defined($r->{afzendertype}) && defined($r->{afzender})) { my $asnoe; $asnoe = $r->{afzender}; $sth2 = extra::database_exec($dbh, "SELECT naam FROM gebruikers WHERE id=$asnoe"); ($r->{NAAM}) = $sth2->fetchrow_array(); $sth2->finish(); } else { $r->{NAAM} = ""; } if($v != 0.0 ) { push(@t, $r); } } $sth->finish(); } my @blub; my @blub2; @blub = sort { $a->{MATCH} <=> $b->{MATCH} } @t; if($#blub >= 100) { @blub2 = reverse splice(@blub, -100); $tpl->param( RESULTATEN => \@blub2, GEVONDEN => 1 ); } elsif($#blub >= 0) { @blub2 = reverse @blub; $tpl->param( RESULTATEN => \@blub2, GEVONDEN => 1 ); } else { $tpl->param( GEVONDEN => 0 ); } EINDE: $tpl->param( SESSID => $sessie, MODE => $mode, WIEID => $wie ); lijstjevancategorieen(); print $tpl->output; extra::exit_database($dbh);