_make_record(_item): Zahlenattribute nicht mit leeren Strings setzen
authorMoritz Bunkus <m.bunkus@linet-services.de>
Fri, 15 Sep 2017 12:35:16 +0000 (14:35 +0200)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Fri, 28 Feb 2020 12:43:07 +0000 (13:43 +0100)
commit2ae70bd488265cab4a7cef8243b3660f7d35e83e
tree99ae5b98e937d8599da0784a2f7db9b5acf4a905
parent63cb5b41d9b06d0b7f522ef154dd9f57ea428bae
_make_record(_item): Zahlenattribute nicht mit leeren Strings setzen

Wir übergeben diverse Zahlenfelder als hidden inputs, ohne dass wir
prüfen, ob die überhaupt gesetzt sind:

1. Im Aufruf 1 ist z.B. `$::form->{customer_id} = undef`, oder es gibt
   sogar nicht mal ein `$::form->{customer_id}`.
2. Dies wird ohne Prüfung auf den tatsächlichen Wert als Hidden
   ausgegeben, und endet damit als `<input type="hidden"
   name="customer_id" value="">`.
3. In Aufruf 2 kommt das dann als `$::form->{customer_id} = ''` an,
   also als leerer String, egal, ob der Wert vorher `undef`, ein
   leerer String war oder gar nicht existiert hat.

Wenn man nun, wie `_make_record_item`, über alle Schlüssel aus
`$::form` iteriert, und die korrespondierenden
Attributs-Setter-Funktionen einer RDBO-Instanz mit ihnen aufruft, so
werden somit Zahlen-Setter-Funktionen mit leeren Strings
aufgerufen. Das sorgt dafür, dass später bei einem Aufruf von
`$invoice->customer` versucht wird, ein Customer-Objekt aus der DB zu
laden (da ja durch den Aufruf von `…->customer_id(…)`, also das Setzen
des Relationship-Attributs, signalisiert wurde, dass die Relationship
aktiv ist).

Allerdings ist der Wert des Primärschlüsselattributes nun der leere
String, also im Perl-Sinne `false`. Das wiederum wertet Rose als
Versuch, ein Objekt ohne Angabe eines Primärschlüsselattributs zu
laden, was wiederum zu einer Fehlermeldung führt.

Kurz: Zahlenattribute aus RDBO-Instanzen dürfen gar nicht erst auf
leere Strings gesetzt werden. Sie dürfen nur gesetzt werden, wenn sie
auch tatsächliche Zahlenwerte enthalten sollen.

Fix #57.
bin/mozilla/io.pl