Rechnungsmodul auf Prepared Statements umgebaut

- incs/rechnung.php: alle Abfragen mit Platzhaltern. saveRechnung() setzte
  $_POST ungeprueft in SQL (Injection; ein Apostroph im Text brach das
  Speichern ab). Speichern, Kopieren und Loeschen laufen in Transaktionen,
  bei Fehlern bleibt nichts Halbes zurueck. Formularwerte ueber
  formularText/-Zahl/-Ganzzahl (strikter Modus).
- copyRech() trug die Rechnungsnummer ohne typ_id ein (Fehler im strikten
  Modus) und zaehlte typuebergreifend; jetzt wie beim Anlegen pro Typ
  (neueRechnungsnummer()). Artikel und Eigenschaften per INSERT ... SELECT.
- Adressblock-Formatierung aus makeadressblock() und
  makeadressblockUmschlag() in formatiereAdressblock() zusammengefuehrt.
- ajax/autosave.php und ajax/preview.php teilen sich saveTmpRechnung();
  ueberzaehlige Entwuerfe werden samt Artikeln entfernt (vorher FK-Fehler).
- sites/rechnungadd.php: Storno ohne SQL-Injection ueber $_GET["id"],
  Auswahllisten ueber db_zuordnung(), tote Kommissions-Abfrage entfernt.
- Rechnungssuche (createRechQry/createKdnRechQry) liefert SQL und Parameter
  getrennt; Suchbegriffe waren ungeprueft im SQL.
- saveLog() mit Platzhaltern, Protokolltext ueber db_sql_text().
- db.php: db_zuordnung(), db_sql_text(); Helfer liefern Strings wie
  mysqli_query(), damit alter Code sich gleich verhaelt.

