Onkel Schnitzel: Problem mit Array-Schlüsseln und Werten

Hallo,

ich stelle unten mal einen Codeschnipsel rein. Im Prinzip will ich damit folgendes erreichen. Ich bekomme aus einem Formular mehrere Zeitwerte mit unterschiedlichen Schlüsseln. Jetzt soll, wenn kein 'zeit'-Wert aus dem Formular übertragen wurde, der Wert 90 (Länge eines Fußballspiels) zum alten DB-Wert dazu addiert werden. Das klappt auch.

Wenn ein Wert übertragen wurde, dann soll logischerweise dieser zum alten DB-Wert hinzuaddiert werden. Wenn ich jetzt aus dem Formular die Daten schicke, daß Spieler Schröder (id=5) 10 Minuten gespielt hat, wird das auch korrekterweise in die DB übernommen. zeit[5]=10min

Wenn ich aber sage, Schröder hat 10 Minuten gespielt und Schmidt (id=6) 20 Minuten, dann addiert er bei Schröder und Schmidt jeweils 30 Minuten dazu. Anstatt zeit[5]=10  und zeit[6]=20, schreibt er also jeweils 30 in die Tabelle. Ich verstehe ainfach nicht, warum die beiden Werte zusammenaddiert werden. Ich denke mal, irgendwas mach ich mit den Arrays falsch.

if(@trim($_POST['zeit'][$key]) == "") {
             $sql = "UPDATE
                       spielerstatistik
                   SET
                       Spielzeit = Spielzeit + 90
                   WHERE
                       ID = '".$key."'";
           mysql_query($sql) OR die("Übertragung fehlgeschlagen: ".mysql_error());
      }
      else {
          foreach ($_POST['zeit'] as $key => $wert) {
           $sql = "UPDATE
                       spielerstatistik
                   SET
                       Spielzeit = Spielzeit + '".$wert."'
                   WHERE
                       ID = '".$key."'";
           mysql_query($sql) OR die("Übertragung fehlgeschlagen: ".mysql_error());
          }
      }

