Problem mit Array-Schlüsseln und Werten
Onkel Schnitzel
- php
0 Götz-3 Werner0 Sven Rautenberg
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
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
Hallo!
Bist Du dir sicher dass Du nichts illegales damit vorhast?
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
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
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
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
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