#!/usr/bin/perl ############################################################################ # CineSearch - Kinoprogramm Version 5.x # # (c) 1998-2001 docu:media documedia@leipzig-info.net # ############################################################################ # Version History # 5.1 - Einbindung der Filmplakate in der Resultatsanzeige # gleichzeitig Optimierung des Codes durch Unterbindung einiger if-Abfragen # 5.0 - Komplett überarbeitete Version, ab jetzt mit MySQL-Support # Deutlich schneller, da neue Suchroutine mit SQL-Unterstützung # 4.0 - Suchverfahren vollständig überarbeitet und optimiert # jetzt deutlich schneller für Suche ohne Stichwort # 3.5 - Komplett umgestellt auf CSS, dadurch deutlich schnellere Ausgabe # Nun auch mit einer speziellen Seite zum Drucken # 3.2 - Jetzt mit Movie-Hitliste in Beta-Phase # 3.1 - Neu: Anzeige, in welchem Saal ein Film läuft # 3.0 - Suche jetzt auch mit Auswahl einer bestimmten Startzeit möglich # Farbige Darstellung dieser Zeiten, neue Fehlerausgabe falls Startzeit # nicht gefunden, bestehende Fehlerausgaben weitreichend überarbeitet # 2.1 - Anführungsstriche erlauben das Suchen nach Phrasen + word="phrase" # 2.0 - Farbige Markierung der gefundenen Begriffe # 1.9 - Neu: Link zur Suche für alle Filme inb gewähltem Kino # Neue Ausgabe mit Links wenn Film in jeweiligem Kino nicht läuft. # 1.8b - geringe Codeoptimierung, leichte Geschwindigkeitssteigerung # 1.8a - Verbesserte Ausgabe des Links für Suche in allen Filmen # Bugfix: URL-Kodierter Suchstring bei Suche in allen Filmen # Beachtet nun auch ob Suche nach ganzem Wort gewünscht # 1.8 - Sucht nun endlich mit UND-Verknüpfung, neue Funktion: Suche in allen # Filmen der DB, nicht nur den laufenden # 1.7a - Interne Änderung für mehr Sicherheit -> Referer-Check # 1.7 - Wechselndes Banner wird in der Resultpage angezeigt # 1.6a - Verbesserte Ausgabe nun auch bei "demnächst" und kleine kosmetische # Änderungen # 1.6 - Verbesserte Ausgabe der Tabellen (Farbe abwechselnd) # Einlesen vone filme.db und kinos.db optimiert # 1.5a - Bugfix in Tabellenüberschrift # 1.5 - verbesserte Ausgabe bei "demnächst" inkl. Anzeige des Starttermins # 1.4 - Sucht nun auch mehrere Begriffe (per UND verknüpft) # 1.3 - wählt automatisch beste Sortierung # 1.2 - Kinonamen per Zahl übergeben, ganzes Wort suchen, Links bei "Nicht gefunden" # 1.1 - formatierte Ausgabe, Listing nach Film oder Kino sortiert # 1.0 - erstes funktionierendes Release use DBI; use CGI; my $http=new CGI; # Variables $basedir = '/home/lin/htdocs'; #$basedir = 'e:/leipzig-info.net'; $baseurl = "/"; $kinodatenpath="$basedir/kino/kinodaten.txt"; $dbdir = '.'; $anzahl=0; $script="/cgi-bin/CineSearch.cgi"; $font="Verdana,Arial,Helvetica,sans-serif"; $ver="5.2"; # Flush Perl-Buffer, alle Prints werden direkt an Client geschickt $| = 1; # Header gleich am Anfang schicken um Timeout zu vermeiden print "Content-type: text/html\n\n"; @kino_sms_werbung=( "Was läuft gegen 20 Uhr im Cinestar? SMS \"leipzig cinestar 20\" an 72672", "Was läuft jetzt als nächstes im Cinestar? SMS \"leipzig cinestar\" an 72672", "Was läuft gegen 18 Uhr im Regina? SMS \"leipzig regina 18\" an 72672", "In welchem Leipziger Kino läuft heute gegen 20 Uhr Das Parfum? SMS \"leipzig parfum 20\" an 72672", "Wo läuft als nächstes Miami Vice? SMS \"leipzig miami\" an 72672"); @days_sort=qw(Do Fr Sa So Mo Di Mi); @wdays=qw(So Mo Di Mi Do Fr Sa); @filme_felder=qw(name erklaerung ot jahr von mit); %tage_id=( "Mo" => 8, "Di" => 9, "Mi" => 10, "Do" => 11, "Fr" => 12, "Sa" => 13, "So" => 14); %kinos_id=( "id" => 0, "name" => 1, "adresse" => 2, "telefon" => 3, "zusatz" => 4); %filme_id=( "id" => 0, "name" => 1, "erklaerung" => 2, "ot" => 3, "jahr" => 4, "min" => 5, "von" => 6, "mit" => 7, "fsk" => 8, "web" => 9); %filmecd_id=( "id" => 0, "film_id" => 1, "asin" => 2, "titel" => 3, "beschreibung" => 4, "imageurl" => 5); %votes_id=( "id" => 0, "film_id" => 1, "stimmen" => 2, "timestamp" => 3); $time=$http->param("time"); ########################################################################### # Parse Form Search Information $sterms=$http->param("sterms"); if ($sterms =~ /"([^"]*)"/) { $split_sterms[0] = $1; $split_sterms[0] =~ s/[\[\n\r \]\*]+/ /g; } elsif ($http->param("word") eq "phrase") { $split_sterms[0] = $sterms; $split_sterms[0] =~ s/"//g; $split_sterms[0] =~ s/[\[\n\r \]\*]+/ /g; } else { $sterms =~ tr/[\+\-]/ /; @split_sterms = split(/\s+/, $sterms); } $sterms =~ s/(\W)/sprintf("%%%x", ord($1))/eg; $sterms =~ s/%20/+/g; $qs=$ENV{'QUERY_STRING'}; $qs =~ s/(\W)/sprintf("%%%x", ord($1))/eg; $qs =~ s/%20/+/g; #if ($ENV{'HTTP_REFERER'}!~/leipzig-info\.net/i) { # open(LOG,">>./kinolog.txt") or die "Kann Datei nicht oeffnen!"; # print LOG localtime(time)." ".$ENV{'HTTP_REFERER'}."\n"; # close(LOG); #} $dbh = DBI->connect ("DBI:mysql:www22","www22","lzig33") || die "Verbindung zu SQL-Server fehlgeschlagen!"; if ($http->param("mode") eq "showmovie") { &showmovie; &vote_movie($http->param("movie")); } elsif ($http->param("mode") eq "showcinema") { &showcinema; } elsif ($http->param("mode") eq "showvotes") { &show_votes; } elsif ($http->param("mode") eq "allfilms" || lc($http->param("sterms")) eq "demnächst") { &search_allfilms; } else { &search_routine; } print ""; $query->finish; $dbh->disconnect; exit; ################################################################################## sub search_allfilms { my $SQL="SELECT * FROM filme"; my $WHERE; $WHERE=" WHERE"; $starter= "0"; if ($http->param("sterms") ne "") { for($i=0;$i<=$#split_sterms;$i++) { next if !$split_sterms[$i]; if ($starter eq "0") { $WHERE.=" ("; $starter= "1"; } else { $WHERE.=" AND ("; } foreach $feld (@filme_felder) { $WHERE.=" $feld LIKE '%$split_sterms[$i]%' OR"; } $WHERE =~ s/ OR$/)/; } } $SQL=$SQL.$WHERE." ORDER BY name"; $query=$dbh->prepare($SQL); $query->execute; $rowanz=$query->rows; open(KINODATEN,"<$kinodatenpath"); my $kinodaten=join("",); close(KINODATEN); $kinodaten =~ /(.*)
/; $kinodaten=$1; open(FRESULT,"<$basedir/kinoresult.html"); while ($temp=) { $temp =~ s/KINODATEN/$kinodaten/; if($temp !~ //) { print $temp; } else { print "
"; if ($rowanz<=0) { print "Es wurden keine passenden Filme in der Datenbank gefunden.

\n"; } else { if (lc($http->param("sterms")) eq "demnächst") { print "Folgende $rowanz Filme werden demnächst im Kino zu sehen sein:

\n"; } else { print "Die Suche ergab folgende $rowanz Filme in der Datenbank:

\n"; } print "\n"; while (@data=$query->fetchrow_array) { #print ""; print ""; if (lc($http->param("sterms")) eq "demnächst") { $data[2]=~/^Demnächst:\s*([\w\s\.äöü]*)([;<]*)/; print ""; } print ""; } print "
$data[1]
$data[1]$1

 

"; } } } } ################################################################################## sub search_routine { @datum=localtime(time); @kinos=$http->param("kino"); if ($http->param("tag") eq "heute") { $http->param(-name=>"tag",-value=>$wdays[$datum[6]]) } $sort=$http->param("sort"); if ($sort eq "titel" && $http->param("kino") ne "all" && $http->param("kino") ne "") { $sort="kino"; } my $SQL="SELECT kinos.id,kinos.name,filme.id,filme.name,round(fv.score/fv.count) as vote,zeiten.*"; my $FROM=" FROM ((zeiten LEFT JOIN filme ON zeiten.film_id=filme.id) LEFT JOIN kinos ON zeiten.kino_id=kinos.id) LEFT JOIN filme_votes as fv on filme.id=fv.film_id"; my $WHERE, $SQLCOUNT; $WHERE=" WHERE"; if ($http->param("sterms") ne "") { for($i=0;$i<=$#split_sterms;$i++) { next if !$split_sterms[$i]; $WHERE.=" ("; foreach $feld (@filme_felder) { $WHERE.=" filme.$feld LIKE '%$split_sterms[$i]%' OR"; } $WHERE =~ s/ OR$/) AND/; } } elsif ($http->param("id") ne "") { $WHERE.=" filme.id=".$http->param("id")." AND"; } if ($kinos[0] ne "" && $kinos[0] ne "all") { $WHERE.="("; foreach $kino (@kinos) { $WHERE.=" zeiten.kino_id='$kino' OR"; } $WHERE =~ s/OR$//; $WHERE.=") AND"; } if ($http->param("tag") ne "" && $http->param("tag") ne "all") { if ($http->param("time") ne "") { $WHERE.=" (zeiten.".$http->param("tag")." REGEXP '".$http->param("time").":[0-3].*' OR"; $WHERE.=" zeiten.".$http->param("tag")." REGEXP '".($http->param("time")-1).":[4-5].*') AND"; } else { $WHERE.=" zeiten.".$http->param("tag")." IS NOT NULL AND zeiten.".$http->param("tag")."<>'' AND"; } } if (($http->param("time") ne "" && $http->param("time") ne "all") && ($http->param("tag") eq "" || $http->param("tag") eq "all")) { foreach $tag (@tage) { $WHERE.=" (zeiten.$tag REGEXP '".$http->param("time").":[0-3].*' OR"; $WHERE.=" zeiten.$tag REGEXP '".($http->param("time")-1).":[4-5].*') OR"; } $WHERE =~ s/OR$/AND/; } $WHERE =~ s/AND$//; $WHERE="" if $WHERE eq " WHERE"; if ($sort eq "kino") { $SQL=$SQL.$FROM.$WHERE." ORDER BY kinos.name,filme.name"; $SQLCOUNT="SELECT kinos.id,count(filme.id)".$FROM.$WHERE." GROUP BY kinos.id ORDER BY kinos.name"; } else { $SQL=$SQL.$FROM.$WHERE." ORDER BY filme.name,kinos.name"; $SQLCOUNT="SELECT filme.id,count(kinos.id)".$FROM.$WHERE." GROUP BY filme.id ORDER BY filme.name"; } $query=$dbh->prepare($SQL); $query->execute; $gesamt_rowanz=$query->rows; if ($gesamt_rowanz>0) { $querycount=$dbh->prepare($SQLCOUNT); $querycount->execute; } open(KINODATEN,"<$kinodatenpath"); my $kinodaten=join("",); close(KINODATEN); $kinodaten =~ /(.*)
/; $kinodaten=$1; if ($http->param("template") eq "print") { $tfile="kinoresult-print.html"; $tprint=1; } else { $tfile="kinoresult.html"; $tprint=0; } open(FRESULT,"<$basedir/$tfile"); while ($temp=) { $temp =~ s/KINODATEN/$kinodaten/; if($temp !~ //) { print $temp; } else { print "
"; if ($gesamt_rowanz<=0) { print "Für den Suchbegriff ".$http->param("sterms")." wurden keine Übereinstimmungen im aktuellen Kinoprogramm gefunden!"; } else { if (!$tprint) { print "

"; print ""; print "Druck-Version | "; print "param("word")."&time=".$http->param("time")."&kino=".$http->param("kino")."&tag=".$http->param("tag")."&sort=titel\">" if $sort ne "titel"; print "Nach Filmen sortieren"; print "" if $sort ne "titel"; print " | "; print "param("word")."&time=".$http->param("time")."&kino=".$http->param("kino")."&tag=".$http->param("tag")."&sort=kino\">" if $sort ne "kino"; print "Nach Kinos sortieren"; print "" if $sort ne "kino"; print " | Kinoprogramm per SMS"; print "

"; print "
"; print "
"; print $kino_sms_werbung[int rand @kino_sms_werbung]; print " mehr..."; print "

"; } $width= 234+160+43+60; # 1 Tag $cols = 4; if ($http->param("tag") eq "all" || $http->param("tag") eq "") { $width= $width + (6*43); $cols+= 6; } print "\n\n"; if ($tprint) { $html_table=""; } else { $html_table="
\n"; } # Tabellenüberschrift ################################################################# if (($sort eq "titel") && ($http->param("kino") eq "all")) { if ($tprint) { $html_table.="\n"; } else { $html_table.="\n"; } $html_table.="\n"; $html_table.="\n"; } else { if ($tprint) { $html_table.="\n"; } else { $html_table.="\n"; } $html_table.="\n"; $html_table.="\n"; } foreach $key (@days_sort) { if (($http->param("tag") eq "all") || ($http->param("tag") eq $key)) { $html_table.="\n"; } } $html_table.="\n"; $html_table.="\n"; # Datenausgabe ################################################################# $linecount=0; $colorC1=1; $colorC2=2; while (@abfragecount=$querycount->fetchrow_array) { $rowspan=$abfragecount[1]; $tempLNr=$linecount+$abfragecount[1]; $rowanz=$rowspan; if (($colorC1 % 2)==0) { $color1=" class=\"Farbig\""; } else { $color1=""; } $colorC2=$colorC1++; $x=0; print $html_table; while(@data=$query->fetchrow_array) { if ($sterms ne "") { &vote_movie($data[2]) if $data[2]!=$oldvote; $oldvote=$data[2]; } $x++; print ""; if ($x==1) { if ($rowspan>1) { print ""; } else { print ""; } # Ausgabe der Bilder, nur wenn keine Druckversion if (!$tprint) { if (-e "../kino/gfx/$data[2].jpg" ) { $posterfile="\"$data[3]\""; } else { $posterfile="\"$data[3]\""; } } if ($sort eq "titel") { #print "$posterfile$data[3]"; print "$posterfile$data[3]"; if ($data[4]>0) { print "

"; } $anzmeinung=&DCount("filme_meinungen",$data[2]); if ($anzmeinung==1) { print " (1 Meinung)"; } elsif ($anzmeinung>1) { print " ($anzmeinung Meinungen)"; } print "\n"; } else { print "param("tag")."\">$data[1]
"; print "[Kino-Info]\n"; } } if (($colorC2++ % 2)==0) { $color2=" class=\"Farbig\""; $color3=" class=\"FarbigUnten\"";} else { $color2=""; $color3=" class=\"Unten\"";} print ""; if ($sort eq "titel") { print "param("tag")."\">$data[1]
"; print "[Kino-Info]\n"; } else { if (!$tprint) { if (-e "../kino/gfx/$data[2].jpg" ) { $posterfile="\"$data[3]\""; } else { $posterfile="\"$data[3]\""; } } #print "$posterfile$data[3]"; print "$posterfile$data[3]"; if ($data[4]>0) { print "

"; } $anzmeinung=&DCount("filme_meinungen",$data[2]); if ($anzmeinung==1) { print " (1 Meinung)"; } elsif ($anzmeinung>1) { print " ($anzmeinung Meinungen)"; } print "\n"; } foreach $key (@days_sort) { if (($http->param("tag") eq "all") || ($http->param("tag") eq $key)) { print ""; if ($data[$tage_id{$key}]) { $data[$tage_id{$key}] =~ s/ /
/g; $data[$tage_id{$key}] =~ s/($time:\d+)/$1<\/font>/g if ($time ne ""); print $data[$tage_id{$key}]; } else { print " "; } print "\n"; } } print ""; # $data[15] ? print $data[15] : print " "; if ($data[15]=~/\w+/) { print $data[15]; } else { print " "; } print ""; print "
"; $rowspan=0; last if ($x==$rowanz); } $linecount+=$rowanz; print "

Film

Kino

Kino

Film

$key

Info
"; } print ""; } if ($http->param("template") ne "print") { print "

Gesucht wurde nur in gerade laufenden Filmen.
"; if ($http->param("sterms") ne "") { print "param("word")."\">"; print "Nach ".$http->param("sterms")." in allen Filmen in der Datenbank suchen!"; print ""; } print "

