Leitgedanken/lue_suche.php
2022-11-21 09:47:28 +01:00

377 lines
13 KiB
PHP

<?php
/*
# Fuer debugging
error_reporting(E_ALL);
ini_set('display_errors', 1);
#echo __LINE__."<br>";
*/
setlocale (LC_ALL, 'de_DE@euro', '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,'e_suche','RE')){require("lib/rechte.php");exit;}
// Rechteüberprüfung ende
if(isset($_GET['action'])){
$action = $_GET['action'];
}else{
$action = '';
}
if($action == ''){
$query1 = "SELECT lueaid, bezeichnung FROM lue_art WHERE bezeichnung != '' ORDER BY bezeichnung ASC";
$result1 = $db->query($query1);
while ($row = $result1->fetch_array()) {
$value[] = $row;
}
// Assign this array to smarty...
$smarty->assign('table_data', $value);
}
if($action == 'suche'){
$thema = strtoupper($_POST['thema']);
$einleitung = strtoupper($_POST['einleitung']);
$inhalt = trim(strtoupper($_POST['inhalt']));
$extrakt = strtoupper($_POST['extrakt']);
$art = $_POST['art'];
$lueart = $_POST['lueart'];
//Select zusammenbauen
if($art == 'exact' AND $thema != ''){ // 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 $einleitung != ''){
$trenner3 = 'REGEXP ';
$start3 = '[[:<:]]';
$ende3 = '[[:>:]]';
}else{
$trenner3 = 'LIKE ';
$start3 = '%';
$ende3 = '%';
}
if($art == 'exact' AND $inhalt != ''){
$trenner4 = 'REGEXP ';
$start4 = '[[:<:]]';
$ende4 = '[[:>:]]';
}else{
$trenner4 = 'LIKE ';
$start4 = '%';
$ende4 = '%';
}
if($art == 'exact' AND $extrakt != ''){
$trenner5 = 'REGEXP ';
$start5 = '[[:<:]]';
$ende5 = '[[:>:]]';
}else{
$trenner5 = 'LIKE ';
$start5 = '%';
$ende5 = '%';
}
$sql1 = "SELECT count(*) as anz_treffer
FROM lue_quelle
WHERE lueaid like '$lueart'
AND ";
######################################################################################################
## SQL ZUSAMMENBAUEN FÜR DAS THEMA
######################################################################################################
$thema = preg_replace('/\s{2,}/sm',' ',$thema,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", $thema, $Themen);
# 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($thema != ""){
$sql .= " ("; //Kein AND vor der Klammer notwendig, da direkt nach where, bei anderen muss AND davor stehen
for($i=0; $i < count($Themen[0]); $i++)
{
#In der Überschrift kommen Umlaute vor, daher keine Ersetzung der Umlaute
#$thema = str_replace (array("\\", "ä", "ö", "ü", "ß", "Ä", "Ö", "Ü"), array("", "&AUML;", "&OUML;", "&UUML;", "&SZLIG;", "&AUML;", "&OUML;", "&UUML;"), $Themen[0][$i]);
$them = str_replace (array("+", "-", "\"", "\\"), array("", "", "", ""), $Themen[0][$i]);
if($i == 0){
$oper = "";
}else{
$oper = "AND";
}
if(strpos($Themen[0][$i],"+") === 0){
$sql .= "UPPER(thema) $trenner1 '$start1".$them."$ende1' ";
} elseif(strpos($Themen[0][$i],"-") === 0){
$sql .= "$oper UPPER(thema) NOT $trenner1 '$start1".$them."$ende1' ";
} elseif($Themen[0][$i] == ""){
NULL;
}else{
$sql .= "$oper UPPER(thema) $trenner1 '$start1".$them."$ende1' ";
}
}
$sql .= ")";
}else{
$sql .= " UPPER(thema) 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 DAS THEMA ENDE
######################################################################################################
######################################################################################################
## SQL ZUSAMMENBAUEN FÜR DIE EINLEITUNG
######################################################################################################
$einleitung = preg_replace('/\s{2,}/sm',' ',$einleitung,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", $einleitung, $Einleitungen);
if($einleitung != ""){
$sql .= "AND (";
for($i=0; $i < count($Einleitungen[0]); $i++)
{
$einleitung = str_replace (array("\\", "ä", "ö", "ü", "ß", "Ä", "Ö", "Ü"), array("", "&AUML;", "&OUML;", "&UUML;", "&SZLIG;", "&AUML;", "&OUML;", "&UUML;"), $Einleitungen[0][$i]);
$sucheinleitung = str_replace (array("+", "-", "\"", "\\"), array("", "", "", ""), $einleitung);
if($i == 0){
$oper = "";
}else{
$oper = "AND";
}
if(strpos($Einleitungen[0][$i],"+") === 0){
$sql .= "UPPER(einleitung) $trenner3 '$start3".$sucheinleitung."$ende3' ";
} elseif(strpos($Einleitungen[0][$i],"-") === 0){
$sql .= "$oper UPPER(einleitung) NOT $trenner3 '$start3".$sucheinleitung."$ende3' ";
} elseif($Einleitungen[0][$i] == ""){
NULL;
}else{
$sql .= "$oper UPPER(einleitung) $trenner3 '$start3".$sucheinleitung."$ende3' ";
}
}
$sql .= ")";
}
######################################################################################################
## SQL ZUSAMMENBAUEN FÜR DIE EINLEITUNG 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, $Inhalte);
if($inhalt != ""){
$sql .= "AND (";
for($i=0; $i < count($Inhalte[0]); $i++)
{
$inhalt = str_replace (array("\\", "ä", "ö", "ü", "ß", "Ä", "Ö", "Ü"), array("", "&AUML;", "&OUML;", "&UUML;", "&SZLIG;", "&AUML;", "&OUML;", "&UUML;"), $Inhalte[0][$i]);
$suchwort = str_replace (array("+", "-", "\"", "\\"), array("", "", "", ""), $inhalt);
if($i == 0){
$oper = "";
}else{
$oper = "AND";
}
if(strpos($Inhalte[0][$i],"+") === 0){
$sql .= "UPPER(ausfuehrung) $trenner4 '$start4".$suchwort."$ende4' ";
} elseif(strpos($Inhalte[0][$i],"-") === 0){
$sql .= "$oper UPPER(ausfuehrung) NOT $trenner4 '$start4".$suchwort."$ende4' ";
} elseif($Inhalte[0][$i] == ""){
NULL;
}else{
$sql .= "$oper UPPER(ausfuehrung) $trenner4 '$start4".$suchwort."$ende4' ";
}
}
$sql .= ")";
}
######################################################################################################
## SQL ZUSAMMENBAUEN FÜR DEN INHALT ENDE
######################################################################################################
######################################################################################################
## SQL ZUSAMMENBAUEN FÜR DEN EXTRAKT
######################################################################################################
$extrakt = preg_replace('/\s{2,}/sm',' ',$extrakt,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", $extrakt, $Extrakte);
if($extrakt != ""){
$sql .= "AND (";
for($i=0; $i < count($Extrakte[0]); $i++)
{
$extrakt = str_replace (array("\\", "ä", "ö", "ü", "ß", "Ä", "Ö", "Ü"), array("", "&AUML;", "&OUML;", "&UUML;", "&SZLIG;", "&AUML;", "&OUML;", "&UUML;"), $Extrakte[0][$i]);
$suchextrakt = str_replace (array("+", "-", "\"", "\\"), array("", "", "", ""), $extrakt);
if($i == 0){
$oper = "";
}else{
$oper = "AND";
}
if(strpos($Extrakte[0][$i],"+") === 0){
$sql .= "UPPER(extrakt) $trenner4 '$start5".$suchextrakt."$ende5' ";
} elseif(strpos($Extrakte[0][$i],"-") === 0){
$sql .= "$oper UPPER(extrakt) NOT $trenner5 '$start4".$suchextrakt."$ende5' ";
} elseif($Extrakte[0][$i] == ""){
NULL;
}else{
$sql .= "$oper UPPER(extrakt) $trenner5 '$start5".$suchextrakt."$ende5' ";
}
}
$sql .= ")";
}
######################################################################################################
## SQL ZUSAMMENBAUEN FÜR DEN INHALT ENDE
######################################################################################################
######################################################################################################
## GESAMTSELECT - SQL ZUSAMMENBAUEN
######################################################################################################
$query = $sql1.$sql;
#echo $query;
#exit;
$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('lue_suche_nomatch', "1");
}else{
$smarty->assign('lue_suche_match', "1");
$smarty->assign('anzahltreffer', "$res[anz_treffer]");
$db = dbconnect();
$sql1 = "SELECT eid, thema, einleitung, ausfuehrung, extrakt, bezeichnung
FROM lue_quelle a, lue_art b
WHERE a.lueaid = b.lueaid
AND b.lueaid like '$lueart'
AND ";
$sql2 = " ORDER BY eid desc";
$query = $sql1.$sql.$sql2;
#echo $query;
#exit;
$result = $db->query($query)
or die ("Cannot execute query");
while ($row = $result->fetch_array()){
if($inhalt == ''){
##$preview = substr(strip_tags($row[inhalt]),0,200)." <b>...</b> ";
$preview = kurzer_text(strip_tags($row['ausfuehrung']),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['ausfuehrung']),200);
}
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['preview'] = $preview;
$value[] = $row;
}
// Assign this array to smarty...
$smarty->assign('table_data', $value);
} // Ende if Treffer gefunden
} // Ende Action=suche
$smarty->assign('action', "$action");
$smarty->display("$template/$templatename");
?>