Kunden und Adressen auf Prepared Statements umgebaut

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>
This commit is contained in:
2026-09-21 19:47:01 +02:00
co-authored by Claude Opus 5
parent 3f7d070d7f
commit 3dfbf1c9c7
40 changed files with 1706 additions and 2194 deletions
+5 -118
View File
@@ -1,120 +1,7 @@
<?php
if($_GET["id"])
{
$qry = mysqli_query($dbconn,"SELECT * FROM partner WHERE id='".mysql_escape_string($_GET["id"])."' AND typ_id = 2")
or $err=error("Fehler beim auslesen des Zulieferers:<br />". mysqli_error($dbconn));
$kdnres=mysqli_fetch_assoc($qry);
$smarty->assign("kunde",$kdnres);
if($kdnres.id)
{
$qry = mysqli_query($dbconn,"SELECT id, datetime_new FROM partner WHERE updated_by='".$kdnres["id"]."'")
or $err=error("Fehler beim auslesen der neueren Versionen:<br />". mysqli_error($dbconn));
while($res=mysqli_fetch_assoc($qry))
{
$oldrecords[] = $res;
$qry = mysqli_query($dbconn,"SELECT id, datetime_new FROM partner WHERE updated_by='".$res["id"]."'")
or $err=error("Fehler beim auslesen der neueren Versionen:<br />". mysqli_error($dbconn));
}
$smarty->assign("oldrecords",$oldrecords);
$qry = mysqli_query($dbconn,"SELECT id, datetime_new FROM partner WHERE id='".$kdnres["updated_by"]."'")
or $err=error("Fehler beim auslesen der älteren Versionen:<br />". mysqli_error($dbconn));
while($res=mysqli_fetch_assoc($qry))
{
$newrecords[] = $res;
$qry = mysqli_query($dbconn,"SELECT id, datetime_new FROM partner WHERE id='".$res["updated_by"]."'")
or $err=error("Fehler beim auslesen der älteren Versionen:<br />". mysqli_error($dbconn));
}
$smarty->assign("newrecords",$newrecords);
$tmp = array();
$qry = mysqli_query($dbconn,"SELECT * FROM anrede")
or $err=error("Fehler beim auslesen der Anreden:<br />". mysqli_error($dbconn));
while($res=mysqli_fetch_assoc($qry))
{
$tmp[$res["id"]] = $res["anrede"];
}
$smarty->assign("anr",$tmp);
$tmp = array();
$qry = mysqli_query($dbconn,"SELECT * FROM titel")
or $err=error("Fehler beim auslesen der Titel:<br />". mysqli_error($dbconn));
while($res=mysqli_fetch_assoc($qry))
{
$tmp[$res["id"]] = $res["titel"];
}
$smarty->assign("titel",$tmp);
$tmp = array();
$qry = mysqli_query($dbconn,"SELECT name,typ,tel.id,nr,ort,ortsteil,plz,vwahl
FROM tel LEFT JOIN teltyp ON typ_id = teltyp.id LEFT JOIN ort ON ort_id = ort.id
WHERE partner_id='".mysql_escape_string($_GET["id"])."' ORDER BY typ_id ASC")
or $err=error("Fehler beim auslesen der Telefonnummern:<br />". mysqli_error($dbconn));
while($res=mysqli_fetch_assoc($qry))
{
$tmp[] = $res;
}
$smarty->assign("telnrn",$tmp);
$tmp = array();
$qry = mysqli_query($dbconn,"SELECT kontakt.id, kontakt, partner_id, typ
FROM kontakt LEFT JOIN kontakttyp ON kontakttyp.id = kontakt.typ_id
WHERE partner_id='".mysql_escape_string($_GET["id"])."' ORDER BY typ_id ASC")
or $err=error("Fehler beim auslesen der Kontakte:<br />". mysqli_error($dbconn));
while($res=mysqli_fetch_assoc($qry))
{
$tmp[] = $res;
}
$smarty->assign("contacts",$tmp);
$tmp = array();
$qry = mysqli_query($dbconn,"SELECT * FROM notiz WHERE partner_id='".mysql_escape_string($_GET["id"])."'")
or $err=error("Fehler beim auslesen der Notizen:<br />". mysqli_error($dbconn));
while($res=mysqli_fetch_assoc($qry))
{
$tmp[] = $res;
}
$smarty->assign("notes",$tmp);
$tmp = array();
$qry = mysqli_query($dbconn,"SELECT ktonr,iban,swift,blz,bank,partner_id,konto.id,inhaber
FROM konto JOIN bank ON konto.bank_id = bank.id WHERE partner_id='".mysql_escape_string($_GET["id"])."'")
or $err=error("Fehler beim auslesen der Konten:<br />". mysqli_error($dbconn));
while($res=mysqli_fetch_assoc($qry))
{
$tmp[] = $res;
}
$smarty->assign("kontos",$tmp);
$qry = mysqli_query($dbconn,"SELECT plz, ortsteil, ort, str, hnr, vname, nname, vname2, nname2, firma, adresse.id, land, anrede_id, titel_id, adresstyp.typ, adresse.typ_id
FROM adresse JOIN
adresstyp ON adresstyp.id = adresse.typ_id
LEFT JOIN strasse ON str_id = strasse.id
LEFT JOIN ort ON ort_id = ort.id
LEFT JOIN land ON land_id = land.id
WHERE partner_id='".mysql_escape_string($_GET["id"])."'
ORDER BY typ_id ASC") or $err=error("Fehler beim auslesen der Adressen:<br />". mysqli_error($dbconn));
while($res=mysqli_fetch_assoc($qry))
{
$adressen[] = $res;
}
$smarty->assign("adressen",$adressen);
$tmp=array();
$qry = mysqli_query($dbconn,"SELECT typ, id FROM rechtyp");
while($res=mysqli_fetch_assoc($qry))
{
$tmp[] = $res;
}
$smarty->assign("rechtypen",$tmp);
$_SESSION["camefrom"] ="liefershow&id=".$_GET["id"];
}
}
<?php
require_once "incs/saveNchange.php";
partnerShowDaten($dbconn, $smarty, parameterGanzzahl("id"), 2);
$_SESSION["camefrom"] = "liefershow&id=".parameterGanzzahl("id");
$smarty->display("liefershow.tpl");
?>
?>