"; if ($gesamt_rowanz>0) { print "

"; print "Diese Seite in einer Version zum Drucken zeigen!"; } } print "

"; } } close(FRESULT); } sub showcinema { $SQL="SELECT * FROM kinos WHERE ID=".$http->param("cinema"); $query=$dbh->prepare($SQL); $query->execute; if ($query->rows>0) { @abfrage=$query->fetchrow_array; open(RESULTFILE,"<$basedir/kinodetailsresult.html"); while() { $_ =~ s/\$NAME/$abfrage[$kinos_id{"name"}]/; $_ =~ s/\$ADR/$abfrage[$kinos_id{"adresse"}]/; $_ =~ s/\$TEL/$abfrage[$kinos_id{"telefon"}]/; $_ =~ s/\$ZUSATZ/$abfrage[$kinos_id{"zusatz"}]/; print $_; } close(RESULTFILE); } } sub vote_movie { my $movie=$_[0]; my $SQL="UPDATE votes SET stimmen=stimmen+1 WHERE film_id=$movie"; my $query=$dbh->prepare($SQL); $query->execute; if ($query->rows<=0) { $SQL="INSERT INTO votes (film_id,stimmen) values($movie,1)"; $query=$dbh->prepare($SQL); $query->execute; } } sub show_votes { $SQL="SELECT timestamp FROM votes WHERE to_days(now())-to_days(timestamp)>7 AND film_id=999999"; $query=$dbh->prepare($SQL); $query->execute; if ($query->rows>0) { $SQL="SELECT id,stimmen/2,film_id FROM votes"; $query=$dbh->prepare($SQL); $query->execute; while (@abfrage=$query->fetchrow_array) { if (&DLookUp("id","votes_forever","film_id=$abfrage[0]")>0) { $query2=$dbh->prepare("UPDATE votes_forever SET stimmen=stimmen+$abfrage[1] WHERE film_id=$abfrage[2]"); $query2->execute; } else { $query2=$dbh->prepare("INSERT INTO votes_forever (film_id,stimmen) VALUES($abfrage[2],1)"); $query2->execute; } } $SQL="UPDATE votes SET stimmen=stimmen/2, timestamp=now()"; $query=$dbh->prepare($SQL); $query->execute; $SQL="DELETE FROM votes WHERE film_id<>999999 AND stimmen<=0"; $query=$dbh->prepare($SQL); $query->execute; } my $SQL="SELECT sum(stimmen),max(stimmen) FROM votes WHERE film_id<>999999"; my $query=$dbh->prepare($SQL); $query->execute; @abfrage=$query->fetchrow_array; $sum=$abfrage[0]; $max=$abfrage[1]; $SQL="SELECT votes.*,round(votes.stimmen*100/$sum,1),filme.name,round(fv.score/fv.count),round(votes.stimmen*100/$max,1) as vote FROM (votes LEFT JOIN filme On votes.film_id=filme.id) LEFT JOIN filme_votes as fv on filme.id=fv.film_id WHERE votes.film_id<>999999 ORDER BY votes.stimmen DESC"; $counter=0; open(FRESULT,"<$basedir/kino-top-20.html"); while ($temp=) { if($temp =~ //) { $query=$dbh->prepare($SQL); $query->execute; while(@abfrage=$query->fetchrow_array) { last if $counter++==20; print "$counter"; #print "$abfrage[5] "; print "$abfrage[5] "; if ($abfrage[6]>0) { print ""; } $anzmeinung=&DCount("filme_meinungen",$abfrage[$votes_id{'film_id'}]); if ($anzmeinung==1) { print " (1 Meinung)"; } elsif ($anzmeinung>1) { print " ($anzmeinung Meinungen)"; } print ""; print "[Wann & Wo]"; print "$abfrage[$votes_id{'stimmen'}]"; print " ($abfrage[4])"; } } else { $temp =~ s/\$sum/$sum/; print $temp; } } } sub DLookUp { local($SQL,$query,$field,$table,$where,$anz); $field=$_[0]; $table=$_[1]; $where=$_[2]; $SQL="SELECT $field FROM $table WHERE $where"; $query=$dbh->prepare($SQL); $query->execute; $anz=$query->rows; $query->finish; return $anz; } sub HTMLLink { local($value); $value=$_[0]; $value =~ s/ä/ae/gi; $value =~ s/ö/oe/gi; $value =~ s/ü/ue/gi; $value =~ s/ß/ss/gi; $value =~ s/\'//g; $value =~ s/ - /-/g; $value =~ s/[^a-z0-9\-]+/_/gi; return lc($value); } sub DCount { local($SQL,$query,$table,$where,@abfrage); $table=$_[0]; $where=$_[1]; $SQL="SELECT count(id) FROM $table WHERE film_id=$where"; $query=$dbh->prepare($SQL); $query->execute; @abfrage=$query->fetchrow_array; return $abfrage[0]; }