hansi: Array aus $_POST auslesen

Hallo,

eine Seite sendet folgende Daten:

_POST["kilo"]

Array
(
    [1] => 5.000
    [2] => 12.000
    [3] => 170.000
)

_POST["aktion"]

Array
(
    [1] => 3083
    [2] => 3084
    [3] => 3087
)

mit phpinfo(INFO_VARIABLES) und var_dump 100 mal gechecked.
Die Werte kommen sauber an.

so lese ich aus:

  
  
<?  
foreach($_POST['aktion'] as $key => $wert){  
  
	$id 	= $wert;  
  
	$k	= $_POST['kilo'];  
	$kg	= $k['$key'];  
  
	$SQL = "UPDATE lieferschein SET GEWICHT = '<? echo $kg ?>' WHERE REC_ID = '$id'";  
  
//erstmal testen bevors in die DB geht.	  
echo $SQL . "<br>";  
}  
  
?>  

UPDATE lieferschein SET GEWICHT = '' WHERE REC_ID = '3083'
UPDATE lieferschein SET GEWICHT = '' WHERE REC_ID = '3084'
UPDATE lieferschein SET GEWICHT = '' WHERE REC_ID = '3087'

Wieso ist das Gewicht nicht da?

Gruß

  1. Auf den ersten Blick:

    $kg = $k['$key'];

    Faselfehler: Innherhalb einfacher Anführungsstriche wird die Variable (hier: $key) nicht ausgewertet.

    Du solltest Dir beim Entwickeln die Notizen anzeigen lassen.

    Jörg Reinholz, Schlosser

    1. $kg	= $k['$key'];  
      

      Faselfehler: Innherhalb einfacher Anführungsstriche wird die Variable (hier: $key) nicht ausgewertet.

      Daran liegts nicht. Hab schon alles durch. Doppelte, einfache und gar keine.

  2. $SQL = "UPDATE lieferschein SET GEWICHT = '<? echo $kg ?>' WHERE REC_ID = '$id'";

    Das is quatsch, afaik.
    Benutz doch einfach
    $SQL = "UPDATE lieferschein SET GEWICHT = '$kg' WHERE REC_ID = '$id'";
    wie du es bei $id auch gemacht hast.
    Zuzüglich musst du auch noch auf den Kontextwechsel achten, sowohl für $id, als auch für $kg.

    MfG
    bubble

    1. Tach!

      $SQL = "UPDATE lieferschein SET GEWICHT = '<? echo $kg ?>' WHERE REC\_ID = '$id'";  
      

      Das is quatsch, afaik.
      Benutz doch einfach
      $SQL = "UPDATE lieferschein SET GEWICHT = '$kg' WHERE REC_ID = '$id'";
      wie du es bei $id auch gemacht hast.
      Zuzüglich musst du auch noch auf den Kontextwechsel achten, sowohl für $id, als auch für $kg.

      Und für sein echo $SQL den Kontextwechsel zu HTML, denn dann hätte er das Problem an obigem Konstrukt sehen können. Alternativ täte es auch ein Blick in die Quellcode-Ansicht des Browsers.

      Was übrigens auch noch Quatsch ist,

      $k        = $_POST['kilo'];
        $kg       = $k['$key'];

      statt

      $kg = $_POST['kilo'][$key];

      zu verwenden.

      dedlfix.

      1. $kg = $_POST['kilo'][$key];

        Selbst das ist Quatsch, da das Umkopieren von Werten hier völlig überflüssig ist und nur Speicher verbraucht.

        1. $kg = $_POST['kilo'][$key];

          Selbst das ist Quatsch, da das Umkopieren von Werten hier völlig überflüssig ist und nur Speicher verbraucht.

          Das kann man so und so sehen. Ohne das "Umkopieren" müsste man weiter unten eine relativ komplexe Anweisung zusammensetzen, die dann wieder die Gefahr weiterer (Programmier-)Fehler birgt. Skriptsprachen sollen menschen- und maschinenlesbar sein. Wöllte man superoptimal "bauen" müsste man alle Anwendungen mit dem Assembler dem Prozessor auf den Laib schneidern.

          Darauf, dass die Auswirkungen (Speicherverbrauch) in konkreten Fall vernachlässigbar sind, geht dedlfix gewiss noch selbst ein.

          Jörg Reinholz

          1. Tach!

            $kg = $_POST['kilo'][$key];
            Selbst das ist Quatsch, da das Umkopieren von Werten hier völlig überflüssig ist und nur Speicher verbraucht.

            Stimmt, hier hab ich nicht richtig aufgepasst. Speicher jedoch verbraucht bei solch einem Umkopieren zunächst nur die Variablenverwaltungsstruktur. PHP ist so intelligent, dass es bei unverändertem Wert intern nur eine Referenz auf den alten Wert anlegt wird. Erst wenn beide durch eine Änderung auseinanderlaufen, wird neuer Speicherplatz verbraucht.

            Das kann man so und so sehen. Ohne das "Umkopieren" müsste man weiter unten eine relativ komplexe Anweisung zusammensetzen, die dann wieder die Gefahr weiterer (Programmier-)Fehler birgt. Skriptsprachen sollen menschen- und maschinenlesbar sein. Wöllte man superoptimal "bauen" müsste man alle Anwendungen mit dem Assembler dem Prozessor auf den Laib schneidern.

            Das Argument ist so nicht ganz zu Ende gedacht. Der Wert darf in das SQL-Statement erst nach dem Beachten des Kontextwechsels eingefügt werden. Die Kontextwechselbeachtung hat gegenüber der Lesbarkeit eine deutlich höhere Priorität, weil sie funktional und sicherheitstechnisch unverzichtbar ist. Dazu kann man die Variable nicht direkt in den String einbauen, man braucht auch noch einen Funktionsaufruf (mysql(i)_real_escape_string()). Der String muss also an der Stelle für den Funktionsaufruf unterbrochen werden. Das Funktionsargument kann nun aber gleich als $_POST['kilo'][$key] übergeben werden. (Eine Alternative zur Stringunterbrechung wäre sprintf().)

            Im Falle von Zahlen kann man den Kontextwechsel auch mit intval()/floatval() absichern. Allerdings würde ich auch hierbei keine neuen Variablen irgendwo vor dem Statement-Zusammenbau anlegen, sondern ebenfalls gleich den originalen Wert zusammen mit int/floatval()-Funktionsaufruf in die Stringerzeugung integrieren (bevorzugt mit sprintf()). Da hat man alles schön beisammen.

            dedlfix.

          2. Das kann man so und so sehen. Ohne das "Umkopieren" müsste man weiter unten eine relativ komplexe Anweisung zusammensetzen, die dann wieder die Gefahr weiterer (Programmier-)Fehler birgt. Skriptsprachen sollen menschen- und maschinenlesbar sein.

            Wenn ich zwei Variablen mit dem gleichen Wert in einem Script nutze, verwirrt das den Menschen, der den Code lesen muss und hilft ihm nicht. Und einer Maschine ist egal ob eine Variable $sdfg sdfgsbdabtsbsrgtsretgfasteg heisst oder $description.

            Darauf, dass die Auswirkungen (Speicherverbrauch) in konkreten Fall vernachlässigbar sind, geht dedlfix gewiss noch selbst ein.

            Dases relevant wäre, hab ich nie behauptet, ich habe es lediglich als Auswirkung der Kopieroperation aufgeführt, da dabei nichts anderes passiert.

            Lesbarer wird der Code dadurch, wie gesagt, nicht, eher im Gegenteil.

            1. Moin,

              Lesbarer wird der Code dadurch, wie gesagt, nicht, eher im Gegenteil.

              Die Lesbarkeit wird weder verbessert noch beeinträchtigt, sofern man aussagekräftige Namen verwendet. In bestimmten Fällen, kann man sich aber eine Menge Tipparbeit sparen, was ein Argument dafür wäre.

              Fakt ist aber auch bei der - immer mal wieder auftauchenden - Frage nach dem Umkopieren: Man muss wissen, was man tut und sollte es begründen können.

              Grüße Marco

              1. Tach!

                Die Lesbarkeit wird weder verbessert noch beeinträchtigt, sofern man aussagekräftige Namen verwendet. In bestimmten Fällen, kann man sich aber eine Menge Tipparbeit sparen, was ein Argument dafür wäre.

                Aber nur in bestimmten Fällen. Ich hatte dieses Argument erst vor ein paar Tagen zerlegt, finde es jetzt auf die Schnelle nicht. Um Tipparbeit zu sparen, muss man vorher wissen, wieviele Verwendungen man haben wird. Bei nur einer ist das Umkopieren Mehrarbeit gegenüber der direkten Verwendung - bei zweien je nach Variablenlänge auch noch. Erst dann sparst du ein paar Tastenanschläge. Wenn du nun also unterscheiden musst zwischen ein/zwei oder mehreren Verwendungen hast du einen Mischmasch aus direkten und umkopierten Verwendungen. Und dann ist auch das Lesbarkeitsargument langsam keins mehr.

                Tipparbeit spart man mit einer IDE mit Autovervollständigung, und nicht indem man die Komplexität der Anwendung durch noch mehr Variablen erhöht.

                dedlfix.

              2. Die Lesbarkeit wird weder verbessert noch beeinträchtigt, sofern man aussagekräftige Namen verwendet.

                Für mich beeinträchtigt sich die Lesbarkeit massiv, wenn die Zahl der Variablen steigt, denn dadurch verkompliziert sich automatisch der Code.

                In bestimmten Fällen, kann man sich aber eine Menge Tipparbeit sparen, was ein Argument dafür wäre.

                Dann ist dein Editor Schrott ;)

                Fakt ist aber auch bei der - immer mal wieder auftauchenden - Frage nach dem Umkopieren: Man muss wissen, was man tut und sollte es begründen können.

                Reines Umkopieren kann nie logisch begründet werden. Es ist _unnötig_.

        2. $kg = $_POST['kilo'][$key];

          Selbst das ist Quatsch, da das Umkopieren von Werten hier völlig überflüssig ist und nur Speicher verbraucht.

          So schon, wenn man nun aber noch durch den Kontextwechsel
          $kg = floatval($_POST['kilo'][$key]);
          Schreiben würde, würde es wieder Sinn machen. Vorausgesetzt man verwendet den "konformen" Wert mehr als ein mal.

          MfG
          bubble

  3. Naja. Du hast auch nervös daran herumgedoktort und Dich wahrscheinlich vom Browsercache hinters Licht führen lassen. Hier der an vielen Stellen auch hinsichtlich der Sicherheit reparierte Code zum Vergleich:

    <?php  
    $_POST["kilo"][1] = '5.000';  
    $_POST["kilo"][2] = '12.000';  
    $_POST["kilo"][3] = '170.000';  
      
      
    $_POST["aktion"][1] = '3083';  
    $_POST["aktion"][2] = '3084';  
    $_POST["aktion"][3] = '3087';  
      
      
    foreach($_POST['aktion'] as $key => $wert){  
      
            $id         = intval($wert);  
      
            $k          = $_POST['kilo'];  
            #$kg        = floatval($k[$key]);  
            #besser:  
            $kg         = floatval($_POST['kilo'][$key]);  
      
            $SQL = "UPDATE lieferschein SET GEWICHT = '$kg' WHERE REC_ID = '$id'";  
      
            //erstmal testen bevors in die DB geht.  
            echo $SQL . "\n";  
    }  
      
    ?>
    

    Meine Ergebnisse:

    UPDATE lieferschein SET GEWICHT = '5' WHERE REC_ID = '3083'
    UPDATE lieferschein SET GEWICHT = '12' WHERE REC_ID = '3084'
    UPDATE lieferschein SET GEWICHT = '170' WHERE REC_ID = '3087'

    Falls mehr Hilfe benötigt wird: Ich arbeite gar nicht als Schlosser :)

    Jörg Reinholz, Schlosser

  4. $SQL = "UPDATE lieferschein SET GEWICHT = '<? echo $kg ?>' WHERE REC_ID = '$id'";

    Ersetz das <? echo $kg ?> durch $kg und es wird klappen :)