Gruß,
Onkel Schnitzel

  1. Hallo Schnitzel,

    [...]

    auf die Schnelle ist mir kein Fehler aufgefallen, bau Dir am besten mal ein paar Debug-Ausgaben ein, um zu sehen, an welcher Stelle was wirklich gemacht wird, vielleicht siehst Du ja dann, was nicht paßt.

    MfG
    Götz

    --
    Losung für Samstag, 5. November 2005
    Wenn du nun gegessen hast und satt bist und schöne Häuser erbaust und darin wohnst, dann hüte dich, dass dein Herz sich nicht überhebt und du den Herrn, deinen Gott, vergisst. (5. Mose 8,12.14)
    Trachtet nach dem, was droben ist, nicht nach dem, was auf Erden ist. (Kolosser 3,2)
    (Losungslink)
  2. Hallo!
    Bist Du dir sicher dass Du nichts illegales damit vorhast?

    1. Hallo!
      Bist Du dir sicher dass Du nichts illegales damit vorhast?

      Nanu? Da lehn' ich mich doch glatt mal interessiert nach vorne. Wenn Du irgendwelche Ideen hast- ich bin dabei ;-)

      Gruß,
      Onkel Schnitzel

  3. Moin!

    Wenn ich aber sage, Schröder hat 10 Minuten gespielt und Schmidt (id=6) 20 Minuten, dann addiert er bei Schröder und Schmidt jeweils 30 Minuten dazu. Anstatt zeit[5]=10  und zeit[6]=20, schreibt er also jeweils 30 in die Tabelle. Ich verstehe ainfach nicht, warum die beiden Werte zusammenaddiert werden. Ich denke mal, irgendwas mach ich mit den Arrays falsch.

    Könnte durchaus sein, denn:

      
    
    >       if(@trim($_POST['zeit'][$key]) == "") {  
    >       else {  
    >           foreach ($_POST['zeit'] as $key => $wert) {  
    >           }  
    >       }  
    
    

    Im if fragst du einen bestimmten Key ab - und wenn der nicht leer ist (übrigens eine schlechte Art, die Notice für "undefines index" abzufangen, ist das @ - benutze isset() als Funktion, und frage das separat), dann gehts du ins else und  arbeitest mit dem _gesamten_ Array $_POST['zeit'], nicht nur mit diesem Key.

    Das kann irgendwie nicht so ganz hinkommen von der Logik her. Entweder ist $key als Variable vor dem if nicht benutzt - dann ist das if falsch. Oder $key ist benutzt - dann ist es im foreach fehlplatziert und bringt deine äußere Schleife durcheinander.

    Jedenfalls ist erstens mehr Code notwendig, und zweitens eine Debug-Ausgabe! Schreibe jeden generierten SQL-Code auf den Bildschirm, sowohl im if, als auch im else. Dann siehst du, welche Aktualisierungen stattfinden sollen, und findest vielleicht heraus, dass gar nicht 10 + 20 gerechnet wird, sondern dass die 10 Minuten vielleicht dreimal addiert werden.

    - Sven Rautenberg

    --
    My sssignature, my preciousssss!
    1. Moin,

      ich habs hinbekommen. Ich hatte wirklich einen Denkfehler drin und ich hab Euch auch einen wichtigen Teil des Codes vorenthalten. Und zwar stand die ganze if-Bedingung in einer weiteren foreach-Schleife, die aber völliger Blödsinn war. Deswegen hab ich die Bedingung da rausgenommen und umgeformt.

      foreach ($_POST['zeit'] as $key => $wert) {
            if(@trim($_POST['zeit'][$key]) == "") {
                   $sql = "UPDATE
                             spielerstatistik
                         SET
                             Spielzeit = Spielzeit + 90
                         WHERE
                             ID = '".$key."'";
                 mysql_query($sql) OR die("Übertragung fehlgeschlagen: ".mysql_error());
            }
            else {
                 $sql = "UPDATE
                             spielerstatistik
                         SET
                             Spielzeit = Spielzeit + '".$wert."'
                         WHERE
                             ID = '".$key."'";
                 mysql_query($sql) OR die("Übertragung fehlgeschlagen: ".mysql_error());
            }
        }

      So scheints jetzt erstmal zu funktionieren. Die trim =="" - Abfrage konnte ich irgendwie nicht durch if(!(isset($_POST['zeit'][$key]))) { ersetzen. Die Bedingung war nie erfüllt, weil der zeit-Schlüssel immer übertragen wird, auch wenn ich das Formularfeld nicht ausfülle. Aber der Schlüssel hat dann halt keinen Wert, deshalb das =="". Was ist daran nicht so schlecht? Funktioieren tut's ja.

      Gruß,
      Onkel Schnitzel

      1. Hallo Schnitzel,

        So scheints jetzt erstmal zu funktionieren. Die trim =="" - Abfrage konnte ich irgendwie nicht durch if(!(isset($_POST['zeit'][$key]))) { ersetzen. Die Bedingung war nie erfüllt, weil der zeit-Schlüssel immer übertragen wird, auch wenn ich das Formularfeld nicht ausfülle. Aber der Schlüssel hat dann halt keinen Wert, deshalb das =="". Was ist daran nicht so schlecht? Funktioieren tut's ja.

        Der Code gefällt mir nicht, aber das ist ja egal, soll jeder schreiben, wie's ihm gefällt.
        Aber hast Du schonmal was von empty() gehört?

        MfG
        Götz

        --
        Losung für Samstag, 5. November 2005
        Wenn du nun gegessen hast und satt bist und schöne Häuser erbaust und darin wohnst, dann hüte dich, dass dein Herz sich nicht überhebt und du den Herrn, deinen Gott, vergisst. (5. Mose 8,12.14)
        Trachtet nach dem, was droben ist, nicht nach dem, was auf Erden ist. (Kolosser 3,2)
        (Losungslink)
        1. Hallo Götz,

          Der Code gefällt mir nicht, aber das ist ja egal, soll jeder schreiben, wie's ihm gefällt.

          Ich bin auch kein großer Programmierer- eigentlich gar keiner. Ich freu mich, daß es überhaupt funktioniert.

          Aber hast Du schonmal was von empty() gehört?

          Nee, hab ich nicht. Aber Danke für den Hinweis. Ich werd morgen mal versuchen, das einzubauen.

          Gruß,
          Onkel Schnitzel