Linuchs: Feld auf NULL setzen wirkt wie unset

Moin,

in der Datenbank habe ich Felder, die NULL sein können. Wenn so ein Feld aus der Form kommt, ist es leer, aber sehr wohl gesetzt (isset).

Damit es in der Datenbank zu NULL wird, setze ich es beim Dateneingang auf NULL:

$row = [
 'uhr_bis' =>( $_POST['uhr_bis'] ) ? hm2h_m( trim( $_POST['uhr_bis'] )) : NULL
...
];

Beim Update durchlaufe ich alle Felder $col der Tabelle und ändere sie nur, wenn dieses Feld in $_POST und in $row vorkommt. Sinn: Ich kann dieselbe UPDATE-Routine in verschiedenen forms verwenden, die unterschiedliche Felder behandeln.

if ( isset ( $_POST[ $col['Field'] ] )
&& isset( $row[ $col['Field'] ] )
&& $col['Field'] != "id" ) {
  $q .= "," . $col['Field']
  . substr( $leer, 0, (25 - strlen( $col['Field'] )))
  . " = "
  . (( is_null ( $row[ $col['Field'] ] )) ? 'NULL' : "'"
  .  addslashes( $row[ $col['Field'] ] ) . "'" ) . "\n";
}

Nun kann ich ein Feld deshalb nicht auf NULL löschen, weil das isset durch den Wert NULL zurückgenommen wurde.

Dafür ist aber das Kommando unset vorgesehen. Ist das ein Bug von PHP?

Gruß, Linuchs

  1. Trick:

    Eingangsprüfung: Gebe leeren Feldern, die in der DB NULL sein dürfen, zunächst den Wert *NULL*. Den setze ihn in der UPDATE-Routine auf NULL.

    Aber die Frage bleibt: Ist das ein Bug in PHP?

    1. Hallo Linuchs,

      das ist Trick 17 mit Selbstüberlistung. Nicht machen.

      Rolf

      --
      sumpsi - posui - obstruxi
  2. Hallo Linuchs,

    $col['Field'] . substr( $leer, 0, (25 - strlen( $col['Field'] )))

    Brrr. Du könntest str_pad($col['Field'], 25) verwenden. Füllen nach rechts, mit Spaces, ist Default. Seit PHP 4 verfügbar.

    addslashes( $row[ $col['Field'] ] ) . "'" )

    Autsch. Das PHP Handbuch sagt

    The addslashes() is sometimes incorrectly used to try to prevent SQL Injection.

    Du sollst mysqli_real_escape_string (oder PDO::quote) verwenden.

    isset( $row[ $col['Field'] ] )

    Hm. Du möchtest vielleicht array_key_exists($col['Field'], $row) ausprobieren.

    Ist das ein Bug von PHP?

    Nein. Das ist bei isset so dokumentiert.

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Tach!

      addslashes( $row[ $col['Field'] ] ) . "'" )

      Autsch. Das PHP Handbuch sagt

      The addslashes() is sometimes incorrectly used to try to prevent SQL Injection.

      "Sometimes". Im Falle von MySQL werden die unbedingt benötigten Zeichen behandelt. Die zusätzlich von den MySQL-Funktionen behandelten Zeichen sind für SQL-Injection nicht relevant.

      Du sollst mysqli_real_escape_string (oder PDO::quote) verwenden.

      Ja, für neue Projekte sollte man das aus Konsistenzgründen durchaus nehmen, aber alte Projekte müssen nicht aus Sicherheitsgründen umgeschrieben werden.

      dedlfix.