incs/saveNchange.php neu geschrieben: Adressen, Telefonnummern, Kontakte, Notizen und Konten laufen ueber db_abfrage() mit Platzhaltern, mehrschrittiges Speichern in einer Transaktion. Weil sich die Speicherfunktionen gegenseitig aufrufen, klammern beginneSpeichern()/beendeSpeichern() die Verschachtelung; incs/rechnung.php nutzt sie ebenfalls. Kunden- und Lieferantenseiten waren zwei fast gleiche Kopien und teilen sich jetzt partnerAddSeite(), partnerChangeSeite() und partnerShowDaten(). Dabei behoben: - SQL-Injektion ueber die Suchbegriffe der Kunden-, Lieferanten-, Adress-, Kommissions- und Projektsuche sowie ueber die Artikel-Autovervollstaendigung - gespeichertes XSS: Notizen (nl2br escapt nicht), Bankname, Dokumenttyp, Namen und Adressen in allen Trefferlisten - sites/liefershow.php war unter PHP 8 ein Fatal ($kdnres.id) - "Telefonnummer loeschen" im Kundenbereich lief in einen Fatal, die Nummern einer geloeschten Adresse blieben stehen (Spalte hiess adress_id statt adresse_id, mysql_fetch_assoc gibt es nicht mehr) - Geburtstag ohne Jahr wurde im Formular verschluckt, die IBAN kam beim Bearbeiten aus $_GET statt aus dem Konto - die Versionskette eines Kunden brach nach einem Schritt ab - Kommissionsadressen speicherten die Ortsangabe der Adresse statt der des Telefonformulars und einen Adresstyp als Telefontyp - Blaettern in den Trefferlisten: ohne ORDER BY konnte dieselbe Zeile zweimal oder gar nicht erscheinen; ajax_searchadress() bekam die Seite nicht - Hauptadresse laesst sich nicht mehr loeschen, Kundendaten nicht mehr ueber die Lieferantenseite (und umgekehrt) - ajax/auto/* baute JSON von Hand zusammen, ein Anfuehrungszeichen im Ort machte die Liste unbrauchbar Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
562 lines
19 KiB
PHP
562 lines
19 KiB
PHP
<?php
|
|
|
|
/*
|
|
* Die Suchbedingung der Kunden-, Lieferanten- und Adresssuche. $fields
|
|
* waehlt aus, worin gesucht wird, $src sind die einzelnen Suchbegriffe.
|
|
* Die Werte kommen als Platzhalter dazu, die Spaltennamen stehen fest.
|
|
*/
|
|
function partnerSuchbedingung($src, $combiner, $fields, &$params)
|
|
{
|
|
$spalten = array(
|
|
"all" => array("vname", "nname", "vname2", "nname2", "firma", "ort", "str", "plz", "partner.id"),
|
|
"kdnr" => array("partner.id"),
|
|
"name" => array("vname", "nname", "vname2", "nname2", "firma"),
|
|
"str" => array("str"),
|
|
"plz" => array("plz"),
|
|
"ort" => array("ort"),
|
|
"tel" => array("tel.nr"),
|
|
"kont" => array("kontakt"),
|
|
);
|
|
if(!isset($spalten[$fields]))
|
|
return "";
|
|
$combiner = $combiner == "OR" ? "OR" : "AND";
|
|
$bedingung = "";
|
|
foreach($src AS $tag)
|
|
{
|
|
$teile = array();
|
|
foreach($spalten[$fields] as $spalte)
|
|
{
|
|
$teile[] = "$spalte LIKE ?";
|
|
$params[] = "%".$tag."%";
|
|
}
|
|
$bedingung .= " $combiner (".implode(" OR ", $teile).")";
|
|
}
|
|
return $bedingung;
|
|
}
|
|
|
|
/*
|
|
* Kunden- bzw. Lieferantensuche, eine Zeile je Partner. $typ ist 1 fuer
|
|
* Kunden, 2 fuer Lieferanten. Mit $full kommen auch veraltete Versionen
|
|
* dazu; ihre Namen, Adressen und Telefonnummern stehen dann untereinander
|
|
* in einer Zelle (siehe zeilenHtml()).
|
|
* Rueckgabe: array("all" => sql, "limited" => sql mit LIMIT, "params" => Werte).
|
|
*/
|
|
function createPartQry($page,$pagesize,$src,$combiner,$fields,$full=0,$typ=1)
|
|
{
|
|
$joins = "FROM partner
|
|
LEFT JOIN adresse ON adresse.partner_id = partner.id
|
|
LEFT JOIN strasse ON strasse.id = str_id
|
|
LEFT JOIN ort ON ort.id = ort_id
|
|
LEFT JOIN tel ON tel.partner_id = partner.id
|
|
LEFT JOIN kontakt ON kontakt.partner_id = partner.id";
|
|
if(!$full)
|
|
$query = "SELECT partner.id AS kdnr,firma,vname,nname,vname2,nname2,ort,plz,str,hnr, tel.nr AS tel
|
|
$joins
|
|
WHERE updated_by = 0 AND adresse.typ_id = 1 AND partner.typ_id = ?";
|
|
else
|
|
$query = "SELECT partner.id AS kdnr,firma,
|
|
GROUP_CONCAT(CONCAT(vname,' ',nname) ORDER BY adresse.id, tel.id SEPARATOR '\n') AS nname, '' AS vname,
|
|
GROUP_CONCAT(CONCAT(vname2,' ',nname2) ORDER BY adresse.id, tel.id SEPARATOR '\n') AS nname2,'' AS vname2,'' AS ort,
|
|
GROUP_CONCAT(CONCAT(plz,' ',ort) ORDER BY adresse.id, tel.id SEPARATOR '\n') AS plz,
|
|
GROUP_CONCAT(CONCAT(str,' ',hnr) ORDER BY adresse.id, tel.id SEPARATOR '\n') AS str,'' AS hnr,
|
|
GROUP_CONCAT(tel.nr ORDER BY adresse.id, tel.id SEPARATOR '\n') AS tel
|
|
$joins
|
|
WHERE partner.typ_id = ?";
|
|
$params = array((int)$typ);
|
|
$query .= partnerSuchbedingung($src, $combiner, $fields, $params);
|
|
// Ohne feste Reihenfolge kann dieselbe Zeile beim Blaettern zweimal
|
|
// oder gar nicht auftauchen
|
|
$query .= " GROUP BY partner.id ORDER BY partner.id";
|
|
|
|
$ret["all"] = $query;
|
|
$ret["limited"] = $query." LIMIT ".((int)$page*(int)$pagesize).", ".(int)$pagesize;
|
|
$ret["params"] = $params;
|
|
return $ret;
|
|
}
|
|
|
|
/*
|
|
* Adresssuche: wie createPartQry(), aber eine Zeile je Adresse statt je
|
|
* Partner. Damit laesst sich fuer ein Dokument eine Nebenadresse auswaehlen.
|
|
*/
|
|
function createAdressQry($page,$pagesize,$src,$combiner,$fields,$full=0,$typ=1)
|
|
{
|
|
$query = "SELECT partner.id AS kdnr,firma,vname,nname,vname2,nname2,ort,plz,str,hnr,adresse.id AS adrid, tel.nr AS tel
|
|
FROM partner
|
|
LEFT JOIN adresse ON adresse.partner_id = partner.id
|
|
LEFT JOIN strasse ON strasse.id = str_id
|
|
LEFT JOIN ort ON ort.id = ort_id
|
|
LEFT JOIN tel ON tel.partner_id = partner.id
|
|
LEFT JOIN kontakt ON kontakt.partner_id = partner.id
|
|
WHERE ".($full ? "" : "updated_by = 0 AND ")."partner.typ_id = ?";
|
|
$params = array((int)$typ);
|
|
$query .= partnerSuchbedingung($src, $combiner, $fields, $params);
|
|
$query .= " GROUP BY adresse.id ORDER BY adresse.id";
|
|
|
|
$ret["all"] = $query;
|
|
$ret["limited"] = $query." LIMIT ".((int)$page*(int)$pagesize).", ".(int)$pagesize;
|
|
$ret["params"] = $params;
|
|
return $ret;
|
|
}
|
|
|
|
/*
|
|
* Suche in den Dokumenten eines Kunden. Liefert array("all" => sql,
|
|
* "limited" => sql mit LIMIT, "params" => Platzhalterwerte für beide).
|
|
* $combiner muss "AND" oder "OR" sein.
|
|
*/
|
|
function createKdnRechQry($page,$pagesize,$src,$combiner,$id,$typ,$sks=0)
|
|
{
|
|
$docnr = "rechnr";
|
|
$combiner = $combiner == "OR" ? "OR" : "AND";
|
|
$params = array($id, $typ);
|
|
if(!$sks)
|
|
{
|
|
$query = "SELECT rechnung.$docnr AS rechnr,
|
|
rechnung.id,
|
|
DATE_FORMAT(rechnung.datetime, '%d.%m.%Y') AS date,
|
|
GROUP_CONCAT(CONCAT(artikel.bezeichn, ' (', artikel_rechn.wanr, ')') SEPARATOR '\n') AS artikel,
|
|
adresse_id,
|
|
storno,
|
|
rechnung.typ_id
|
|
FROM rechnung
|
|
LEFT JOIN rechtyp ON rechnung.typ_id = rechtyp.id
|
|
LEFT JOIN artikel_rechn ON rechnung.id = artikel_rechn.rech_id
|
|
LEFT JOIN artikel ON artikel_rechn.art_id = artikel.id
|
|
WHERE partner_id = ? AND rechtyp.id = ? AND rechnung.sks = 0 ";
|
|
foreach($src AS $tag)
|
|
{
|
|
$tag .= "%";
|
|
$query .= " $combiner (artikel.bezeichn LIKE ? OR rechnung.rechnr LIKE ? OR DATE_FORMAT(rechnung.datetime, '%d.%m.%Y') LIKE ?)";
|
|
array_push($params, $tag, $tag, $tag);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$query = "SELECT rechnung.$docnr AS rechnr,
|
|
rechnung.id,
|
|
DATE_FORMAT(rechnung.datetime, '%d.%m.%Y') AS date,
|
|
GROUP_CONCAT(CONCAT(artikelsks.bezeichn1, ' ', artikelsks.bezeichn2) SEPARATOR '\n') AS artikel,
|
|
adresse_id,
|
|
rechnung.typ_id
|
|
FROM rechnung
|
|
LEFT JOIN rechtyp ON rechnung.typ_id = rechtyp.id
|
|
RIGHT JOIN artikelsks ON rechnung.rechnr = artikelsks.rechnr
|
|
WHERE partner_id = ? AND rechtyp.id = ? AND rechnung.sks = 1 ";
|
|
foreach($src AS $tag)
|
|
{
|
|
$tag .= "%";
|
|
$query .= " $combiner (artikelsks.bezeichn1 LIKE ? OR artikelsks.bezeichn2 LIKE ? OR rechnung.rechnr LIKE ? OR DATE_FORMAT(rechnung.datetime, '%d.%m.%Y') LIKE ?)";
|
|
array_push($params, $tag, $tag, $tag, $tag);
|
|
}
|
|
}
|
|
|
|
$query .= " GROUP BY rechnung.rechnr ORDER BY rechnung.datetime DESC ";
|
|
|
|
$ret["all"] = $query;
|
|
$query .= " LIMIT ".((int)$page*(int)$pagesize).", ".(int)$pagesize;
|
|
$ret["limited"] = $query;
|
|
$ret["params"] = $params;
|
|
return $ret;
|
|
}
|
|
|
|
/* Projekte eines Kunden, Rueckgabe wie createKdnRechQry(). */
|
|
function createKdnProjectQry($page,$pagesize,$src,$combiner,$id)
|
|
{
|
|
$combiner = $combiner == "OR" ? "OR" : "AND";
|
|
$params = array($id);
|
|
$query = "SELECT project.id, project.name,
|
|
DATE_FORMAT(project.datetime, '%d.%m.%Y') AS date,
|
|
SUM(CASE WHEN rechn = 0 THEN work.std ELSE 0 END) AS work
|
|
FROM project
|
|
JOIN work ON project.id = work.project_id
|
|
AND partner_id = ?";
|
|
foreach($src AS $tag)
|
|
{
|
|
$tag .= "%";
|
|
$query .= " $combiner (work.bezeichn LIKE ? OR project.name LIKE ? OR DATE_FORMAT(project.datetime, '%d.%m.%Y') LIKE ?)";
|
|
array_push($params, $tag, $tag, $tag);
|
|
}
|
|
|
|
$query .= " GROUP BY project.id ORDER BY project.datetime DESC ";
|
|
|
|
$ret["all"] = $query;
|
|
$ret["limited"] = $query." LIMIT ".((int)$page*(int)$pagesize).", ".(int)$pagesize;
|
|
$ret["params"] = $params;
|
|
return $ret;
|
|
}
|
|
|
|
/* Kommissionsadressen (adresstyp 5) eines Kunden, Rueckgabe wie createKdnRechQry(). */
|
|
function createKommQry($page,$pagesize,$src,$combiner,$id)
|
|
{
|
|
$combiner = $combiner == "OR" ? "OR" : "AND";
|
|
$params = array($id);
|
|
$query = "SELECT adresse.id, adresse.partner_id, firma, vname, nname, vname2, nname2, titel_id, titel2_id, anrede_id, anrede2_id, str, hnr, ort, ortsteil,plz,ort,nr AS tel,vwahl
|
|
FROM adresse
|
|
LEFT JOIN strasse ON adresse.str_id = strasse.id
|
|
LEFT JOIN ort ON ort_id = ort.id
|
|
LEFT JOIN tel ON adresse.id = tel.adresse_id
|
|
WHERE adresse.partner_id = ? AND adresse.typ_id = 5 ";
|
|
foreach($src AS $tag)
|
|
{
|
|
$tag .= "%";
|
|
$query .= " $combiner (ort LIKE ?
|
|
OR str LIKE ?
|
|
OR nr LIKE ?
|
|
OR vname LIKE ?
|
|
OR nname LIKE ?
|
|
OR vname2 LIKE ?
|
|
OR nname2 LIKE ?
|
|
OR firma LIKE ?)";
|
|
for($i = 0; $i < 8; $i++)
|
|
$params[] = $tag;
|
|
}
|
|
$query .= " GROUP BY adresse.id ORDER BY adresse.id DESC ";
|
|
|
|
$ret["all"] = $query;
|
|
$ret["limited"] = $query." LIMIT ".((int)$page*(int)$pagesize).", ".(int)$pagesize;
|
|
$ret["params"] = $params;
|
|
return $ret;
|
|
}
|
|
|
|
/*
|
|
* Suche über alle Dokumente, Rückgabe wie createKdnRechQry().
|
|
*/
|
|
function createRechQry($page,$pagesize,$src,$combiner,$sks=0)
|
|
{
|
|
$docnr = "rechnr";
|
|
$combiner = $combiner == "OR" ? "OR" : "AND";
|
|
$params = array();
|
|
if(!$sks)
|
|
{
|
|
$query = "SELECT CONCAT(ELT(rechnung.typ_id,'R','G','A','B','L','M'),MID(rechnung.$docnr,1,4),'-',MID(rechnung.$docnr,5,2),'-',MID(rechnung.$docnr,7,2),'.',MID(rechnung.$docnr,9,2)) AS drechnr,
|
|
rechnung.$docnr AS rechnr,
|
|
rechnung.id,
|
|
DATE_FORMAT(rechnung.datetime, '%d.%m.%Y') AS date,
|
|
GROUP_CONCAT(CONCAT(artikel.bezeichn, ' (', artikel_rechn.wanr, ')') SEPARATOR '\n') AS artikel,
|
|
adresse_id,
|
|
storno,
|
|
rechnung.typ_id
|
|
FROM rechnung
|
|
LEFT JOIN rechtyp ON rechnung.typ_id = rechtyp.id
|
|
LEFT JOIN artikel_rechn ON rechnung.id = artikel_rechn.rech_id
|
|
LEFT JOIN artikel ON artikel_rechn.art_id = artikel.id
|
|
WHERE rechnung.sks = 0";
|
|
foreach($src AS $tag)
|
|
{
|
|
$tag = "%".$tag."%";
|
|
$query .= " $combiner (artikel.bezeichn LIKE ? OR
|
|
CONCAT(ELT(rechnung.typ_id,'R','G','A','B','L','M'),MID(rechnung.$docnr,1,4),'-',MID(rechnung.$docnr,5,2),'-',MID(rechnung.$docnr,7,2),'.',MID(rechnung.$docnr,9,2)) LIKE ? OR
|
|
DATE_FORMAT(rechnung.datetime, '%d.%m.%Y') LIKE ?)";
|
|
array_push($params, $tag, $tag, $tag);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$query = "SELECT rechnung.$docnr AS drechnr,
|
|
rechnung.$docnr AS rechnr,
|
|
rechnung.id,
|
|
DATE_FORMAT(rechnung.datetime, '%d.%m.%Y') AS date,
|
|
GROUP_CONCAT(CONCAT(artikelsks.bezeichn1, ' ', artikelsks.bezeichn2) SEPARATOR '\n') AS artikel,
|
|
adresse_id,
|
|
storno = 0,
|
|
rechnung.typ_id
|
|
FROM rechnung
|
|
LEFT JOIN rechtyp ON rechnung.typ_id = rechtyp.id
|
|
RIGHT JOIN artikelsks ON rechnung.rechnr = artikelsks.rechnr
|
|
WHERE rechnung.sks = 1 ";
|
|
foreach($src AS $tag)
|
|
{
|
|
$tag = "%".$tag."%";
|
|
$query .= " $combiner (artikelsks.bezeichn1 LIKE ? OR
|
|
artikelsks.bezeichn2 LIKE ? OR
|
|
rechnung.rechnr LIKE ? OR
|
|
DATE_FORMAT(rechnung.datetime, '%d.%m.%Y') LIKE ?)";
|
|
array_push($params, $tag, $tag, $tag, $tag);
|
|
}
|
|
}
|
|
|
|
$query .= " GROUP BY rechnung.rechnr ORDER BY rechnung.datetime DESC ";
|
|
|
|
$ret["all"] = $query;
|
|
$query .= " LIMIT ".((int)$page*(int)$pagesize).", ".(int)$pagesize;
|
|
$ret["limited"] = $query;
|
|
$ret["params"] = $params;
|
|
return $ret;
|
|
}
|
|
|
|
|
|
|
|
function createTermQry($page,$pagesize,$src,$combiner,$termtyp)
|
|
{
|
|
|
|
$query = "SELECT termin.id,termtyp.typ, termin.head, MIN(termtime) AS termtime, SEC_TO_TIME(SUM(TIME_TO_SEC(termdauer))) AS termdauer, user, user2, user3, user4, done, partner_id, adresse_id, termin.id, str, ort, ortsteil, plz, hnr, adresse.vname as vname, adresse.nname as nname,
|
|
adresse.firma as firma,
|
|
user.vname as uservname, user.nname as usernname, user.color as color,
|
|
user2.vname as uservname2, user2.nname as usernname2,
|
|
user3.vname as uservname3, user3.nname as usernname3,
|
|
user4.vname as uservname4, user4.nname as usernname4,
|
|
firma, vname2, nname2
|
|
FROM termin
|
|
LEFT JOIN termtyp ON termin.typ = termtyp.id
|
|
LEFT JOIN adresse ON termin.adresse_id = adresse.id
|
|
LEFT JOIN partner ON adresse.partner_id = partner.id
|
|
LEFT JOIN strasse ON adresse.str_id = strasse.id
|
|
LEFT JOIN ort ON strasse.ort_id = ort.id
|
|
LEFT JOIN user ON termin.user = user.id
|
|
LEFT JOIN user AS user2 ON termin.user2 = user2.id
|
|
LEFT JOIN user AS user3 ON termin.user3 = user3.id
|
|
LEFT JOIN user AS user4 ON termin.user4 = user4.id
|
|
WHERE ";
|
|
if($termtyp == 1)
|
|
$query .= "termdauer != '24:00:00' AND termtime != '0000-00-00 00:00:00' AND done = 0 AND act_date < NOW()";
|
|
elseif($termtyp == 2)
|
|
$query .= "termdauer != '24:00:00' AND termtime = '0000-00-00 00:00:00' AND done = 0 AND act_date < NOW()";
|
|
elseif($termtyp == 3)
|
|
$query .= "termdauer != '24:00:00' AND done = 1 AND act_date < NOW()";
|
|
elseif($termtyp == 4)
|
|
$query .= "termdauer != '24:00:00' AND act_date > NOW()";
|
|
elseif($termtyp == 5)
|
|
$query .= "termdauer = '24:00:00'";
|
|
foreach($src AS $tag)
|
|
{
|
|
$tag = "%".$tag."%";
|
|
$query .= " $combiner (termin.head LIKE '$tag' OR
|
|
termin.text LIKE '$tag' OR
|
|
adresse.firma LIKE '$tag' OR
|
|
adresse.vname LIKE '$tag' OR
|
|
adresse.nname LIKE '$tag' OR
|
|
ort LIKE '$tag' OR
|
|
plz LIKE '$tag' OR
|
|
str LIKE '$tag' OR
|
|
DATE_FORMAT(termtime, '%d.%m.%Y %H:%i') LIKE '$tag')";
|
|
}
|
|
if($termtyp == 2)
|
|
$query .= " GROUP BY main_id ORDER BY ort ASC, termtime DESC";
|
|
elseif($termtyp != 5 && $termtyp != 3)
|
|
$query .= " GROUP BY main_id ORDER BY termtime ASC";
|
|
else
|
|
$query .= " GROUP BY main_id ORDER BY termtime DESC";
|
|
|
|
$ret["all"] = $query;
|
|
$query .= " LIMIT ".$page*$pagesize.", $pagesize";
|
|
$ret["limited"] = $query;
|
|
return $ret;
|
|
}
|
|
|
|
function createZeitQry($page,$pagesize,$src,$combiner,$user)
|
|
{
|
|
|
|
$query = "SELECT zeiten.id,DATE_FORMAT(zeiten.kommen,'%d.%m.%y %H:%i') AS kommen, DATE_FORMAT(zeiten.gehen,'%d.%m.%y %H:%i') AS gehen, zeiten.pause_mins,
|
|
floor(TIME_TO_SEC(SUBTIME(TIMEDIFF(gehen,kommen),MAKETIME(FLOOR(pause_mins/60), pause_mins % 60, 0)))/60) AS dauer_mins, floor(TIME_TO_SEC(TIMEDIFF(kommen,STR_TO_DATE(CONCAT(DATE(kommen), ' ', MAKETIME(7,30,0)), '%Y-%m-%d %H:%i:%s')))/60) AS early_mins, user.weekhours*60/5 as sollDayMins
|
|
FROM zeiten
|
|
LEFT JOIN user ON zeiten.ma_id = user.id
|
|
WHERE user.id = '".$user."'";
|
|
foreach($src AS $tag)
|
|
{
|
|
$tag = "%".$tag."%";
|
|
$query .= " $combiner (DATE_FORMAT(zeiten.gehen,'%d.%m.%Y') LIKE '$tag' OR
|
|
DATE_FORMAT(zeiten.kommen,'%d.%m.%Y') LIKE '$tag')";
|
|
}
|
|
$query .= " ORDER BY zeiten.kommen DESC";
|
|
|
|
$ret["all"] = $query;
|
|
$query .= " LIMIT ".$page*$pagesize.", $pagesize";
|
|
$ret["limited"] = $query;
|
|
//echo $query;
|
|
return $ret;
|
|
}
|
|
|
|
function createMsgQry($page,$pagesize,$src,$combiner,$user)
|
|
{
|
|
|
|
$query = "SELECT msg, rd, DATE_FORMAT(datetime,'%d.%m.%Y - %H:%i Uhr') AS datetime, send_id, send.vname AS sendvname, send.nname AS sendnname, rec_id, rec.vname AS recvname, rec.nname AS recnname
|
|
FROM message
|
|
LEFT JOIN user AS rec ON message.rec_id = rec.id
|
|
LEFT JOIN user AS send ON message.send_id = send.id
|
|
WHERE ";
|
|
$query .= "(rec_id = '".$_SESSION["user"]."' AND send_id = '".$user."') OR (rec_id = '".$user."' AND send_id = '".$_SESSION["user"]."')";
|
|
foreach($src AS $tag)
|
|
{
|
|
$tag = "%".$tag."%";
|
|
$query .= " $combiner (message.msg LIKE '$tag' OR
|
|
DATE_FORMAT(datetime, '%d.%m.%Y %H:%i') LIKE '$tag')";
|
|
}
|
|
$query .= " ORDER BY message.id ASC";
|
|
|
|
$ret["all"] = $query;
|
|
$query .= " LIMIT ".$page*$pagesize.", $pagesize";
|
|
$ret["limited"] = $query;
|
|
return $ret;
|
|
}
|
|
|
|
/*
|
|
* Zahl der Treffer einer Suche. Die Abfragen aus create*Qry() gruppieren,
|
|
* deshalb wird die ungekuerzte Abfrage ausgefuehrt und gezaehlt, statt mit
|
|
* COUNT(*) zu arbeiten.
|
|
*/
|
|
function zaehleTreffer($dbconn, $queries)
|
|
{
|
|
$res = isset($queries["params"])
|
|
? db_abfrage($dbconn, $queries["all"], $queries["params"])
|
|
: mysqli_query($dbconn, $queries["all"]);
|
|
if(!$res)
|
|
die("Datenbank fehler: ".htmlspecialchars(mysqli_error($dbconn)));
|
|
return mysqli_num_rows($res);
|
|
}
|
|
|
|
/*
|
|
* Mit \n verbundene Werte aus GROUP_CONCAT als escaptes HTML, eine Zeile
|
|
* je Wert. Zusammengebaut wird erst hier, damit Daten aus der Datenbank
|
|
* nicht als HTML durchschlagen.
|
|
*/
|
|
function zeilenHtml($text)
|
|
{
|
|
return implode("<br />", array_map("htmlspecialchars", explode("\n", (string)$text)));
|
|
}
|
|
|
|
function displayPages($pagesize,$currpage,$numentries,$refreshfunc,$ad_params = "")
|
|
{
|
|
echo "Seite: ";
|
|
if($currpage == 0)
|
|
echo " 1 ";
|
|
else
|
|
echo "<a href='#' onClick='".$refreshfunc."(0$ad_params)'> 1 </a>";
|
|
$i = 1;
|
|
while($numentries > $i*$pagesize)
|
|
{
|
|
$i++;
|
|
if($i<9 || $currpage == $i-1 || $currpage == $i-2 || $currpage == $i || $i*$pagesize > $numentries-$pagesize*2)
|
|
{
|
|
$gap=0;
|
|
if($currpage == $i-1)
|
|
echo " ".$i." ";
|
|
else
|
|
echo "<a href='#' class='noloading' onClick='".$refreshfunc."(".($i-1).$ad_params.")'> $i </a>";
|
|
}
|
|
else
|
|
{
|
|
if(!$gap)
|
|
echo " ..... ";
|
|
$gap = 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
function displaySplitPages($pagesize,$firstcurrpage,$secondcurrpage,$pagesplitNr,$numentries,$refreshfunc,$ad_params = "")
|
|
{
|
|
if($pagesplitNr == 0)
|
|
$currpage=$firstcurrpage;
|
|
else
|
|
$currpage=$secondcurrpage;
|
|
|
|
echo "Seite: ";
|
|
if($currpage == 0)
|
|
echo " 1 ";
|
|
else
|
|
if($pagesplitNr == 0)
|
|
echo "<a href='#' onClick='".$refreshfunc."(0,".$secondcurrpage.$ad_params.")'> 1 </a>";
|
|
else
|
|
echo "<a href='#' onClick='".$refreshfunc."(".$firstcurrpage.",0".$ad_params.")'> 1 </a>";
|
|
$i = 1;
|
|
while($numentries > $i*$pagesize)
|
|
{
|
|
$i++;
|
|
if($i<9 || $currpage == $i-1 || $currpage == $i-2 || $currpage == $i || $i*$pagesize > $numentries-$pagesize*2)
|
|
{
|
|
$gap=0;
|
|
if($currpage == $i-1)
|
|
echo " ".$i." ";
|
|
else
|
|
if($pagesplitNr == 0)
|
|
echo "<a href='#' onClick='".$refreshfunc."(".($i-1).",$secondcurrpage".$ad_params.")'> $i </a>";
|
|
else
|
|
echo "<a href='#' onClick='".$refreshfunc."($firstcurrpage,".($i-1).$ad_params.")'> $i </a>";
|
|
}
|
|
else
|
|
{
|
|
if(!$gap)
|
|
echo " ..... ";
|
|
$gap = 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
function displayList($header,$entries,$speciallines=array(),$colors=array())
|
|
{
|
|
echo "<table cellspacing='0'><tr>";
|
|
|
|
if($colors)
|
|
echo "<th></th>";
|
|
foreach($header AS $head)
|
|
{
|
|
echo "<th>$head</th>";
|
|
}
|
|
echo "</tr>";
|
|
$i = 0;
|
|
foreach($entries AS $entry)
|
|
{
|
|
|
|
if($i%2)
|
|
echo "<tr style='background-color: #f0f0f0;'>";
|
|
else
|
|
echo "<tr style='background-color: #e2e2e2;'>";
|
|
|
|
if(isset($colors[$i]))
|
|
echo "<td bgcolor='".$colors[$i]."' style='box-shadow: inset 0 0 0.7em #000; border: 1px solid black; border-top-left-radius: 0.5em; border-bottom-left-radius: 0.5em;'></td>";
|
|
|
|
foreach($entry AS $element)
|
|
{
|
|
echo "<td>$element</td>";
|
|
}
|
|
|
|
echo "</tr>";
|
|
$i++;
|
|
}
|
|
if($speciallines)
|
|
{
|
|
foreach($speciallines AS $entry)
|
|
{
|
|
$i++;
|
|
if($i%2)
|
|
echo "<tr bgcolor='#ffdddd'>";
|
|
else
|
|
echo "<tr bgcolor='#ffcccc'>";
|
|
foreach($entry AS $element)
|
|
{
|
|
echo "<td>$element</td>";
|
|
}
|
|
echo "</tr>";
|
|
}
|
|
}
|
|
echo "</table>";
|
|
}
|
|
|
|
/*
|
|
* Bausteine fuer die Trefferlisten. Sie liefern fertiges HTML und escapen
|
|
* die Werte aus der Datenbank deshalb selbst.
|
|
*/
|
|
function makenameline($adresse)
|
|
{
|
|
$ret = zeilenHtml(trim($adresse["vname"]." ".$adresse["nname"]));
|
|
if(!empty($adresse["firma"]))
|
|
$ret .= "<br /><i><u>".zeilenHtml($adresse["firma"])."</u></i>";
|
|
return $ret;
|
|
}
|
|
function makeadressline($adresse)
|
|
{
|
|
$ret["ort"] = zeilenHtml(trim($adresse["plz"]." ".$adresse["ort"]));
|
|
$ret["str"] = zeilenHtml(trim($adresse["str"]." ".$adresse["hnr"]));
|
|
return $ret;
|
|
}
|
|
function maketelline($tel)
|
|
{
|
|
$nr = isset($tel["tel"]) ? (string)$tel["tel"] : "";
|
|
$ret = "";
|
|
if(!empty($tel["vwahl"]) && !str_contains($nr, "-") && !str_contains($nr, "/"))
|
|
$ret = zeilenHtml($tel["vwahl"])."-";
|
|
$ret .= zeilenHtml($nr);
|
|
return $ret;
|
|
}
|
|
|
|
|
|
?>
|