Leitgedanken/suche.php_20170928
2022-11-21 09:47:28 +01:00

511 lines
16 KiB
Plaintext

<?php
/*
# Fuer debugging
error_reporting(E_ALL);
ini_set('display_errors', 1);
#echo __LINE__."<br>";
*/
#error_reporting(E_ALL);
#ini_set('display_errors', 1);
setlocale (LC_ALL, 'de_DE@UTF8', 'de_DE', 'de', 'ge');
include_once 'classes/lg-on_Smarty.class.php';
$smarty = new lgon_Smarty();
require_once("config.inc.php");
require_once("func_rollenrechte.php");
$templatename = substr(basename($_SERVER['PHP_SELF']),0,-3)."html";
require_once "language/german.inc.php";
#require("func_highlight.php");
// Rechteüberprüfung
$db = dbconnect();
if ($user_admin == ""){ require("index.php"); exit;} //Wenn man nicht angemeldet ist, darf man nicht auf die Seite
if(!rore($user_admin,'a_suche','RE')){require("lib/rechte.php");exit;}
// Rechteüberprüfung ende
if(isset($_GET['action'])){
$action = $_GET['action'];
}else{
$action = '';
}
if($action == ''){
$db = dbconnect();
$query1 = "SELECT distinct tid, bezeichnung FROM thema WHERE bezeichnung != '' ORDER BY tid DESC";
$result1 = $db->query( $query1);
while ($row = $result1->fetch_array()){
$value[] = $row;
}
// Assign this array to smarty...
$smarty->assign('table_data', $value);
$query = "SELECT kid, bezeichnung FROM kategorie ORDER BY bezeichnung ASC";
$result = $db->query( $query);
while ($row = $result->fetch_array()){
$value1[] = $row;
}
$smarty->assign('table_data1', $value1);
}
if($action == 'suche'){
if(isset($_POST['thema'])){
$thema = mb_strtoupper($_POST['thema']);
}else{
$thema = "";
}
if(isset($_POST['ueberschrift'])){
$ueberschrift = mb_strtoupper($_POST['ueberschrift']);
}else{
$ueberschrift = "";
}
if(isset($_POST['textstelle'])){
$textstelle = mb_strtoupper($_POST['textstelle']);
}else{
$textstelle = "";
}
if(isset($_POST['textwort'])){
$textwort = mb_strtoupper($_POST['textwort']);
}else{
$textwort = "";
}
if(isset($_POST['inhalt'])){
$inhalt = mb_strtoupper($_POST['inhalt']);
}else{
$inhalt = "";
}
if(isset($_POST['jahr'])){
$jahr = mb_strtoupper($_POST['jahr']);
}else{
$jahr = "";
}
if(isset($_POST['monat'])){
$monat = mb_strtoupper($_POST['monat']);
}else{
$monat = "";
}
if(isset($_POST['tag'])){
$tag = mb_strtoupper($_POST['tag']);
}else{
$tag = "";
}
if(isset($_POST['stapgd'])){
$stapgd = mb_strtoupper($_POST['stapgd']);
}else{
$stapgd = "";
}
if(isset($_POST['dhtmlgoodies_country'])){
$kid = mb_strtoupper($_POST['dhtmlgoodies_country']);
}else{
$kid = "";
}
if(isset($_POST['dhtmlgoodies_city'])){
$ukid = mb_strtoupper($_POST['dhtmlgoodies_city']);
}else{
$ukid = "";
}
if(isset($_POST['art'])){
$art = $_POST['art'];
}else{
$art = "";
}
setcookie("ck_ukid",$ukid);
if ($jahr == "JJJJ"){$jahr = '';}
if ($monat == "MM"){$monat = '';}
if ($tag == "TT"){$tag = '';}
if ($kid == ''){$kid = '%';}
if ($thema == ''){$thema = '%';}
if ($ukid == ''){$ukid = '%';}
//Select zusammenbauen
if($art == 'exact' AND $ueberschrift != ''){ // wenn leer, darf kein regexp kommen, sonst würde er nichts finden
$trenner1 = 'REGEXP ';
$start1 = '[[:<:]]';
$ende1 = '[[:>:]]';
}else{
$trenner1 = 'LIKE ';
$start1 = '%';
$ende1 = '%';
}
if($art == 'exact' AND $textstelle != ''){
$trenner2 = 'REGEXP ';
$start2 = '';
$ende2 = '';
}else{
$trenner2 = 'LIKE ';
$start2 = '';
$ende2 = '';
}
if($art == 'exact' AND $textwort != ''){
$trenner3 = 'REGEXP ';
$start3 = '[[:<:]]';
$ende3 = '[[:>:]]';
}else{
$trenner3 = 'LIKE ';
$start3 = '%';
$ende3 = '%';
}
if($art == 'exact' AND $inhalt != ''){
$trenner4 = 'REGEXP ';
$start4 = '[[:<:]]';
$ende4 = '[[:>:]]';
}else{
$trenner4 = 'LIKE ';
$start4 = '%';
$ende4 = '%';
}
$sql1 = "SELECT count(*) as anz_treffer
FROM quelle
WHERE ";
######################################################################################################
## SQL ZUSAMMENBAUEN FÜR DIE ÜBERSCHRIFT
######################################################################################################
$ueberschrift = preg_replace('/\s{2,}/sm',' ',$ueberschrift,PREG_SET_ORDER); //Mehr als zwei leerzeichen entfernen
preg_match_all("/(\-{0,1}\+{0,1}\*{0,1}%{0,1}\"([^\"]+)\"\*{0,1}%{0,1}\+{0,1}\-{0,1}|\-{0,1}\+{0,1}\*{0,1}%{0,1}(\w+)\*{0,1}%{0,1}\+{0,1}\-{0,1})/u", $ueberschrift, $Ueberschriften);
# Erklärung: \-{0,1} --> 0 oder 1 Minuszeichen kann string enthalten
# \+{0,1} --> 0 oder 1 Pluszeichen kann string enthalten
# \*{0,1} --> 0 oder 1 Asterisk kann string enthalten
# %{0,1} --> 0 oder 1 Prozentzeichen kann string enthalten, muss nicht durch \ escaped werden
# Vorderer Teil bis | überprüft ob "" eingegeben wurden und splittet innerhalb der "" nicht. Hinterer Teil wenn Wörter ohne "" eingegeben wurde
$sql = "";
if($ueberschrift != ""){
$sql .= " ("; //Kein AND vor der Klammer notwendig, da direkt nach where, bei anderen muss AND davor stehen
for($i=0; $i < count($Ueberschriften[0]); $i++)
{
#In der Überschrift kommen Umlaute vor, daher keine Ersetzung der Umlaute
#$ueberschrift = str_replace (array("\\", "ä", "ö", "ü", "ß", "Ä", "Ö", "Ü"), array("", "&AUML;", "&OUML;", "&UUML;", "&SZLIG;", "&AUML;", "&OUML;", "&UUML;"), $Ueberschriften[0][$i]);
$ueber = str_replace (array("+", "-", "\"", "\\"), array("", "", "", ""), $Ueberschriften[0][$i]);
if($i == 0){
$oper = "";
}else{
$oper = "AND";
}
if(strpos($Ueberschriften[0][$i],"+") === 0){
$sql .= "UPPER(ueberschrift) $trenner1 '$start1".$ueber."$ende1' ";
} elseif(strpos($Ueberschriften[0][$i],"-") === 0){
$sql .= "$oper UPPER(ueberschrift) NOT $trenner1 '$start1".$ueber."$ende1' ";
} elseif($Ueberschriften[0][$i] == ""){
NULL;
}else{
$sql .= "$oper UPPER(ueberschrift) $trenner1 '$start1".$ueber."$ende1' ";
}
}
$sql .= ")";
}else{
$sql .= " UPPER(ueberschrift) LIKE '%' "; //Wenn nichts eingegeben, dann soll alles angzeigt werden. Das braucht man hier weil zusammengesetzter string sonst WHERE AND TEXTSTELLE = .... heißen könnte
}
######################################################################################################
## SQL ZUSAMMENBAUEN FÜR DIE ÜBERSCHRIFT ENDE
######################################################################################################
######################################################################################################
## SQL ZUSAMMENBAUEN FÜR DIE TEXTSTELLE
######################################################################################################
if($textstelle == ''){
$sql .= " AND (";
$sql .= " UPPER(textstelle) like '%' ";
$sql .= " ) ";
}else{
$sql .= " AND (";
$sql .= " UPPER(textstelle) like '$textstelle' ";
$sql .= " ) ";
}
######################################################################################################
## SQL ZUSAMMENBAUEN FÜR DIE TEXTSTELLE ENDE
######################################################################################################
######################################################################################################
## SQL ZUSAMMENBAUEN FÜR DAS TEXTWORT
######################################################################################################
$textwort = preg_replace('/\s{2,}/sm',' ',$textwort,PREG_SET_ORDER); //Mehr als zwei leerzeichen entfernen
preg_match_all("/(\-{0,1}\+{0,1}\*{0,1}%{0,1}\"([^\"]+)\"\*{0,1}%{0,1}\+{0,1}\-{0,1}|\-{0,1}\+{0,1}\*{0,1}%{0,1}(\w+)\*{0,1}%{0,1}\+{0,1}\-{0,1})/u", $textwort, $Textworte);
if($textwort != ""){
$sql .= "AND (";
for($i=0; $i < count($Textworte[0]); $i++)
{
$textwort = str_replace (array("\\", "ä", "ö", "ü", "ß", "Ä", "Ö", "Ü"), array("", "&AUML;", "&OUML;", "&UUML;", "&SZLIG;", "&AUML;", "&OUML;", "&UUML;"), $Textworte[0][$i]);
$suchtextwort = str_replace (array("+", "-", "\"", "\\"), array("", "", "", ""), $textwort);
if($i == 0){
$oper = "";
}else{
$oper = "AND";
}
if(strpos($Textworte[0][$i],"+") === 0){
$sql .= "UPPER(textwort) $trenner3 '$start3".$suchtextwort."$ende3' ";
} elseif(strpos($Textworte[0][$i],"-") === 0){
$sql .= "$oper UPPER(textwort) NOT $trenner3 '$start3".$suchtextwort."$ende3' ";
} elseif($Textworte[0][$i] == ""){
NULL;
}else{
$sql .= "$oper UPPER(textwort) $trenner3 '$start3".$suchtextwort."$ende3' ";
}
}
$sql .= ")";
}
######################################################################################################
## SQL ZUSAMMENBAUEN FÜR DAS TEXTWORT ENDE
######################################################################################################
######################################################################################################
## SQL ZUSAMMENBAUEN FÜR DEN INHALT
######################################################################################################
$inhalt = preg_replace('/\s{2,}/sm',' ',$inhalt,PREG_SET_ORDER); //Mehr als zwei leerzeichen entfernen
preg_match_all("/(\-{0,1}\+{0,1}\*{0,1}%{0,1}\"([^\"]+)\"\*{0,1}%{0,1}\+{0,1}\-{0,1}|\-{0,1}\+{0,1}\*{0,1}%{0,1}(\w+)\*{0,1}%{0,1}\+{0,1}\-{0,1})/u", $inhalt, $Worte);
if($inhalt != ""){
$sql .= "AND (";
for($i=0; $i < count($Worte[0]); $i++)
{
$inhalt = str_replace (array("\\", "ä", "ö", "ü", "ß", "Ä", "Ö", "Ü"), array("", "&AUML;", "&OUML;", "&UUML;", "&SZLIG;", "&AUML;", "&OUML;", "&UUML;"), $Worte[0][$i]);
$suchwort = str_replace (array("+", "-", "\"", "\\"), array("", "", "", ""), $inhalt);
if($i == 0){
$oper = "";
}else{
$oper = "AND";
}
if(strpos($Worte[0][$i],"+") === 0){
$sql .= "UPPER(inhalt) $trenner4 '$start4".$suchwort."$ende4' ";
} elseif(strpos($Worte[0][$i],"-") === 0){
$sql .= "$oper UPPER(inhalt) NOT $trenner4 '$start4".$suchwort."$ende4' ";
} elseif($Worte[0][$i] == ""){
NULL;
}else{
$sql .= "$oper UPPER(inhalt) $trenner4 '$start4".$suchwort."$ende4' ";
}
}
$sql .= ")";
}
######################################################################################################
## SQL ZUSAMMENBAUEN FÜR DEN INHALT ENDE
######################################################################################################
######################################################################################################
## SQL ZUSAMMENBAUEN FÜR DIE RESTLICHEN FELDER
######################################################################################################
#ukid-Feld ist einziges Feld mit NULL=ja, da es nicht immer Unterkategorie gibt und mit leerem Feld
#hätte das Ergebniss nicht gestimmt
#also muss man auch "or ukid is NULL" abfragen
$sql .= "AND ( UPPER(datum) LIKE '%$jahr%-%$monat%-%$tag%')
AND ( UPPER(stapgd) LIKE '%$stapgd%')
AND ( UPPER(kid) LIKE '$kid')
AND ( UPPER(thema) LIKE '$thema')
AND ( UPPER(ukid) LIKE '$ukid'";
if ($ukid == "%"){
$sql .= " OR ukid IS NULL ";
}
$sql .= " )";
######################################################################################################
## SQL ZUSAMMENBAUEN FÜR DIE RESTLICHEN FELDER ENDE
######################################################################################################
######################################################################################################
## GESAMTSELECT - SQL ZUSAMMENBAUEN
######################################################################################################
$query = $sql1.$sql;
$result = $db->query( $query );
$res = $result->fetch_array()
or die ("Cannot execute query");
function kurzer_text($string,$laenge){
$origin=strlen($string);
$stri_arr=explode(" ",$string);
$anzzahl=count($stri_arr);
$gekuerzt=0;
$string="";
while($gekuerzt<$anzzahl){
$string_alt=$string;
$string=$string." ".$stri_arr[$gekuerzt];
$gekuerzt++;
if(strlen($string)>$laenge){
$gekuerzt=$anzzahl;
$string=$string_alt;
}
}
if($laenge<$origin){
$string=$string."<nobr>&nbsp;<b>...</b></nobr>";
}
return $string;
}
if($res['anz_treffer'] == '' or $res['anz_treffer'] == 0){
$smarty->assign('suche_nomatch', "1");
$smarty->assign('suche_match', "0");
}else{
$smarty->assign('suche_match', "1");
$smarty->assign('suche_nomatch', "0");
$smarty->assign('anzahltreffer', "$res[anz_treffer]");
$db = dbconnect();
$sql1 = "SELECT lid, ueberschrift, textstelle, inhalt, textwort, stapgd, kid, ukid, DATE_Format(datum, '%d') tag, DATE_Format(datum, '%m') monat, DATE_Format(datum, '%Y') jahr, DATE_Format(datum, '%Y%m%d') date_sort
FROM quelle
WHERE ";
$sql2 = " ORDER BY date_sort desc";
$query = $sql1.$sql.$sql2;
$result = $db->query( $query)
or die ("Cannot execute query");
$ln_zaehler = 0;
while ($row = $result->fetch_array()){
if($inhalt == ''){
##$preview = substr(strip_tags($row[inhalt]),0,200)." <b>...</b> ";
$preview = kurzer_text(strip_tags($row['inhalt']),200);
}else{
#$preview = preview(strip_tags($row[inhalt]),trim($_POST[inhalt]));
##$preview = substr(strip_tags($row[inhalt]),0,200)." <b>...</b> ";
$preview = kurzer_text(strip_tags($row['inhalt']),200);
}
$wochentag = date("l", mktime(0,0,0,$row['monat'],$row['tag'],$row['jahr']));
switch($wochentag)
{
case 'Sunday':
$wochentag = "So.";
break;
case 'Monday':
$wochentag = "Mo.";
break;
case 'Tuesday':
$wochentag = "Di.";
break;
case 'Wednesday':
$wochentag = "Mi.";
break;
case 'Thursday':
$wochentag = "Do.";
break;
case 'Friday':
$wochentag = "Fr.";
break;
case 'Saturday':
$wochentag = "Sa.";
break;
}
$result1 = $db->query( "SELECT bezeichnung FROM kategorie WHERE kid='$row[kid]'" );
$row1 = $result1->fetch_array();
$result2 = $db->query( "SELECT bezeichnung FROM unterkategorie WHERE ukid='$row[ukid]'" );
$row2 = $result2->fetch_array();
$result3 = $db->query( "SELECT count(*) Anz
FROM notizen
WHERE lid='$row[lid]'
AND user='$user_admin'" );
$row3 = $result3->fetch_array();
$ln_zaehler = $ln_zaehler + 1;
if($art == 'exact'){ // Übergabe für Highligthing. Wenn exact, dann darf bei Begriff nicht Gottesdienst hervorgehoben werden
$suchart = 0;
}else{
$suchart = 1;
}
$inhalt_hig = urlencode(serialize($_POST['inhalt']));
$row['suchart'] = $suchart;
$row['inhalt_hig'] = $inhalt_hig;
$row['kategorie'] = $row1['bezeichnung'];
$row['unterkategorie'] = $row2['bezeichnung'];
$row['preview'] = $preview;
$row['wochentag'] = $wochentag;
$row['notizen'] = $row3['Anz'];
$value[] = $row;
}
$smarty->assign('table_data3', $value);
}
} // Ende $action = suche
$smarty->assign('action', "$action");
$smarty->display("$template/$templatename");
?>