Files
Kundenverwaltung/sites/terminshow.php
T
adminandClaude Opus 5 490c4f12a4 Termine auf Prepared Statements umgebaut
Kalender, Terminliste, Terminformular und Terminzettel laufen ueber
db_abfrage() mit Platzhaltern; das Anlegen einer mehrtaegigen Terminreihe
liegt in einer Transaktion. Die Logik steckt jetzt in incs/termin.php,
sites/termin*.php rufen sie nur noch auf.

Dabei behoben:
- SQL-Injektion ueber die Suchbegriffe der Terminliste, ueber die
  Mehrfachauswahl (Ankreuzfelder del<N>/erl<N> gingen roh in DELETE bzw.
  UPDATE), ueber die Wiedervorlage-Tage (INTERVAL $folgedays DAY) und ueber
  ?action=terminshow&id=... in maketerminarray(), maketerminadresse(),
  maketelnrn() und makegooglestring()
- gespeichertes XSS: Beschreibung, Notiz, Termintyp, Ort, Kundenname und
  Mitarbeiterfarbe im Kalender, in der Terminliste und im Formular
- "or $err=error(...)" stand innerhalb des Abfrage-Strings, dadurch wurden
  die Nebenzeilen einer Terminreihe beim Loeschen nie entfernt
- die Abfrage zum Folgetermin las eine Spalte typ_id, die es in termin nicht
  gibt; Typ und Wiedervorlage fehlten deshalb beim Bearbeiten
- ein Folgetermin wurde mit termtime='' und termdauer='' angelegt, ein
  Termin ohne Folgetermin mit followed_by='' - im strikten Modus Fehler
- ein Termin ohne Datum landete auf dem 01.01.1970 und gab dabei
  "NICHTTERMINIERT!!" mitten in die Seite aus
- die Ueberschneidungspruefung verglich ab dem zweiten Tag gegen das Ende
  des ersten Tages
- eine unbekannte Registerkarte der Terminliste ergab ein leeres WHERE und
  damit einen SQL-Fehler; jetzt gilt die Standardansicht
- terminshow.php pruefte den Typ mit = statt ==
- der Kalender haengt nicht mehr an der Locale de_DE (strftime)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 00:04:38 +02:00

46 lines
1.4 KiB
PHP

<?php
/*
* Terminzettel als PDF: eine Seite je Termin, einmal zum Abheften und
* einmal mit Anfahrtsskizze. Aufruf entweder mit id (ein Termin) oder mit
* date (alle Termine eines Tages).
*/
require_once "incs/termin.php";
include("incs/makepdf.php");
$terminid = parameterGanzzahl("id");
$datum = isset($_GET["date"]) && is_string($_GET["date"]) ? date("Y-m-d", strtotime($_GET["date"])) : "";
$ids = array();
if($terminid && !$datum)
$ids[] = $terminid;
elseif($datum)
{
$zeilen = db_zeilen($dbconn, "SELECT id FROM termin WHERE adresse_id != 0 AND DATE(termtime) = ? ORDER BY termtime ASC", array($datum));
foreach((array)$zeilen as $z)
$ids[] = $z["id"];
}
/* $anfahrt = 0 für den Terminzettel, 1 für die Seite mit der Karte */
function terminzettel($dbconn, $ids, $anfahrt)
{
$pdf = $anfahrt ? makerawPDFanfahrt(0) : makerawPDFcopy(0);
$erste = true;
foreach($ids as $id)
{
if(!$erste)
$pdf->addpage();
$erste = false;
$googleadresse = $anfahrt ? makegooglestring($dbconn, $id) : "";
makesingleterminpage($pdf, maketerminarray($dbconn, $id), maketerminadresse($dbconn, $id),
maketelnrn($dbconn, $id), $anfahrt, $googleadresse);
}
$name = str_replace(array(" ", "."), array("_", "_"), microtime());
savePDF($pdf, "./temp/pdftemp/$name.pdf");
return "./temp/pdftemp/$name.pdf";
}
$smarty->assign("pdffile", terminzettel($dbconn, $ids, 0));
$smarty->assign("pdffile2", terminzettel($dbconn, $ids, 1));
$smarty->display("terminshow.tpl");
?>