Maik W. aus E.: Etwas für jeden Datensat tun (foreach?)

Tach zusammen,
ich lasse aus der Datenbank eine Liste von Datensätzen in eine Tabelle laufen, gebe jedem Datensatz mit
<INPUT TYPE="CHECKBOX"  name="freigabe[]" value="<? echo $daten["usr"]; ?>">
vorne ein Feld zum Ankreuzen mit, zusätzlich gibt es für jeden Datensatz ein Datum, das vorgegeben, aber änderbar ist:
<INPUT TYPE="TEXT"  name="enddatumtag" size="2" value="<?echo substr($daten["letzte_aenderung"],6,2); ?>">.<INPUT TYPE="TEXT"  name="enddatummonat" size="2" value="<?echo substr($daten["letzte_aenderung"],4,2); ?>">.<INPUT TYPE="TEXT"  name="enddatumjahr" size="2" value="<?echo "0"; echo(substr($daten["letzte_aenderung"],2,2)+01); ?>">

wenn das Formular, das um die Tabelle gelegt ist, abgeschickt wird, sollen die jeweiligen Datensätze geändert in die DB geschrieben werden. Ich mache das mit:
 if (isset($freigabe)){
   $res = mysql_query("SELECT * FROM user WHERE freigegeben = 0 ORDER by usr",$db) or die(mysql_error()); ?

while($daten = @mysql_fetch_array($res, MYSQL_ASSOC)) {
       if (!in_array($daten['usr'], $freigabe)) continue;

$enddatum = ('20'.$enddatumjahr.$enddatummonat.$enddatumtag.'001000');
 mysql_query("UPDATE user SET freigegeben ='1', aktiv='1', enddatum='$enddatum' WHERE usr =$daten[usr]",$db);
unset($enddatum);

Jetzt das Problem 8>):

Das funktioniert, allerdings nur mit der letzten Zeile der Tabelle, wenn ich den letzten und vorletzen Datensatz freigebe, wird immer der Wert des letzten Datensatzes eingetragen...

Ich habe auch schonmal versucht, mit einem "foreach" das einzugrenzen, das für jeden der angekreuzten Datensätze, gemacht werden soll, das habe ich aber nicht hingekriegt...

Was kann ich tun?

Besten Dank

Maik

  1. Hi,

    PHP ist ziemlich dumm. Wenn Du per Formular eine Liste von (gleichnamigen) Werten übergeben willst, musst Du dies bereits vorher ankündigen:

    <INPUT TYPE="CHECKBOX"  name="freigabe[]"

    Hier machst Du es,

    <INPUT TYPE="TEXT"  name="enddatumtag"

    und hier nicht. Darum hast Du nur ein $HTTP_GET_VARS['enddatumtag'], nicht beliebig viele.

    if (isset($freigabe)){

    Du solltest _niemals_ magisch in den globalen Scope gehauene Variablennamen benutzen! Das ist ein immenses Sicherheitsrisiko. Nimm statt dessen $HTTP_GET_VARS['freigabe'] (bzw. bei POST-Formularen entsprechend $HTTP_POST_VARS).

    In diesem Fall erhälst Du übrigens ein Array mit n Werten, welches theoretisch (nagel mich da bitte nicht fest) in _jedem_ Fall gesetzt sein sollte; auch wenn keine Checkbox angeklickt wurde. Das Array hat eine Länge, und Du kannst es in einer Schleife durchgehen. Unter der (nicht zwangsläufig gegebenen; aber ich kenne auch kein Gegenbeispiel) Bedingung, dass der Browser die Formularfelder in exakt der Reihenfolge versendet, in der sie angegeben wurden, ist der zugehörige Index von $HTTP_GET_VARS['enddatumtag'] der gleiche wie Dein Schleifenwert.

    Cheatah

    1. Moin

      Du solltest _niemals_ magisch in den globalen Scope gehauene Variablennamen benutzen! Das ist ein immenses Sicherheitsrisiko. Nimm statt dessen $HTTP_GET_VARS['freigabe'] (bzw. bei POST-Formularen entsprechend $HTTP_POST_VARS).

      Öhm, könntest du das bitte noch ein bisschen ausführen?
      Inwieweit soll eine Variable die im $HTTP_*-Array liegt sicherer sein, als die selbe Variable die ausserhalb dieses Arrays im globalen Scope liegt?
      Abgesehen vielleicht von Situationen wo der Webmaster register_globals ausgeschaltet hat, sind die beiden Zugriffsmethoden doch genau gleich. (Bloss das beim globalen Zugriff eben nicht diese doofe Unterscheidung zwischen GET und POST nötig ist)

      --
      Henryk Plötz
      Grüße aus Berlin

      1. Abgesehen vielleicht von Situationen wo der Webmaster register_globals ausgeschaltet hat, sind die beiden Zugriffsmethoden doch genau gleich. (Bloss das beim globalen Zugriff eben nicht diese doofe Unterscheidung zwischen GET und POST nötig ist)

        Ich sehe das auch so! Generell sind GETs und POSTs relativ unsicher.
        Einzige möglichkeit sie sicher zu machen ist ein vernünftiges Session-/User-Management und SSL.

        Gruß, Uli

        --
        Henryk Plötz
        Grüße aus Berlin

      2. Hi,

        Inwieweit soll eine Variable die im $HTTP_*-Array liegt sicherer sein, als die selbe Variable die ausserhalb dieses Arrays im globalen Scope liegt?

        wenn man nur von URL-Parametern (gleich ob GET oder POST) ausgeht, besteht die größte Gefahr darin, dass man durch eigens deklarierte Variablen Werte überschreitet - das hat man unter Kontrolle. Die Gefahr bei PHP liegt aber darin, dass der globale Scope mit dynamischen Variablennamen aus _mehreren_ Quellen gefüllt wird - dadurch sind Überschneidungen und ergo bewusste Manipulationen von außen kein Problem. Insbesondere das Environment kann problemlos reinfunken; bzw. in es reingefunkt werden.

        Man sollte "magische" Variablen ausschließlich dann verwenden, wenn deren Name von Anfang an definitiv bekannt war, und wenn sie durch nichts fremdes (=von außerhalb des Codes) überschrieben werden _können_.

        (Bloss das beim globalen Zugriff eben nicht diese doofe Unterscheidung zwischen GET und POST nötig ist)

        Ja; ein weiteres nur mäßig durchdachtes Detail von PHP.

        Cheatah

    2. Hi Cheatah,

      <INPUT TYPE="TEXT"  name="enddatumtag"

      und hier nicht. Darum hast Du nur ein $HTTP_GET_VARS['enddatumtag'], nicht beliebig viele.

      Seh' ich ein, ist eigentlich auch logisch

      In diesem Fall erhälst Du übrigens ein Array mit n Werten, welches theoretisch (nagel mich da bitte nicht fest) in _jedem_ Fall gesetzt sein sollte; auch wenn keine Checkbox angeklickt wurde.

      Das Array hat eine Länge, und Du kannst es in einer Schleife durchgehen.
      Und da hakt es mal wieder, das Array ist da, aber ich kriege keine Schleife hin, die nicht im Dauerladenirwana steckenbleibt...

      Dank Dir

      Maik

      1. Hi,

        Das Array hat eine Länge, und Du kannst es in einer Schleife durchgehen.
        Und da hakt es mal wieder, das Array ist da, aber ich kriege keine Schleife hin, die nicht im Dauerladenirwana steckenbleibt...

        wie hast Du es denn versucht? Vielleicht finde ich (oder jemand anders) ja einen Fehler.

        Cheatah

        1. Hi,

          Hi Cheatah,

          Das Array hat eine Länge, und Du kannst es in einer Schleife durchgehen.
          Und da hakt es mal wieder, das Array ist da, aber ich kriege keine Schleife hin, die nicht im Dauerladenirwana steckenbleibt...

          wie hast Du es denn versucht? Vielleicht finde ich (oder jemand anders) ja einen Fehler.

          Also, das Array hat eine Länge i, die müßte der Anzahl der ausgewählten Datensätze entsprechen, wenn wie Du sagst,

          der Browser die Formularfelder in exakt der Reihenfolge versendet, in der sie angegeben wurden, ist der zugehörige Index von
          $HTTP_GET_VARS['enddatumtag'] der gleiche wie Dein Schleifenwert.

          müßte doch so etwas wie

          for($i=1; $i<$HTTP_POST_VARS['enddatumtag']; $i++){
          $enddatumtag = $HTTP_POST_VARS[$i];
          echo $enddatumtag;
          }
          gehen???

          Dann kommt allerdings
          Warning: Undefined offset: 1 in freigabetest.php on line 24

          Das war eines der nichtgehenden Beispiele...

          Grüße

          Maik