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
+15 -13
View File
@@ -7,8 +7,8 @@ function ajax_searchkunden(page)
search_in_progress = 1;
document.getElementById("kdnsrc_list").innerHTML = "<p><img src='pics/progress_white.gif' /></p>";
//document.getElementById("kdnsrc_src").disabled = true;
field = escape(document.getElementById("kdnsrc_field").value);
search = escape(document.getElementById("kdnsrc_src").value);
field = encodeURIComponent(document.getElementById("kdnsrc_field").value);
search = encodeURIComponent(document.getElementById("kdnsrc_src").value);
var url = "ajax/searchkunden.php?field=" + field + "&page=" + page + "&search=" + search;
reqkdnsrc = new XMLHttpRequest();
@@ -35,7 +35,7 @@ function ajax_searchzeit(page,user)
search_in_progress = 1;
document.getElementById("termcontainer-"+user).innerHTML = "<p><img src='pics/progress_white.gif' /></p>";
//document.getElementById("kdnsrc_src").disabled = true;
search = escape(document.getElementById("zeit_src-"+user).value);
search = encodeURIComponent(document.getElementById("zeit_src-"+user).value);
var url = "ajax/searchzeit.php?page=" + page + "&user=" + user + "&search=" + search;
reqkdnsrc = new XMLHttpRequest();
@@ -55,15 +55,17 @@ function ajax_searchzeit(page,user)
}
}
function ajax_searchadress(rechid,subact,page)
// page zuerst, damit die Seitenschaltung (displayPages) die Nummer
// als erstes Argument uebergeben kann - wie bei den anderen Suchen
function ajax_searchadress(page,rechid,subact)
{
if(!search_in_progress)
{
search_in_progress = 1;
document.getElementById("adrsrc_list").innerHTML = "<p><img src='pics/progress_white.gif' /></p>";
//document.getElementById("kdnsrc_src").disabled = true;
field = escape(document.getElementById("adrsrc_field").value);
search = escape(document.getElementById("adrsrc_src").value);
field = encodeURIComponent(document.getElementById("adrsrc_field").value);
search = encodeURIComponent(document.getElementById("adrsrc_src").value);
var url = "ajax/searchadress.php?field=" + field + "&page=" + page + "&search=" + search + "&rechid=" + rechid + "&subact=" + subact;
reqadrsrc = new XMLHttpRequest();
@@ -90,8 +92,8 @@ function ajax_searchliefer(page)
search_in_progress = 1;
document.getElementById("kdnsrc_list").innerHTML = "<p><img src='pics/progress_white.gif' /></p>";
//document.getElementById("kdnsrc_src").disabled = true;
field = escape(document.getElementById("kdnsrc_field").value);
search = escape(document.getElementById("kdnsrc_src").value);
field = encodeURIComponent(document.getElementById("kdnsrc_field").value);
search = encodeURIComponent(document.getElementById("kdnsrc_src").value);
var url = "ajax/searchliefer.php?field=" + field + "&page=" + page + "&search=" + search;
reqkdnsrc = new XMLHttpRequest();
@@ -118,7 +120,7 @@ function ajax_searchkdnprojects(page,kdnid)
search_in_progress = 1;
document.getElementById("projectlist").innerHTML = "<p><img src='pics/progress_white.gif' /></p>";
//document.getElementById("kdnsrc_src").disabled = true;
search = escape(document.getElementById("src_project").value);
search = encodeURIComponent(document.getElementById("src_project").value);
var url = "ajax/searchkdnprojects.php?page=" + page + "&search=" + search+"&kdnid=" + kdnid;
@@ -173,7 +175,7 @@ function ajax_searchkomm(page,kdnid)
search_in_progress = 1;
document.getElementById("kommsrc_list").innerHTML = "<p><img src='pics/progress_white.gif' /></p>";
//document.getElementById("kdnsrc_src").disabled = true;
search = escape(document.getElementById("kommsrc_src").value);
search = encodeURIComponent(document.getElementById("kommsrc_src").value);
var url = "ajax/searchkomm.php?page=" + page + "&search=" + search+"&kdnid=" + kdnid;
@@ -181,7 +183,7 @@ function ajax_searchkomm(page,kdnid)
reqkommsrc.open("GET", url, true);
reqkommsrc.onreadystatechange = function()
{
if(reqkdnsrc.readyState == 4)
if(reqkommsrc.readyState == 4)
{
// Get the data from the server's response
document.getElementById("kommsrc_list").innerHTML = reqkommsrc.responseText;
@@ -226,7 +228,7 @@ function ajax_searchterm(page, termtyp)
{
search_in_progress = 1;
document.getElementById("termcontainer-"+termtyp).innerHTML = "<p><img src='pics/progress_white.gif' /></p>";
search = escape(document.getElementById("term_src-"+termtyp).value);
search = encodeURIComponent(document.getElementById("term_src-"+termtyp).value);
var url = "ajax/searchterm.php?page=" + page + "&search=" + search + "&termtyp=" + termtyp;
@@ -276,7 +278,7 @@ function ajax_displaymsgs(page,user)
}
function sendmsg(touser)
{
msg = escape(document.getElementById("message-"+touser).value);
msg = encodeURIComponent(document.getElementById("message-"+touser).value);
var url = "ajax/sendmsg.php?touser="+touser+"&msg="+msg;
reqsndmsgs = new XMLHttpRequest();
reqsndmsgs.open("GET", url, true);