Kjorni: Warum kommt bei meinem Request ein assoziatives Array an?

Hallo,

ich sende ein Formular ab, bei dem tabellarisch zeilenweise Werte geändert werden können (sollen).

Dazu gibt es zeilenweise je einen Submit-Button.

Leider kommt auf dem Server nicht das an, was ich dort erwartet habe.

<form>  
<table>  
<tr id='63'>  
<td>  
<input class='test1' type=text Name="wert_input[69]" SIZE=50 MAXLENGTH=100 VALUE="wert">  
</td>  
<td>Icons</td>  
<td>  
<div class='button_neu'>  
<input type='submit' name="sendebutton[69]" id='sende_button' value='Ändern'>  
</div>  
</td>  
</tr>  
</table>  
</form>

PHP:

if (isset($_REQUEST['sendebutton'])) {  
$update_id=key($_REQUEST['sendebutton']);  
}  
  
$wert_input=$_REQUEST['wert_input'];  
  
echo($wert_input."[".$update_id."]");

Und was kommt raus?

Array[69]

Also scheint $wert_input nicht als Array, sondern als assoziatives Array beim Server anzukommen.

Was mache ich hier falsch?

Grüße, Kjorni

  1. Hi!

    Leider kommt auf dem Server nicht das an, was ich dort erwartet habe.

    Was erwartest du denn?

    $wert_input=$_REQUEST['wert_input'];

    Das Umkopieren ist unnötig. Schau lieber mit var_dump($_REQUEST['wert_input']); nach, was wirklich da ist.

    echo($wert_input."[".$update_id."]");[/code]
    Und was kommt raus?
    Array[69]
    Also scheint $wert_input nicht als Array, sondern als assoziatives Array beim Server anzukommen.

    PHP kennt prinzipiell nur assoziative Arrays. In $wert_input steht ein Array. Wenn du das in eienn String-Kontext bringst, kommt das Wort "Array" raus. Wenn du den Inhalt von $wert_input[$update_id] anzeigen lassen willst, dann notier das in dieser Form.

    Lo!

    1. Hi!

      Leider kommt auf dem Server nicht das an, was ich dort erwartet habe.

      Was erwartest du denn?

      $wert_input=$_REQUEST['wert_input'];

      Das Umkopieren ist unnötig. Schau lieber mit var_dump($_REQUEST['wert_input']); nach, was wirklich da ist.

      echo($wert_input."[".$update_id."]");[/code]
      Und was kommt raus?
      Array[69]
      Also scheint $wert_input nicht als Array, sondern als assoziatives Array beim Server anzukommen.

      PHP kennt prinzipiell nur assoziative Arrays. In $wert_input steht ein Array. Wenn du das in eienn String-Kontext bringst, kommt das Wort "Array" raus. Wenn du den Inhalt von $wert_input[$update_id] anzeigen lassen willst, dann notier das in dieser Form.

      Hi dedlfix,

      ich glaub Dir zwar, aber ich seh grad nicht, dass ich das in einem String-Kontext notiert habe.

      Ich habe nun mal:

      echo $wert_input[$update_id];

      notiert und was kommt raus?

      Array[69]

      Wo ist hier der String-Kontext?

      Viele Grüße, Kjorni

      1. Hallo,

        ich glaub Dir zwar, aber ich seh grad nicht, dass ich das in einem String-Kontext notiert habe.

        ... sondern?

        Ich habe nun mal:
           echo $wert_input[$update_id];
        notiert und was kommt raus?

        Ein String - was sonst gibt die echo-Anweisung aus?

        Wo ist hier der String-Kontext?

        In den Parametern von echo.

        Wenn du eine Variable näher untersuchen willst, verwende dazu nicht echo, sondern am besten var_dump(). Das zeigt dir dir den Variablentyp, die komplette Struktur (vor allem bei Arrays!) und die Werte in einer dem Typ entsprechenden Darstellung.

        Ciao,
         Martin

        --
        Wer mit dem Finger droht, sollte ihn am Abzug haben, und nicht in der Nase.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Wenn du eine Variable näher untersuchen willst, verwende dazu nicht echo, sondern am besten var_dump(). Das zeigt dir dir den Variablentyp, die komplette Struktur (vor allem bei Arrays!) und die Werte in einer dem Typ entsprechenden Darstellung.

          Hi Martin,

          ok, habe ich gemacht und in

          var_dump($wert_input[$update_id]);

          steht exact das drin, was ich gerne hätte.

          Aber um es in die db einzutragen, muß ich doch im php-code

          update ... set wert="".$configwert_input."[".$update_id."]" where...

          eintragen?

          Und dann bin ich wieder in genau demselben Stringkontext.

          Gruß, Kjorni

          1. ok, habe ich gemacht und in

            var_dump($wert_input[$update_id]);

            steht exact das drin, was ich gerne hätte.

            Erstens glaube ich nicht, daß exakt das drin steht was Du gern hättest (worin eigentlich?) und zweitens, warum teilst Du uns das Ergebmis nicht mit?

            1. Erstens glaube ich nicht, daß exakt das drin steht was Du gern hättest (worin eigentlich?) und zweitens, warum teilst Du uns das Ergebmis nicht mit?

              string(1) "1" oder auch string(3) "ich" usw.

          2. Hi!

            in
            var_dump($wert_input[$update_id]);
            steht exact das drin, was ich gerne hätte.

            Aber um es in die db einzutragen, muß ich doch im php-code
            update ... set wert="".$configwert_input."[".$update_id."]" where...
            eintragen?

            Nein, so unübersichtlich muss man das nicht machen. Nimm am besten sprintf() zum Zusammenbauen der Query (wenn du keine Prepared Statements verwenden willst/kannst).

            $sql = sprintf("UPDATE ... SET wert='%s' WHERE ...", escape_funktion_für_dein_dbms($_POST['wert_input'][$update_id]));

            Damit trennst du die Syntax des SQL-Statements von der für PHP benötigten, was die Sache übersichtlicher macht. Das notwendige Anwenden der Maskier-/Escape-Funktion würde deine Stringverknüpfungsschreibweise auch noch etwas unübersichtlicher machen.

            Und bitte informiere dich zum Thema Kontextwechsel, wenn du keine SQL-Injection-fähigen Lücken einbauen willst.

            Lo!

            1. Hi dedlfix,

              Nein, so unübersichtlich muss man das nicht machen. Nimm am besten sprintf() zum Zusammenbauen der Query (wenn du keine Prepared Statements verwenden willst/kannst).

              $sql = sprintf("UPDATE ... SET wert='%s' WHERE ...", escape_funktion_für_dein_dbms($_POST['wert_input'][$update_id]));

              Puh. Sieht für mich auf den ersten Blick noch komplizierter aus, wie meine Query. Nicht bei dieser Query, aber bei anderen mit Joins und so??

              Und bitte informiere dich zum Thema Kontextwechsel, wenn du keine SQL-Injection-fähigen Lücken einbauen willst.

              Sorry. Hätte ich dazu schreiben können. Dieses Thema ist mir sehr geläufig und ich gehe es mit einer eigenen Funktion an, die ich je nach Bedarf (int, string, float) einsetze.

              Grüße, Kjorni

              1. Hi!

                Nein, so unübersichtlich muss man das nicht machen. Nimm am besten sprintf() zum Zusammenbauen der Query (wenn du keine Prepared Statements verwenden willst/kannst).
                  $sql = sprintf("UPDATE ... SET wert='%s' WHERE ...", escape_funktion_für_dein_dbms($_POST['wert_input'][$update_id]));
                Puh. Sieht für mich auf den ersten Blick noch komplizierter aus, wie meine Query. Nicht bei dieser Query, aber bei anderen mit Joins und so??

                Nun, du bekommst das gesamte Gebilde funktional nicht weniger komplex hin. Aber leg mal dein Augenmerk auf die Query. Sie ist in einem Stück notiert, nicht von PHP-Syntax unterbrochen und enthält auch keine Maskierzeichen. Sie hat lediglich einen Platzhalter eingebaut. Für mich ist sie deshalb sehr gut lesbar, besser als das Rein-Raus, bei dem zwischen den Werten kleine Stücken String stehen, die PHP- und SQL-Syntax sind. Da muss man genau hinsehen, was welche Sprache ist. Gerade wenn die Querys an sich komplexer werden und auch noch eine Anzahl Parameter eingefügt werden sollen, ist es von Vorteil, wenn sie selbst gut erfassbar notiert werden kann. Die sprintf-Geschichte hat lediglich den einen Nachteil, dass man die Zuordnung zwischen Platzhalter und Wert im Auge behalten muss. Aber auch hier kann man sich zur Not etwas Erleichterung schaffen:

                $sql = sprintf("... '%1$s', %2$s, '%3$s', ...",
                           mysql_real_escape_string($string), // 1
                           intval($zahl), // 2
                           mysql_real_escape_string($nocheiner)); // 3

                Lo!

          3. Moin!

            Aber um es in die db einzutragen, muß ich doch im php-code

            update ... set wert="".$configwert_input."[".$update_id."]" where...

            eintragen?

            Wenn ich dich richtig verstehe ist in $wert_input[$update_id] der Wert, der eingetragen ist. Du gibst aber $wert_input (Array) dann einen String "[" gefolgt von $update_id und noch einen String "]" ein. Also den String "Array[ID]".

            Wenn Du wert = $wert_input[$update_id] haben willst, solltest Du das auch so benutzen: "wert="".$wert_input[$update_id]."""

            --
            Vergesst Chuck Norris.
            Sponge Bob kann unter Wasser grillen!
            1. Hallo,

              Wenn ich dich richtig verstehe ist in $wert_input[$update_id] der Wert, der eingetragen ist. Du gibst aber $wert_input (Array) dann einen String "[" gefolgt von $update_id und noch einen String "]" ein. Also den String "Array[ID]".

              Hm, irgendwie wills nicht in meinen Kopf hinein. Ich les es mir aber heute nachmittag nochmal durch, vielleicht klappts ja dann.

              Wenn Du wert = $wert_input[$update_id] haben willst, solltest Du das auch so benutzen: "wert="".$wert_input[$update_id]."""

              Ja, das funktioniert.

              Wie gesagt, ich schau mirs später nochmal an, danke für Deine Hilfe.

              Kjorni

              1. Hi!

                Wenn ich dich richtig verstehe ist in $wert_input[$update_id] der Wert, der eingetragen ist. Du gibst aber $wert_input (Array) dann einen String "[" gefolgt von $update_id und noch einen String "]" ein. Also den String "Array[ID]".
                Hm, irgendwie wills nicht in meinen Kopf hinein. Ich les es mir aber heute nachmittag nochmal durch, vielleicht klappts ja dann.

                Du baust dir einen String aus $wert_input (wird zu "Array"), dem Zeichen [, dem Inhalt von $update_id und noch einem ] zusammen. Ein String ist allerdings kein PHP-Code. Wenn PHP auf ein Element eines Arrays zugreifen soll, benötigt es die Array-Element-Zugriffs-Syntax als Code und nicht als String.

                Wenn Du wert = $wert_input[$update_id] haben willst, solltest Du das auch so benutzen: "wert="".$wert_input[$update_id]."""
                Ja, das funktioniert.

                Jein. Damit erzeugst du zunächst einmal den richtigen PHP-Code, um auf das Array-Element zuzugreifen. Aber du beachtest durch das direkte Einfügen nicht, dass sich als Inhalt in dem Array-Element Zeichen befinden können (vor allem Anführungszeichen), die die beabsichtigte Syntax des SQL-Statements stören können. Das führt günstigstenfalls nur zu Syntaxfehlern, lässt sich aber auch für SQL-Injection ausnutzen. Richtig für MySQL wäre sowas

                "wert="" . mysql_real_escape_string($wert_input[$update_id]) . """

                Es bleibt immer noch, dass die Übersichtlichkeit des ganzen Code-Konstrukts ziemlich leidet, wenn man Anführungszeichen maskieren muss und auch das Statement für das Einfügen von Werten unterbrechen muss. Deswegen mein Vorschlag, sprintf() zu nutzen. Außerdem kann man die Anführungszeichen geschickter wählen, so dass man sie nicht auch noch maskieren muss. In Standard-SQL nimmt man für Strings die einfachen Anführungszeichen, MySQL kommt damit auch problemlos zurecht. In PHP muss man diese innerhalb von ""-String auch nicht maskieren - das sind schon zwei Gründe, die für ihren Einsatz sprechen.

                Lo!

      2. Hi!

        Bitte nur das zitieren, worauf du dich konkret beziehst und nicht einfach alles. Danke.

        ich glaub Dir zwar, aber ich seh grad nicht, dass ich das in einem String-Kontext notiert habe.

        Du hast eine Stringverkettung notiert. Dazu muss alles in einen String wandeln, wenn das noch nicht der Fall ist. Bei Arrays kommt immer "Array" raus.

        Ich habe nun mal:
        echo $wert_input[$update_id];
        notiert und was kommt raus?
        Array[69]

        Das glaube ich dir erst, wenn du die Ausgabe von var_dump($_REQUEST['wert_input']) zeigst. Und lass bitte das Umkopieren weg, nimm direkt $_* und vor allem auch das was du wirklich verwendest, also $_GET oder $_POST und nicht $_REQUEST.

        Wenn da immer noch die gleiche Ausgabe erfolgt, hast du vielleicht nicht den geänderten Code getestet sondern immer noch den alten.

        Wo ist hier der String-Kontext?

        In dem Fall wäre es das echo, das ebenfalls einen Stringkontext erzwingt. Alles was ausgegeben werden muss, muss in seine Stringrepräsentation gebracht werden.

        Lo!

  2. Mahlzeit Kjorni,

    Leider kommt auf dem Server nicht das an, was ich dort erwartet habe.

    Vermutlich schon - nur greifst Du falsch darauf zu ...

    <tr id='63'>

    Diese ID ist fehlerhaft - IDs dürfen nicht nur aus Ziffern bestehen!

    <input class='test1' type=text Name="wert_input[69]" SIZE=50 MAXLENGTH=100 VALUE="wert">
    [...]
    <input type='submit' name="sendebutton[69]" id='sende_button' value='Ändern'>

    PHP:

    if (isset($_REQUEST['sendebutton'])) {

    $update_id=key($_REQUEST['sendebutton']);
    }

    [code lang=php]$_REQUEST['sendebutton']

      
    Was genau erhoffst Du Dir von der mittleren Code-Zeile? Was sollte Deiner Meinung nach die "aktuelle Position" in dem Array sein?  
      
    Wie auch immer: letztendlich sollte in der Variable $update\_id vermutlich eine Zahl stehen, richtig?  
      
      
    
    > $wert\_input=$\_REQUEST['wert\_input'];  
      
    Auch `$_REQUEST['wert_input']`{:.language-php} sollte ein Array (mit mindestens einem Element: Schlüssel=69 und Wert='wert') sein.  
      
    
    > echo($wert\_input."[".$update\_id."]");[/code]  
      
    Wenn Du dieses Array direkt und mit Strings konkatiniert ausgibst, wird \*IMMER\* das Wort "Array" erscheinen. Die Ausgabe ...  
      
    
    > Und was kommt raus?  
    >   
    > Array[69]  
      
    ... ist also absolut korrekt.  
      
    Nun die Preisfrage: was willst Du \*EIGENTLICH\*? Offenbar etwas anderes. Dann teile uns das mit - vielleicht kann man Deine Gedanken in die richtige Richtung schubsen.  
      
      
    
    > Also scheint $wert\_input nicht als Array, sondern als assoziatives Array beim Server anzukommen.  
      
    Wie kommst Du darauf?  
      
      
    
    > Was mache ich hier falsch?  
      
    Du lieferst eine mangelhafte Problembeschreibung.  
      
      
    MfG,  
    EKKi  
    
    -- 
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    
    1. Hi EKKI,

      Du lieferst eine mangelhafte Problembeschreibung.

      Dabei habe ich mich so bemüht! :-(

      Nun die Preisfrage: was willst Du *EIGENTLICH*? Offenbar etwas anderes. Dann teile uns das mit - vielleicht kann man Deine Gedanken in die richtige Richtung schubsen.

      Ich habe eine Tabelle mit ungefähr 100 Werten, die ich zeilenweise ändern können möchte. Und zwar, ohne immer nach unten zum Submit-Button scrollen zu müssen.

      Also habe ich nun in jeder Tabellenzeile einen Submit-Button.

      Das Form-Element habe ich der Tabelle vorangestellt.

      Also muß ich nun auswerten, in welcher Zeile der Submit-Button geklickt wurde und den entsprechenden Wert des input-elements in die db eintragen.

      War das verständlicher?

      Viele Grüße, Kjorni