dedlfix: Mehrere Arrays in PHP übergeben / Rechnungsposten (automatisiert) einfügen

Beitrag lesen

Tach!

  1. Kann ich mehrere Items/Rechnungspositionen in einem MySQL-Feld speichern?

Kannst du, macht man aber nicht. Du hast da eine schöne Datenbank, kannst aber ihre Eigenschaften nicht nutzen, wenn du die Daten so "komprimiert" in ihr ablegst. Warum legst du die Eigenschaften eines Rechnungspostens nicht separat in Felder und jeden Posten in einem eigenen Datensatz ab?

Bin ich da mit einem Delimiter mit Implode/Explode und den Arrays dazwischen auf dem richtigen Weg?

Ganz und gar nicht. Selbst wenn du das unbedingt so ablegen möchtest, schachtelt man das lieber Arrays in einem Array und komprimiert das ganze Gebilde. Der Nachteil an eigenen Separatoren ist, dass diese nicht mehr in den Daten vorkommen dürfen. Oder du musst dir was ausdenken, dass es da keine Konflikte gibt. Aber wie gesagt, die ganze Vorgehensweise ist überhaupt nicht empfehlenswert.

  1. Wie kann ich in der invoice.php die Anzahl der eingetragenen Items bestimmen wenn wenn ich bspw. mit Javascript bis zu 10 Artikeleingabefelder auf der invoicing.php abbilden würde?
<input type='text' name='nameitem1' size='55'>
<input type='text' name='countitem1' size='10'>
<input type='text' name='priceitem1' size='10'>

DRY! Don't repeat yourself! Wenn du an einem Feld etwas ändern möchtest, machst du das x-mal. Für sich wiederholende Dinge hat man Schleifen erfunden. Und Arrays statt einzelner Variablen.

PHP kann mit der Schreibweise ding[] als Feldname umgehen und erzeugt ein Array. Dabei kann man auch den Schlüssel vorgeben ding[key]. Damit kann man dann in einer Schleife die Namen wie folgt vergeben: item[$i][name], item[$i][count], item[$i][price]. Das $i ist deine Schleifenvariable, da muss dann am Ende je Datensatz eine Zahl von 0 bis x drin stehen.

Und nun schau dir an, was PHP daraus macht. (Vorher ein <pre> ausgeben oder in den Seitenquelltext schauen erhöht die Lesbarkeit): print_r($_POST);

  if($_POST['countitem1'] > 0 [...]){
    $Item1count = $_POST['countitem1'];
    $Item1price = $_POST['priceitem1'];
    $Item1 = serialize(array($Item1name, $Item1count, $Item1price));
}

Statt hier wieder Wiederholungen eine Schleife:

foreach ($_POST['item'] as $item) {
    ... serialize($item);
}

Also vorausgesetzt, du willst unbedingt an dem Serialisieren festhalten. Theoretisch könntest du nun auch gleich mit serialize($_POST['item']) alles in einem Rutsch erledigen, aber du willst sicher die leeren Felder ausklammern. Also würde man die nichtleeren Items erstmal in ein anderes Array legen und am Ende dieses serialisieren.

$SaveInvoiceDetailQuery = "INSERT INTO invoices (offerid, item1, item2, item3, item4, address) VALUES  ('$OfferID',  '$Item1', '$Item2', '$Item3', '$Item4', '$CustomerString')";

Du hast da ernsthaft einen Datensatz für jeweils bis zu 4 Posten? Nee, mach das weg. Die Wünsche kommen später noch hinzu, da ist ein solches Format, bei dem gleichartige Daten sowohl nebeneinander (in Felder) als auch untereinander (in Zeilen) zu legen kommen ganz ungünstig. Zusätzlich ungünstig zum Serialisieren. Die Rechnung ist bei jedem 4er-Set auch noch mal extra abgelegt?

Und ganz wichtig ist auch noch der unberücksichtigte Kontextwechsel. Das ist eine der häufigsten Ursachen, warum Unternehmen mit ausnutzbaren Sicherheitslücken in den Nachrichten erwähnt werden. Und warum solche Comics gezeichnet werden: Exploits of a Mom.

dedlfix.