Getestet: alter und neuer Code lesen dieselbe migrierte Datenbank, 150 von
155 Pruefungen (10.936 Werte) identisch, die uebrigen 5 sind der
Injection-Suchbegriff (alt: SQL-Fehler). Schreibtests fuer Entwurf,
Anlegen, Nummernkreise, Aendern, Rollback, Kopieren, Adresse, Storno und
Loeschen im strikten Modus.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-17 10:41:43 +02:00
co-authored by Claude Opus 5
parent a130ed56a3
commit d8fff4aeb6
11 changed files with 666 additions and 1243 deletions
+10
View File
@@ -86,6 +86,16 @@ Eine Schemaänderung besteht also aus: neuer Eintrag **vorn** in `update/version
**Umbau läuft (Branch `db-umbau`):** Verbindungen entstehen nur noch über `db_verbinden()` aus `incs/db.php`. Die Funktion setzt `utf8mb4`, den strikten `sql_mode` und schaltet die mysqli-Exceptions ab. Neue und umgebaute Abfragen nutzen `db_abfrage()`, `db_zeilen()`, `db_zeile()` und `db_wert()` mit `?`-Platzhaltern statt String-Verkettung. Ziel-Schema ist das der Instanz `kunden` in `utf8mb4`; die Altdaten sind teils doppelt kodiert und werden per Migration repariert. Dieser Stand darf nur zusammen mit der migrierten Datenbank live gehen.
Regeln für den Umbau:
- **Ergebnisse sind Strings** wie früher bei `mysqli_query()`: `db_zeilen()`, `db_zeile()`, `db_wert()` und `db_zuordnung()` wandeln die nativen int/float-Werte der Prepared Statements um. Wer `db_abfrage()` selbst ausliest, bekommt native Typen.
- **Formularwerte** über `formularText()`, `formularZahl()` (Komma als Dezimaltrenner, leer wird 0) und `formularGanzzahl()` aus `incs/rechnung.php` holen der strikte Modus lehnt `''` in Zahlenspalten ab.
- **Änderungsprotokoll:** `saveLog()` bekommt den Text aus `db_sql_text()`. Die Tabelle `log` ist reine Dokumentation, nichts daraus wird ausgeführt.
- **Mehrschrittiges Speichern** in eine Transaktion (`mysqli_begin_transaction` / `commit` / `rollback`), damit bei Fehlern keine halben Datensätze bleiben.
- **Tabellen- und Spaltennamen** lassen sich nicht binden; nur feste Werte aus dem Code einsetzen, `LIMIT` als `(int)`.
Umgebaut: Login/Passkeys, Benutzereinstellungen, Änderungsprotokoll, Rechnungsmodul (`incs/rechnung.php`, `sites/rechnungadd.php`, `sites/umschlagshow.php`, `ajax/autosave.php`, `ajax/preview.php`, Rechnungssuche). Offen: Kunden/Adressen (`incs/saveNchange.php`), Termine, Projekte, Zeiten, Benutzerverwaltung, übrige Suchen, `incs/makepdf.php`, `update/`.
Prozedurales `mysqli`. `$dbconn` wird zusätzlich in `$_SESSION["dbconn"]` abgelegt, damit `incs/mysql_ecape_wrapper.php` eine globale Funktion `mysql_escape_string()` als Shim über diese Verbindung bereitstellen kann — ein Überbleibsel der `mysql_*`-Ära, das in altem Code noch aufgerufen wird.
SQL wird durchgehend per String-Verkettung gebaut. Escaping ist Handarbeit über `mysqli_real_escape_string($dbconn, …)` und muss bei jeder Änderung mitgedacht werden.
+7 -179
View File
@@ -9,202 +9,30 @@ require('../smarty/libs/Smarty.class.php');
$smarty = new Smarty;
if(!isset($err))
{
$show = "";
if(isset($_POST["show_firmaanr"]))
$show .= str_pad($_POST["show_firmaanr"],1,"0");
else
$show .= "0";
if(isset($_POST["show_firma"]))
$show .= str_pad($_POST["show_firma"],1,"0");
else
$show .= "0";
if(isset($_POST["show_anr"]))
$show .= str_pad($_POST["show_anr"],1,"0");
else
$show .= "0";
if( isset($_POST["show_titel"]))
$show .= str_pad($_POST["show_titel"],1,"0");
else
$show .= "0";
if(isset($_POST["show_name"]))
$show .= str_pad($_POST["show_name"],1,"0");
else
$show .= "0";
if(isset($_POST["show_anr2"]))
$show .= str_pad($_POST["show_anr2"],1,"0");
else
$show .= "0";
if(isset($_POST["show_titel2"]))
$show .= str_pad($_POST["show_titel2"],1,"0");
else
$show .= "0";
if(isset($_POST["show_name2"]))
$show .= str_pad($_POST["show_name2"],1,"0");
else
$show .= "0";
if(isset($_POST["show_str"]))
$show .= str_pad($_POST["show_str"],1,"0");
else
$show .= "0";
if(isset($_POST["show_ort"]))
$show .= str_pad($_POST["show_ort"],1,"0");
else
$show .= "0";
if(isset($_POST["show_land"]))
$show .= str_pad($_POST["show_land"],1,"0");
else
$show .= "0";
if(isset($_POST["show_zusatz"]))
$show .= str_pad($_POST["show_zusatz"],1,"0");
else
$show .= "0";
if(isset($_POST["anr1"]))
$anr1 = trim($_POST["anr1"]);
else
$anr1 = "";
if(isset($_POST["anr2"]))
$anr2 = trim($_POST["anr2"]);
else
$anr2 = "";
if(isset($_POST["intro"]))
$intro = trim($_POST["intro"]);
else
$intro = "";
$adrerw = trim($_POST["adresserweiterung"]);
$outro = trim($_POST["outro"]);
$type = $_POST["type"];
$adressid = $_POST["adressid"];
$partnerid = $_POST["partnerid"];
$mwst = $_POST["mwst"];
$zahlziel = $_POST["zahlziel"];
$wahrung = $_POST["wahrung"];
if(isset($_POST["sub_mwst"]))
$sub_mwst = $_POST["sub_mwst"];
else
$sub_mwst = "";
$rabatt = $_POST["rabatt"];
$rabattdesc = $_POST["rabattdesc"];
$lieferdatum = $_POST["lieferdatum"];
$buchKto = $_POST["buchKto"];
$qry = mysqli_query($dbconn, "SELECT id FROM tmp_rechnung WHERE user_id = '".$_SESSION["user"]."' AND typ_id = '$type'") or $err=error("Fehler beim ermitteln der Rechnung <br />".mysqli_error($dbconn));
$progressid = mysqli_fetch_array($qry);
$progressid = $progressid[0];
if(!$progressid)
{
$qry = mysqli_query($dbconn, "INSERT INTO tmp_rechnung SET
user_id = '".$_SESSION["user"]."',
adressfields='$show',
anrede1='$anr1',
anrede2='$anr2',
intro='$intro',
outro='$outro',
typ_id = '$type',
adresse_id='$adressid',
partner_id='$partnerid',
mwst_id = '$mwst',
zahlziel_id = '$zahlziel',
wahrung_id='$wahrung',
sub_mwst='$sub_mwst',
rabatt='$rabatt',
rabattdesc='$rabattdesc',
adresserweiterung='$adrerw',
lieferdatum='$lieferdatum',
buchungsKto_id = '$buchKto',
datetime=NOW()") or $err=error("[autosave.js] Fehler beim erstellen der Rechnung <br />".mysqli_error($dbconn));
$progressid = mysqli_insert_id($dbconn);
}
// Entwurf speichern, alle Artikel (auch deaktivierte)
list($progressid, $fehler) = saveTmpRechnung($dbconn, false);
if($fehler)
$err = $fehler;
else
{
$qry = mysqli_query($dbconn, "UPDATE tmp_rechnung SET
user_id = '".$_SESSION["user"]."',
adressfields='$show',
anrede1='$anr1',
anrede2='$anr2',
intro='$intro',
outro='$outro',
typ_id = '$type',
adresse_id='$adressid',
partner_id='$partnerid',
mwst_id = '$mwst',
zahlziel_id = '$zahlziel',
wahrung_id='$wahrung',
sub_mwst='$sub_mwst',
rabatt='$rabatt',
rabattdesc='$rabattdesc',
lieferdatum='$lieferdatum',
adresserweiterung='$adrerw',
buchungsKto_id = '$buchKto',
datetime=NOW() WHERE id='$progressid'") or $err=error("Fehler beim aktualisieren der Rechnung <br />".mysqli_error($dbconn));
$qry = mysqli_query($dbconn, "DELETE FROM tmp_rechnung WHERE user_id = '".$_SESSION["user"]."' AND typ_id = '$type' AND id != '$progressid' LIMIT 1") or $err=error("Fehler beim löschen alter tmp Rechnungen <br />".mysqli_error($dbconn));
}
$qry= mysqli_query($dbconn, "SELECT id FROM tmp_artikel WHERE rech_id = '".$progressid."'");
while($res=mysqli_fetch_assoc($qry))
{
mysqli_query($dbconn, "DELETE FROM tmp_eigensch WHERE art_id = '".$res["id"]."'") or $err=error("Fehler beim löschen der eigenschaften <br />".mysqli_error($dbconn));
}
$qry = mysqli_query($dbconn, "DELETE FROM tmp_artikel WHERE rech_id = '".$progressid."'") or $err=error("Fehler beim löschen der Artikel <br />".mysqli_error($dbconn));
if(!isset($err))
{
$i = 1;
while($_POST["arthead".$i] && !isset($err))
{
$angtyp = trim($_POST["angtyp".$i]);
$arttyp = trim($_POST["arttyp".$i]);
$arthead = trim($_POST["arthead".$i]);
$artpr = str_replace(",",".",trim($_POST["artpr".$i]));
$artmen = str_replace(",",".",trim($_POST["artmen".$i]));
$artrab = trim($_POST["artrab".$i]);
if(!isset($_POST["artrabtyp".$i]))
$_POST["artrabtyp".$i] = "";
$artrabtyp = trim($_POST["artrabtyp".$i]);
$artmeneinh = trim($_POST["artmeneinh".$i]);
$artwa = trim($_POST["artwa".$i]);
$artmwst = trim($_POST["artmwst".$i]);
$pagebreak = trim($_POST["pagebreak".$i]);
$qry = mysqli_query($dbconn, "INSERT INTO tmp_artikel SET bezeichn='$arthead', preis='$artpr', mwst_id='$artmwst', pagebreak='$pagebreak', einheit_id='$artmeneinh', typ_id='$arttyp', datetime=NOW(), wanr='$artwa', rech_id='$progressid',posnr='$i',rabatt='$artrab',rabatttyp='$artrabtyp',menge='$artmen',angtyp='$angtyp'") or $err=error("Fehler beim anlegen der Artikel <br />".mysqli_error($dbconn));
$artid=mysqli_insert_id($dbconn);
$ii = 1;
while($_POST["arteig".$i."_".$ii] && !isset($err))
{
$arteig = trim($_POST["arteig".$i."_".$ii]);
$artval = trim($_POST["artval".$i."_".$ii]);
$arteinh = trim($_POST["arteinh".$i."_".$ii]);
$qry = mysqli_query($dbconn, "INSERT INTO tmp_eigensch SET bezeichn='$arteig', wert='$artval', einheit_id='$arteinh', datetime=NOW(), posnr='$ii', art_id='$artid'") or $err=error("Fehler beim anlegen der Eigenschaften <br />".mysqli_error($dbconn));
$eigid=mysqli_insert_id($dbconn);
$ii++;
}
$i++;
}
}
if(!isset($err))
{
$type = formularGanzzahl("type");
$adresse = makeadressblock($dbconn,$progressid,1);
$rechnung = makerechnungsarray($dbconn,$progressid,1);
$artikel = makeartikelarray($dbconn,$progressid,1);
if($adresse["lines"]>6)
error("Die Adresse hat zu viele Zeilen!<br />Bitte wählen Sie einige Elemente ab.");
if(!$_POST["show_ort"] || !$_POST["show_str"])
if(!formularText("show_ort") || !formularText("show_str"))
error("Die Adresse erscheint nicht vollständig auf der Rechnung!<br />Falls die Rechnung über den Postweg zugestellt werden soll muss die Adresse vervollständigt werden!");
if($rechnung["rabatt"] && !$rechnung["rabattdesc"])
warning("Ein Rabatt wird von der Gesamtsumme abgezogen, jedoch ist die Rabattbeschreibung leer!<br />Bitte geben Sie eine Rabattbeschreibung ein (z.B.: Sonderrabatt, Winterrabatt, etc.).");
if(!$artikel[0] && $type != 5)
if(empty($artikel) && $type != 5)
warning("Es sind noch keine Artikel vorhanden. Bitte Fügen Sie Artikel durch eintragen einer Artikelbeschreibung ein.");
if(!is_file("../".UPLOADS_PATH."signs/".$_SESSION["user"].".png"))
error("Für Ihren Benutzer wurde noch keine Unterschrift hinterlegt. Bitte vergessen Sie nicht zu unterschreiben.<br />("."./".UPLOADS_PATH."signs/".$_SESSION["user"].".png");
ok("<img src='' id='saveimg' class='saveimg' /><br />Dokument wurde um ".date("H:i:s")." Uhr gespeichert!");
}
}
?>
+6 -188
View File
@@ -10,203 +10,22 @@ require('../smarty/libs/Smarty.class.php');
$smarty = new Smarty;
if(!isset($err))
{
$show = "";
if(isset($_POST["show_firmaanr"]))
$show .= str_pad($_POST["show_firmaanr"],1,"0");
// Entwurf speichern, nur aktive Artikel, und daraus die Vorschau erzeugen
list($progressid, $fehler) = saveTmpRechnung($dbconn, true);
if($fehler)
$err = $fehler;
else
$show .= "0";
if(isset($_POST["show_firma"]))
$show .= str_pad($_POST["show_firma"],1,"0");
else
$show .= "0";
if(isset($_POST["show_anr"]))
$show .= str_pad($_POST["show_anr"],1,"0");
else
$show .= "0";
if( isset($_POST["show_titel"]))
$show .= str_pad($_POST["show_titel"],1,"0");
else
$show .= "0";
if(isset($_POST["show_name"]))
$show .= str_pad($_POST["show_name"],1,"0");
else
$show .= "0";
if(isset($_POST["show_anr2"]))
$show .= str_pad($_POST["show_anr2"],1,"0");
else
$show .= "0";
if(isset($_POST["show_titel2"]))
$show .= str_pad($_POST["show_titel2"],1,"0");
else
$show .= "0";
if(isset($_POST["show_name2"]))
$show .= str_pad($_POST["show_name2"],1,"0");
else
$show .= "0";
if(isset($_POST["show_str"]))
$show .= str_pad($_POST["show_str"],1,"0");
else
$show .= "0";
if(isset($_POST["show_ort"]))
$show .= str_pad($_POST["show_ort"],1,"0");
else
$show .= "0";
if(isset($_POST["show_land"]))
$show .= str_pad($_POST["show_land"],1,"0");
else
$show .= "0";
if(isset($_POST["show_zusatz"]))
$show .= str_pad($_POST["show_zusatz"],1,"0");
else
$show .= "0";
if(isset($_POST["anr1"]))
$anr1 = trim($_POST["anr1"]);
else
$anr1 = "";
if(isset($_POST["anr2"]))
$anr2 = trim($_POST["anr2"]);
else
$anr2 = "";
if(isset($_POST["intro"]))
$intro = trim($_POST["intro"]);
else
$intro = "";
$adrerw = trim($_POST["adresserweiterung"]);
$outro = trim($_POST["outro"]);
$type = $_POST["type"];
$adressid = $_POST["adressid"];
$partnerid = $_POST["partnerid"];
$mwst = $_POST["mwst"];
$zahlziel = $_POST["zahlziel"];
$wahrung = $_POST["wahrung"];
if(!isset($_POST["sub_mwst"]))
$_POST["sub_mwst"] = "";
$sub_mwst = $_POST["sub_mwst"];
$rabatt = $_POST["rabatt"];
$rabattdesc = $_POST["rabattdesc"];
$buchKto = $_POST["buchKto"];
$lieferdatum = $_POST["lieferdatum"];
$qry = mysqli_query($dbconn, "SELECT id FROM tmp_rechnung WHERE user_id = '".$_SESSION["user"]."' AND typ_id = '$type' LIMIT 1") or $err=error("Fehler beim ermitteln der Rechnung <br />".mysqli_error($dbconn));
$progressid = mysqli_fetch_array($qry);
$progressid = $progressid[0];
if(!$progressid)
{
$qry = mysqli_query($dbconn, "INSERT INTO tmp_rechnung SET
user_id = '".$_SESSION["user"]."',
adressfields='$show',
anrede1='$anr1',
anrede2='$anr2',
intro='$intro',
outro='$outro',
typ_id = '$type',
adresse_id='$adressid',
partner_id='$partnerid',
mwst_id = '$mwst',
zahlziel_id = '$zahlziel',
wahrung_id='$wahrung',
sub_mwst='$sub_mwst',
rabatt='$rabatt',
adresserweiterung='$adrerw',
rabattdesc='$rabattdesc',
buchungsKto_id = '$buchKto',
lieferdatum='$lieferdatum',
datetime=NOW()") or $err=error("Fehler beim erstellen der Rechnung <br />".mysqli_error($dbconn));
$progressid = mysqli_insert_id($dbconn);
}
else
{
$qry = mysqli_query($dbconn, "UPDATE tmp_rechnung SET
user_id = '".$_SESSION["user"]."',
adressfields='$show',
anrede1='$anr1',
anrede2='$anr2',
intro='$intro',
outro='$outro',
typ_id = '$type',
adresse_id='$adressid',
partner_id='$partnerid',
mwst_id = '$mwst',
zahlziel_id = '$zahlziel',
wahrung_id='$wahrung',
sub_mwst='$sub_mwst',
rabatt='$rabatt',
adresserweiterung='$adrerw',
rabattdesc='$rabattdesc',
buchungsKto_id = '$buchKto',
lieferdatum='$lieferdatum',
datetime=NOW() WHERE id='$progressid'") or $err=error("Fehler beim aktualisieren der Rechnung <br />".mysqli_error($dbconn));
$qry = mysqli_query($dbconn, "DELETE FROM tmp_rechnung WHERE user_id = '".$_SESSION["user"]."' AND typ_id = '$type' AND id != '$progressid' LIMIT 1") or $err=error("Fehler beim löschen alter tmp Rechnungen <br />".mysqli_error($dbconn));
}
$qry= mysqli_query($dbconn, "SELECT id FROM tmp_artikel WHERE rech_id = '".$progressid."'");
while($res=mysqli_fetch_assoc($qry))
{
mysqli_query($dbconn, "DELETE FROM tmp_eigensch WHERE art_id = '".$res["id"]."'") or $err=error("Fehler beim löschen der eigenschaften <br />".mysqli_error($dbconn));
}
$qry = mysqli_query($dbconn, "DELETE FROM tmp_artikel WHERE rech_id = '".$progressid."'") or $err=error("Fehler beim löschen der Artikel <br />".mysqli_error($dbconn));
if(!isset($err))
{
$i = 1;
while($_POST["arthead".$i] && !isset($err))
{
if($_POST["artact".$i])
{
$angtyp = trim($_POST["angtyp".$i]);
$arttyp = trim($_POST["arttyp".$i]);
$arthead = trim($_POST["arthead".$i]);
$artpr = str_replace(",",".",trim($_POST["artpr".$i]));
$artmen = str_replace(",",".",trim($_POST["artmen".$i]));
$artrab = trim($_POST["artrab".$i]);
if(!isset($_POST["artrabtyp".$i]))
$_POST["artrabtyp".$i] = "";
$artrabtyp = trim($_POST["artrabtyp".$i]);
$artmeneinh = trim($_POST["artmeneinh".$i]);
$artwa = trim($_POST["artwa".$i]);
$artmwst = trim($_POST["artmwst".$i]);
$pagebreak = trim($_POST["pagebreak".$i]);
$qry = mysqli_query($dbconn, "INSERT INTO tmp_artikel SET bezeichn='$arthead', preis='$artpr', mwst_id='$artmwst', pagebreak='$pagebreak', einheit_id='$artmeneinh', typ_id='$arttyp', datetime=NOW(), wanr='$artwa', rech_id='$progressid',posnr='$i',rabatt='$artrab',rabatttyp='$artrabtyp',menge='$artmen',angtyp='$angtyp'") or $err=error("Fehler beim anlegen der Artikel <br />".mysqli_error($dbconn));
$artid=mysqli_insert_id($dbconn);
$ii = 1;
while($_POST["arteig".$i."_".$ii] && !isset($err))
{
$arteig = trim($_POST["arteig".$i."_".$ii]);
$artval = trim($_POST["artval".$i."_".$ii]);
$arteinh = trim($_POST["arteinh".$i."_".$ii]);
$qry = mysqli_query($dbconn, "INSERT INTO tmp_eigensch SET bezeichn='$arteig', wert='$artval', einheit_id='$arteinh', datetime=NOW(), posnr='$ii', art_id='$artid'") or $err=error("Fehler beim anlegen der Eigenschaften <br />".mysqli_error($dbconn));
$eigid=mysqli_insert_id($dbconn);
$ii++;
}
}
$i++;
}
}
if(!isset($err))
{
$adresse = makeadressblock($dbconn,$progressid,1);
$rechnung = makerechnungsarray($dbconn,$progressid,1);
$artikel = makeartikelarray($dbconn,$progressid,1);
/*
if($adresse["lines"]>6)
error("Die Adresse hat zu viele Zeilen!<br />Bitte wählen Sie einige Elemente ab.");
if(!$_POST["show_ort"] || !$_POST["show_str"])
error("Die Adresse erscheint nicht vollständig auf der Rechnung!<br />Falls die Rechnung über den Postweg zugestellt werden soll muss die Adresse vervollständigt werden!");
if($rechnung["rabatt"] && !$rechnung["rabattdesc"])
warning("Ein Rabatt wird von der Gesamtsumme abgezogen, jedoch ist die Rabattbeschreibung leer!<br />Bitte geben Sie eine Rabattbeschreibung ein (z.B.: Sonderrabatt, Winterrabatt, etc.).");
if(!$artikel[0] && $type != 5)
warning("Es sind noch keine Artikel vorhanden. Bitte Fügen Sie Artikel durch eintragen einer Artikelbeschreibung ein.");
if(!is_file("../pics/users/".$_SESSION["user"].".png"))
error("Für Ihren Benutzer wurde noch keine Unterschrift hinterlegt. Bitte vergessen Sie nicht zu unterschreiben.");
*/
$pdf = makerawPDF(1);
makefirstpage($pdf,$adresse["adresse"],$rechnung,1);
$gesamtpreis = 0;
if(count($artikel))
{
$gesamtpreis = maketable($pdf,$artikel,$rechnung,1);
@@ -217,6 +36,5 @@ if(!isset($err))
savePDF($pdf,"../temp/pdfpreview/$tmppdfname.pdf");
echo makeImageFromPDF("../temp/pdfpreview/$tmppdfname.pdf");
}
}
?>
+13 -13
View File
@@ -18,24 +18,25 @@ if(!isset($err))
}
$fulltag = utf8_encode($_GET["search"]);
$src = explode(" ",$fulltag);
$combiner = mysql_escape_string($_GET["link"]);
$combiner = $_GET["link"];
if($combiner != "AND" && $combiner != "OR")
{
$combiner = "AND";
}
$page = $_GET["page"];
$skspage = $_GET["skspage"];
$typ = $_GET["typ"];
$id = $_GET["kdnid"];
$page = (int)$_GET["page"];
$skspage = (int)$_GET["skspage"];
// landen auch in JavaScript-Aufrufen der Seitennavigation
$typ = (int)$_GET["typ"];
$id = (int)$_GET["kdnid"];
$queries = createKdnRechQry($page,$pagesize,$src,$combiner,$id,$typ,0);
$qry = mysqli_query($dbconn,$queries["all"])
$qry = db_abfrage($dbconn,$queries["all"],$queries["params"])
or die("Datenbank fehler: ".mysqli_error($dbconn));
$numres = mysqli_num_rows($qry);
/*
if(!$numres)
{
$queries = createKdnRechQry($page,$pagesize,$src,$combiner,1);
$qry = mysqli_query($dbconn,$queries["all"])
$qry = db_abfrage($dbconn,$queries["all"],$queries["params"])
or die("Datenbank fehler: ".mysqli_error($dbconn));
$numres = mysqli_num_rows($qry);
message("veraltete Datensätze wurden in die Suche einbezogen");
@@ -44,7 +45,7 @@ if(!isset($err))
if($numres)
{
$listlines=array();
$qry = mysqli_query($dbconn,$queries["limited"])
$qry = db_abfrage($dbconn,$queries["limited"],$queries["params"])
or die("Datenbank fehler: ".mysqli_error($dbconn));
while($res=mysqli_fetch_assoc($qry))
{
@@ -53,8 +54,7 @@ if(!isset($err))
$actions .= "<a href='?action=rechnungadd&id=".$res["id"]."&adressid=".$res["adresse_id"]."'><span class='edit' title='Dokument ändern'></span></a>";
$actions .= "<a href='?action=rechnungadd&id=".$res["id"]."&adressid=".$res["adresse_id"]."&changeadr=1'><span class='changeadr' title='Adresse ändern'></span></a>";
$actions .= "<a href='?action=rechnungadd&id=".$res["id"]."&adressid=".$res["adresse_id"]."&copy=1'><span class='copy' title='Dokument kopieren'></span></a>";
$tmpqry = mysqli_query($dbconn,"SELECT id FROM kontakt WHERE partner_id = '$id' AND typ_id = 1");
if(mysqli_fetch_array($tmpqry))
if(db_wert($dbconn, "SELECT id FROM kontakt WHERE partner_id = ? AND typ_id = 1 LIMIT 1", array($id)))
$actions .= "<a href='?action=rechnungadd&id=".$res["id"]."&adressid=".$res["adresse_id"]."&mail=1'><span class='mail' title='Dokument per E-Mail versenden'></span></a>";
switch($res["typ_id"])
@@ -128,14 +128,14 @@ if(!isset($err))
echo "<h3>SKS Dokumente:</h3><div class='line'></div>";
$queries="";
$queries = createKdnRechQry($skspage,$pagesize,$src,$combiner,$id,$typ,1);
$qry = mysqli_query($dbconn,$queries["all"])
$qry = db_abfrage($dbconn,$queries["all"],$queries["params"])
or die("Datenbank fehler: ".mysqli_error($dbconn));
$numres = mysqli_num_rows($qry);
/*
if(!$numres)
{
$queries = createKdnRechQry($page,$pagesize,$src,$combiner,1);
$qry = mysqli_query($dbconn,$queries["all"])
$qry = db_abfrage($dbconn,$queries["all"],$queries["params"])
or die("Datenbank fehler: ".mysqli_error($dbconn));
$numres = mysqli_num_rows($qry);
message("veraltete Datensätze wurden in die Suche einbezogen");
@@ -145,7 +145,7 @@ if(!isset($err))
{
$speciallines[]=array();
$listlines[]=array();
$qry = mysqli_query($dbconn,$queries["limited"])
$qry = db_abfrage($dbconn,$queries["limited"],$queries["params"])
or die("Datenbank fehler: ".mysqli_error($dbconn));
while($res=mysqli_fetch_assoc($qry))
{
+9 -9
View File
@@ -24,24 +24,24 @@ if(!isset($err))
}
$fulltag = utf8_encode($_GET["search"]);
$src = explode(" ",$fulltag);
$combiner = mysql_escape_string($_GET["link"]);
$combiner = $_GET["link"];
if($combiner != "AND" && $combiner != "OR")
{
$combiner = "AND";
}
$page = $_GET["page"];
$skspage = $_GET["skspage"];
$page = (int)$_GET["page"];
$skspage = (int)$_GET["skspage"];
$typ = $_GET["typ"];
$id = $_GET["kdnid"];
$queries = createRechQry($page,$pagesize,$src,$combiner,0);
$qry = mysqli_query($dbconn,$queries["all"])
$qry = db_abfrage($dbconn,$queries["all"],$queries["params"])
or die("Datenbank fehler: ".mysqli_error($dbconn));
$numres = mysqli_num_rows($qry);
/*
if(!$numres)
{
$queries = createKdnRechQry($page,$pagesize,$src,$combiner,1);
$qry = mysqli_query($dbconn,$queries["all"])
$qry = db_abfrage($dbconn,$queries["all"],$queries["params"])
or die("Datenbank fehler: ".mysqli_error($dbconn));
$numres = mysqli_num_rows($qry);
message("veraltete Datensätze wurden in die Suche einbezogen");
@@ -49,7 +49,7 @@ if(!isset($err))
*/
if($numres)
{
$qry = mysqli_query($dbconn,$queries["limited"])
$qry = db_abfrage($dbconn,$queries["limited"],$queries["params"])
or die("Datenbank fehler: ".mysqli_error($dbconn));
while($res=mysqli_fetch_assoc($qry))
{
@@ -122,14 +122,14 @@ if(!isset($err))
{
echo "<h3>SKS Dokumente:</h3><div class='line'></div>";
$queries = createRechQry($skspage,$pagesize,$src,$combiner,1);
$qry = mysqli_query($dbconn,$queries["all"])
$qry = db_abfrage($dbconn,$queries["all"],$queries["params"])
or die("Datenbank fehler: ".mysqli_error($dbconn));
$numres = mysqli_num_rows($qry);
/*
if(!$numres)
{
$queries = createKdnRechQry($page,$pagesize,$src,$combiner,1);
$qry = mysqli_query($dbconn,$queries["all"])
$qry = db_abfrage($dbconn,$queries["all"],$queries["params"])
or die("Datenbank fehler: ".mysqli_error($dbconn));
$numres = mysqli_num_rows($qry);
message("veraltete Datensätze wurden in die Suche einbezogen");
@@ -137,7 +137,7 @@ if(!isset($err))
*/
if($numres)
{
$qry = mysqli_query($dbconn,$queries["limited"]);
$qry = db_abfrage($dbconn,$queries["limited"],$queries["params"]);
while($res=mysqli_fetch_assoc($qry))
{
$speciallines[] = array("<a href='?action=rechshow&id=".$res["id"]."'>".$res["rechnr"]."</a>",
+54 -3
View File
@@ -44,19 +44,36 @@ function db_verbinden($server, $user, $pw, $db)
/*
* Führt eine Abfrage mit ?-Platzhaltern aus. Gibt bei SELECT ein
* mysqli_result zurück, sonst true, bei Fehlern false.
*
* Achtung: Prepared Statements liefern Zahlen als int/float, mysqli_query()
* lieferte Strings. db_zeilen(), db_zeile(), db_wert() und db_zuordnung()
* wandeln deshalb in Strings um, damit sich alter Code (=== "0", "1" etc.)
* gleich verhält. Wer das Ergebnis von db_abfrage() selbst ausliest, bekommt
* die nativen Typen.
*/
function db_abfrage($dbconn, $sql, $params = array())
{
return mysqli_execute_query($dbconn, $sql, array_values($params));
}
/* Werte einer Zeile als Strings wie bei mysqli_query(), NULL bleibt NULL */
function db_als_text($zeile)
{
if(!is_array($zeile))
return $zeile;
foreach($zeile as $spalte => $wert)
if($wert !== null && !is_string($wert))
$zeile[$spalte] = (string)$wert;
return $zeile;
}
/* Alle Zeilen als Liste assoziativer Arrays, bei Fehlern false. */
function db_zeilen($dbconn, $sql, $params = array())
{
$res = db_abfrage($dbconn, $sql, $params);
if(!$res)
return false;
return mysqli_fetch_all($res, MYSQLI_ASSOC);
return array_map("db_als_text", mysqli_fetch_all($res, MYSQLI_ASSOC));
}
/* Erste Zeile als assoziatives Array, null ohne Treffer, bei Fehlern false. */
@@ -65,7 +82,41 @@ function db_zeile($dbconn, $sql, $params = array())
$res = db_abfrage($dbconn, $sql, $params);
if(!$res)
return false;
return mysqli_fetch_assoc($res);
return db_als_text(mysqli_fetch_assoc($res));
}
/*
* Zwei Spalten als Zuordnung erste => zweite, etwa für Auswahllisten
* (SELECT id, anrede FROM anrede). Bei Fehlern false.
*/
function db_zuordnung($dbconn, $sql, $params = array())
{
$res = db_abfrage($dbconn, $sql, $params);
if(!$res)
return false;
$zuordnung = array();
while($zeile = mysqli_fetch_row($res))
$zuordnung[$zeile[0]] = $zeile[1] === null ? null : (string)$zeile[1];
return $zuordnung;
}
/*
* Die Abfrage mit eingesetzten Werten als lesbarer Text - ausschließlich für
* das Änderungsprotokoll (Tabelle log). Nie ausführen.
*/
function db_sql_text($dbconn, $sql, $params = array())
{
$teile = explode("?", $sql);
$text = array_shift($teile);
foreach(array_values($params) as $i => $wert)
{
if($wert === null)
$text .= "NULL";
else
$text .= "'".mysqli_real_escape_string($dbconn, (string)$wert)."'";
$text .= isset($teile[$i]) ? $teile[$i] : "";
}
return $text;
}
/* Erste Spalte der ersten Zeile, null ohne Treffer, bei Fehlern false. */
@@ -75,5 +126,5 @@ function db_wert($dbconn, $sql, $params = array())
if(!$res)
return false;
$zeile = mysqli_fetch_row($res);
return $zeile === null ? null : $zeile[0];
return $zeile === null || $zeile[0] === null ? null : (string)$zeile[0];
}
+31 -16
View File
@@ -180,12 +180,16 @@ function createAdressQry($page,$pagesize,$src,$combiner,$fields,$full=0,$typ=1)
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)
{
if($typ == 1)
$docnr = "rechnr";
else
$docnr = "rechnr";
$combiner = $combiner == "OR" ? "OR" : "AND";
$params = array($id, $typ);
if(!$sks)
{
$query = "SELECT rechnung.$docnr AS rechnr,
@@ -199,11 +203,12 @@ function createKdnRechQry($page,$pagesize,$src,$combiner,$id,$typ,$sks=0)
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='".$id."' AND rechtyp.id = '".$typ."' AND rechnung.sks = 0 ";
WHERE partner_id = ? AND rechtyp.id = ? AND rechnung.sks = 0 ";
foreach($src AS $tag)
{
$tag .= "%";
$query .= " $combiner (artikel.bezeichn LIKE '$tag' OR rechnung.rechnr LIKE '$tag' OR DATE_FORMAT(rechnung.datetime, '%d.%m.%Y') LIKE '$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
@@ -217,19 +222,21 @@ function createKdnRechQry($page,$pagesize,$src,$combiner,$id,$typ,$sks=0)
FROM rechnung
LEFT JOIN rechtyp ON rechnung.typ_id = rechtyp.id
RIGHT JOIN artikelsks ON rechnung.rechnr = artikelsks.rechnr
WHERE partner_id='".$id."' AND rechtyp.id = '".$typ."' AND rechnung.sks = 1 ";
WHERE partner_id = ? AND rechtyp.id = ? AND rechnung.sks = 1 ";
foreach($src AS $tag)
{
$tag .= "%";
$query .= " $combiner (artikelsks.bezeichn1 LIKE '$tag' OR artikelsks.bezeichn2 LIKE '$tag' OR rechnung.rechnr LIKE '$tag' OR DATE_FORMAT(rechnung.datetime, '%d.%m.%Y') LIKE '$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 ".$page*$pagesize.", $pagesize";
$query .= " LIMIT ".((int)$page*(int)$pagesize).", ".(int)$pagesize;
$ret["limited"] = $query;
$ret["params"] = $params;
return $ret;
}
@@ -283,9 +290,14 @@ function createKommQry($page,$pagesize,$src,$combiner,$id)
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,
@@ -304,9 +316,10 @@ function createRechQry($page,$pagesize,$src,$combiner,$sks=0)
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (artikel.bezeichn LIKE '$tag' 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 '$tag' OR
DATE_FORMAT(rechnung.datetime, '%d.%m.%Y') LIKE '$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
@@ -326,18 +339,20 @@ function createRechQry($page,$pagesize,$src,$combiner,$sks=0)
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (artikelsks.bezeichn1 LIKE '$tag' OR
artikelsks.bezeichn2 LIKE '$tag' OR
rechnung.rechnr LIKE '$tag' OR
DATE_FORMAT(rechnung.datetime, '%d.%m.%Y') LIKE '$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 ".$page*$pagesize.", $pagesize";
$query .= " LIMIT ".((int)$page*(int)$pagesize).", ".(int)$pagesize;
$ret["limited"] = $query;
$ret["params"] = $params;
return $ret;
}
+426 -626
View File
File diff suppressed because it is too large Load Diff
+12 -10
View File
@@ -1,18 +1,20 @@
<?php
// LOG
/*
* Änderungsprotokoll. $qrystr und $undoqry sind reiner Text zur
* Nachvollziehbarkeit (siehe db_sql_text()), sie werden nie ausgeführt.
* $type ist ein Eintrag aus accesstype ("anlegen", "ändern", "löschen").
*/
function saveLog($dbconn,$qrystr,$undoqry,$type)
{
$qry=mysqli_query($dbconn,"SELECT id FROM accesstype WHERE typ = '$type'") or $err=error("Fehler beim Eintragen der Aktion in die LOG:<br />".mysqli_error($dbconn));
$res=mysqli_fetch_array($qry);
$qry=mysqli_query($dbconn,"INSERT INTO log SET
typ_id= '$res[0]',
datetime=NOW(),
qry='".mysql_escape_string($qrystr)."',
undo_qry='".mysql_escape_string($undoqry)."',
user_id='".mysql_escape_string($_SESSION["user"])."'")
or $err=error("Fehler beim LOGGEN der Aktion:<br />".mysqli_error($dbconn));
$err = 0;
$typId = db_wert($dbconn, "SELECT id FROM accesstype WHERE typ = ?", array($type));
if($typId === false)
return error("Fehler beim Eintragen der Aktion in die LOG:<br />".mysqli_error($dbconn));
db_abfrage($dbconn, "INSERT INTO log SET typ_id = ?, datetime = NOW(), qry = ?, undo_qry = ?, user_id = ?",
array((int)$typId, $qrystr, $undoqry, $_SESSION["user"]))
or $err = error("Fehler beim LOGGEN der Aktion:<br />".mysqli_error($dbconn));
return $err;
}
+37 -126
View File
@@ -42,58 +42,25 @@ elseif($_GET["copy"] == 1 && $_GET["id"])
doneNreturn("Erfolgreich geändert");
}
}
elseif($_GET["storno"] == "YES" && $_GET["id"]){
$querystr = "UPDATE rechnung SET
storno = 1, stornodate = NOW() WHERE id = '".$_GET["id"]."'";
mysqli_query($dbconn,$querystr) or $err=error("Fehler beim aktualisieren der Rechnung<br />".mysqli_error($dbconn));
doneNreturn("Erfolgreich geändert");
}
elseif($_GET["storno"] == "NO" && $_GET["id"]){
$querystr = "UPDATE rechnung SET
storno = 0 WHERE id = '".$_GET["id"]."'";
mysqli_query($dbconn,$querystr) or $err=error("Fehler beim aktualisieren der Rechnung<br />".mysqli_error($dbconn));
elseif(($_GET["storno"] == "YES" || $_GET["storno"] == "NO") && $_GET["id"]){
$err = stornoRechnung($dbconn, $_GET["id"], $_GET["storno"] == "YES");
if(!$err)
doneNreturn("Erfolgreich geändert");
}
elseif($_GET["mail"] == 1 && $_GET["id"])
{
$kdnres=makeadressarray($dbconn, $_GET["adressid"]);
$typnames=array();
$qry=mysqli_query($dbconn, "SELECT id,anrede FROM anrede");
while($res=mysqli_fetch_assoc($qry))
{
$typnames[$res["id"]] = $res["anrede"];
}
$smarty->assign("anrs",$typnames);
list($anrs, $titels) = anredenUndTitel($dbconn);
$smarty->assign("anrs",$anrs);
$smarty->assign("titels",$titels);
$typnames=array();
$qry=mysqli_query($dbconn, "SELECT id,titel FROM titel");
while($res=mysqli_fetch_assoc($qry))
{
$typnames[$res["id"]] = $res["titel"];
}
$smarty->assign("titels",$typnames);
$mails = db_zuordnung($dbconn, "SELECT id, kontakt FROM kontakt WHERE partner_id = ? AND typ_id = 1", array($kdnres["partner_id"] ?? 0)) ?: array();
$smarty->assign("mails",array_values($mails));
$smarty->assign("mailids",array_keys($mails));
$mails=array();
$mailids=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($kdnres["partner_id"])."' AND typ_id = 1");
while($res=mysqli_fetch_assoc($qry))
{
$mails[] = $res["kontakt"];
$mailids[] = $res["id"];
}
$smarty->assign("mails",$mails);
$smarty->assign("mailids",$mailids);
$typids=array();
$typnames=array();
$qry=mysqli_query($dbconn, "SELECT id,bezeichn FROM artikeltyp");
while($res=mysqli_fetch_assoc($qry))
{
$typids[] = $res["id"];
$typnames[] = $res["bezeichn"];
}
$smarty->assign("typids",$typids);
$smarty->assign("typs",$typnames);
$typen = db_zuordnung($dbconn, "SELECT id, bezeichn FROM artikeltyp") ?: array();
$smarty->assign("typids",array_keys($typen));
$smarty->assign("typs",array_values($typen));
$rechnung=makerechnungsarray($dbconn, $_GET["id"], 0);
$smarty->assign("rechnung",$rechnung);
$smarty->assign("adresse",$kdnres);
@@ -197,72 +164,29 @@ else
if($kdnres["adresstyp"] == "Kommission")
{
$smarty->assign("kommission",$kdnres);
$qry = mysqli_query($dbconn,"SELECT plz, ortsteil, ort, str, adresstyp.typ AS adresstyp, hnr, vname, partner_id, nname, vname2, nname2, firma, adresse.id, land, anrede_id, titel_id, anrede2_id, titel2_id
FROM adresse
LEFT JOIN strasse ON str_id = strasse.id
LEFT JOIN ort ON ort_id = ort.id
LEFT JOIN land ON land_id = land.id
JOIN adresstyp ON adresse.typ_id = adresstyp.id
WHERE adresse.typ_id='1' AND adresse.partner_id = '".$kdnres["partner_id"]."'
ORDER BY typ_id ASC") or $err = error("Fehler beim abrufen der Daten ".mysqli_error($dbconn));
//$kdnres=mysqli_fetch_assoc($qry);
}
if($kdnres["partner_id"])
{
$typnames=array();
$qry=mysqli_query($dbconn, "SELECT id,anrede FROM anrede");
while($res=mysqli_fetch_assoc($qry))
{
$typnames[$res["id"]] = $res["anrede"];
}
$smarty->assign("anrs",$typnames);
list($anrs, $titels) = anredenUndTitel($dbconn);
$smarty->assign("anrs",$anrs);
$smarty->assign("titels",$titels);
$typnames=array();
$qry=mysqli_query($dbconn, "SELECT id,titel FROM titel");
while($res=mysqli_fetch_assoc($qry))
{
$typnames[$res["id"]] = $res["titel"];
}
$smarty->assign("titels",$typnames);
$liste = db_zuordnung($dbconn, "SELECT id, bezeichn FROM artikeltyp") ?: array();
$smarty->assign("typids",array_keys($liste));
$smarty->assign("typs",array_values($liste));
$liste = db_zuordnung($dbconn, "SELECT id, einheit FROM einheit") ?: array();
$smarty->assign("einhids",array_keys($liste));
$smarty->assign("einhs",array_values($liste));
$liste = db_zuordnung($dbconn, "SELECT id, wahrung FROM wahrung") ?: array();
$smarty->assign("wahrids",array_keys($liste));
$smarty->assign("wahrs",array_values($liste));
$typids=array();
$typnames=array();
$qry=mysqli_query($dbconn, "SELECT id,bezeichn FROM artikeltyp");
while($res=mysqli_fetch_assoc($qry))
{
$typids[] = $res["id"];
$typnames[] = $res["bezeichn"];
}
$smarty->assign("typids",$typids);
$smarty->assign("typs",$typnames);
$typids=array();
$typnames=array();
$qry=mysqli_query($dbconn, "SELECT id,einheit FROM einheit");
while($res=mysqli_fetch_assoc($qry))
{
$typids[] = $res["id"];
$typnames[] = $res["einheit"];
}
$smarty->assign("einhids",$typids);
$smarty->assign("einhs",$typnames);
$typids=array();
$typnames=array();
$qry=mysqli_query($dbconn, "SELECT id,wahrung FROM wahrung");
while($res=mysqli_fetch_assoc($qry))
{
$typids[] = $res["id"];
$typnames[] = $res["wahrung"];
}
$smarty->assign("wahrids",$typids);
$smarty->assign("wahrs",$typnames);
$typids=array();
$typnames=array();
$qry=mysqli_query($dbconn, "SELECT id,mwst FROM mwst");
while($res=mysqli_fetch_assoc($qry))
foreach(db_zeilen($dbconn, "SELECT id, mwst FROM mwst") ?: array() as $res)
{
if($res["mwst"] != "999")
{
@@ -283,31 +207,18 @@ else
$smarty->assign("artmwstids",$typids2);
$smarty->assign("artmwsts",$typnames2);
$typids=array();
$typnames=array();
$qry=mysqli_query($dbconn, "SELECT id,ziel FROM zahlziel");
while($res=mysqli_fetch_assoc($qry))
{
$typids[] = $res["id"];
$typnames[] = $res["ziel"];
}
$smarty->assign("zzielids",$typids);
$smarty->assign("zziels",$typnames);
$liste = db_zuordnung($dbconn, "SELECT id, ziel FROM zahlziel") ?: array();
$smarty->assign("zzielids",array_keys($liste));
$smarty->assign("zziels",array_values($liste));
$typids=array();
$typnames=array();
$qry=mysqli_query($dbconn, "SELECT id,kto,name FROM buchungsKontos");
while($res=mysqli_fetch_assoc($qry))
{
$typids[] = $res["id"];
$liste = db_zuordnung($dbconn, "SELECT id, CONCAT(kto, ' (', name, ')') FROM buchungsKontos") ?: array();
$smarty->assign("buchKtoids",array_keys($liste));
$smarty->assign("buchKtos",array_values($liste));
$typnames[] = $res["kto"]." (".$res["name"].")";
}
$smarty->assign("buchKtoids",$typids);
$smarty->assign("buchKtos",$typnames);
$qry=mysqli_query($dbconn,"SELECT tmp_rechnung.id,adresse_id, vname, nname, str, hnr FROM tmp_rechnung JOIN adresse ON adresse_id = adresse.id JOIN strasse ON str_id = strasse.id WHERE tmp_rechnung.typ_id='".mysql_escape_string($_GET["type"])."' AND user_id = '".mysql_escape_string($_SESSION["user"])."' ORDER BY datetime DESC LIMIT 1") or $err=error("Fehler beim Suchen nach nicht gespeicherten Daten<br />".mysqli_error($dbconn));
if($res = mysqli_fetch_assoc($qry))
$res = db_zeile($dbconn, "SELECT tmp_rechnung.id, adresse_id, vname, nname, str, hnr FROM tmp_rechnung JOIN adresse ON adresse_id = adresse.id JOIN strasse ON str_id = strasse.id WHERE tmp_rechnung.typ_id = ? AND user_id = ? ORDER BY datetime DESC LIMIT 1", array((string)$_GET["type"], $_SESSION["user"]));
if($res === false)
$err = error("Fehler beim Suchen nach nicht gespeicherten Daten<br />".mysqli_error($dbconn));
if($res)
{
$smarty->assign("draft",$res["id"]);
$smarty->assign("draftname",$res["vname"]." ".$res["nname"]);
+3 -15
View File
@@ -6,21 +6,9 @@ $kdnres=makeadressarray($dbconn, $_GET["adressid"]);
if($kdnres["partner_id"])
{
$kdnres["adressid"] = $_GET["adressid"];
$typnames=array();
$qry=mysqli_query($dbconn, "SELECT id,anrede FROM anrede");
while($res=mysqli_fetch_assoc($qry))
{
$typnames[$res["id"]] = $res["anrede"];
}
$smarty->assign("anrs",$typnames);
$typnames=array();
$qry=mysqli_query($dbconn, "SELECT id,titel FROM titel");
while($res=mysqli_fetch_assoc($qry))
{
$typnames[$res["id"]] = $res["titel"];
}
$smarty->assign("titels",$typnames);
list($anrs, $titels) = anredenUndTitel($dbconn);
$smarty->assign("anrs",$anrs);
$smarty->assign("titels",$titels);
$smarty->assign("adresse",$kdnres);
$smarty->display("umschlagshow.tpl");