php/mysql Problem - Seite 2

Seite 2 von 3 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/php-mysql-problem_232394/page_2 - zur Vollversion wechseln!


Rektal schrieb am 13.11.2012 um 09:01

Zitat von schizo
Ich versteh leider derzeit nicht, wie ich das Array wieder auswerten kann.
mit foreach erhalte ich nur jene Werte, welche ungleich NULL sind. Daher brauche ich entweder einen Standardwert, wenn die Checkbox nicht aktiviert ist oder eine Funktion, mit welcher ich die einzelnen Indizes ansteuern kann (diese hab ich bis jetzt leider vergeblich gesucht).
(Kleines Nitpicking: du erhältst bei foreach alle Werte: in deinem Fall ist der Wert aber durch das POST senden des Browsers nicht vorhanden)

Der Punkt ist: jene Schleife, die auf Basis des Array die Checkboxen ausgibt und jene Schleife, die auf Basis des POST-Requests diese Daten auswerten, müssen zugrunde liegend die selben Indizes verwenden.

Es ist um vieles einfach, wenn du die zu Grunde liegenden Daten immer zur Verfügung hast: egal ob es der ursprüngliche GET-Request zum Anzeigen des Formulars war, oder der aktuelle POST-Request mit den eigentlichen Formular-Daten. Auch im letzteren Fall wäre es für dich sehr von Vorteil, wenn du die Daten die du im GET-Request ausgegeben hast, wieder zur Verfügung hast. Entweder nochmal aus der DB fetchen oder in einem Session-basierte Zwischenspeicher ablegen.

Beim GET-Request holst du alle Daten um das Formular zu rendern.

Beim POST-Request, auch wenn du das Formular gar nicht renders, machst du das selbe.

Und dann iterierst du über dein "param"-Array und hast aber die ursprünglichen Daten-Indizes und arbeitest in der Schleife mit beiden Arrays (z.B. Iterierst du über jenes Array mit den Grunddaten, und verwendest diese Indizes um auf das "param"-Array zuzugreifen und so zu prüfen ob jetzt mit dem Index überhaupt ein Wert vorhanden ist oder nicht).

Dieser Ansatz hat auch noch einen anderen Vorteil: dir kann nicht irgendeiner beliebige/falsche Indizes unterjubeln, da du sie automatisch mit den Grunddaten aus der Datenbank verarbeitest (talkin' about Security and such).

Hoffe das war verständlich ... lG


Spikx schrieb am 13.11.2012 um 13:39

Zitat von Rektal
Ad warum $_POST["parts"] NULL ist: nach deiner Analyse fällt mir nichts direkt ein. Hast du dir schon "var_dump($_POST);" angeschaut? Vielleicht ists ja woanders reingerutscht :) Hast eh alle Errors aufgedreht und sicherheitshalber ins PHP error.log geschaut?
Hm, evt. funktioniert's nicht, weil er type="checkbox" mit type="hidden" vermischt?


schizo schrieb am 13.11.2012 um 14:08

Zitat von Rektal
Zitat von sk/\r
wer weiß schon was im hintergrund für g'schäftln zwischen EA, ubi,... und m$ laufen? ;)
damals hat auch keiner nach vista verlangt und schleichend wurde es immer mehr.
vielleicht genügt ein kleiner anruf vom steve bei john oder yves damit was ins rollen kommt. :ugly:

Ich hab bis jetzt leider noch nicht herausgefunden, mit welchem Syntax ich bei dem zuvor erstellten Array ich dieses mit Indizes ansteuern kann.

z.B. bei 'team' hab ich derzeit im Post ein Array (z.B. team[2]=1, team[4]=1). Mir fehlt derzeit aber der Schritt, mit welchem ich dieses Array in ein PHP Array übertragen kann.

Zitat
Hm, evt. funktioniert's nicht, weil er type="checkbox" mit type="hidden" vermischt?

Nein, ich bin über mehrere Beispiele gestoßen, in welchen mittels type="hidden" ein Standardwert definiert wurde. Das funktioniert auch ohne Arrays recht gut, doch sobald ein Array der Größe n vorhanden ist hast du n Werte + m Werte, bei welchen die Checkbox aktiv ist.

Der Grund, warums nicht funktioniert hat, war dass ich mich beim setzen der Indizes vertan habe.


Rektal schrieb am 13.11.2012 um 20:40

Zitat von schizo
Nein, ich bin über mehrere Beispiele gestoßen, in welchen mittels type="hidden" ein Standardwert definiert wurde. Das funktioniert auch ohne Arrays recht gut, doch sobald ein Array der Größe n vorhanden ist hast du n Werte + m Werte, bei welchen die Checkbox aktiv ist.

Der Grund, warums nicht funktioniert hat, war dass ich mich beim setzen der Indizes vertan habe.
Ach, jetzt verstehe ich. Im urspruenglichen Beispiel hast du ja ueberhaupt keine Indizes gehabt:
Code: HTML
<input type="hidden" name="params[]" value="0">
<input type="checkbox" name="params[]" value="1">
wurde, wenn die Checkbox ausgewaehlt ist, ein Array mit zwei Werten, null und eins, generieren. Was du hier vermutlich gemeint hast ist:
Code: HTML
<input type="hidden" name="params[0]" value="0">
<input type="checkbox" name="params[0]" value="1">
Das wuerde dafuer sorgen, dass du bei ausgewaehlter Checkbox nur einen Wert im Array bekommst, naemlich eins.

Aber deinem Post nach hast du das eh schon erkannt oder? War da noch eine weitere Frage drin? lG


schizo schrieb am 14.11.2012 um 00:09

Das habe ich erkannt, ja. Komischerweise waren in dem Beispielen, die ich gefunden habe nie indezes angegeben. Daher bin ich davon ausgegangen, dass automatisch inkrementiert wird.

Jetzt stehe ich vor dem Problem, wie ich bei der Ausgabe Indizes angeben kann. $_POST liefert ja nur jene Einträge retour, in welchen die checkbox gesetzt war. Das checkbox Array hat jedoch die richtigen indezes. Nur hilft mir gar_Rumpf eben nicht weiter :(

edit: so, ich umgeh das Problem jetzt mit der hidden Variante und einem default Wert != 0. Damit erhalte ich zumindest ein Array mit der richtigen Größe. Allerdings kann ich mir nicht vorstellen, dass das ganze nicht einfacher/schöner zu realisieren ist.


Obermotz schrieb am 14.11.2012 um 09:03

Du kannst den Namen der Checkbox name="irgendwas_Id" dynamisch setzen beim durchiterieren wobei die Id die Id des jeweiligen Eintrags ist. Nachher sammelst dir die Variablen zam, extrahierst dir via strpos und substr oder preg_match die ID und du hast genau die Ids die du benötigst - sparst dir auch die hidden Felder.


schizo schrieb am 14.11.2012 um 11:47

Zitat von Obermotz
Du kannst den Namen der Checkbox name="irgendwas_Id" dynamisch setzen beim durchiterieren wobei die Id die Id des jeweiligen Eintrags ist. Nachher sammelst dir die Variablen zam, extrahierst dir via strpos und substr oder preg_match die ID und du hast genau die Ids die du benötigst - sparst dir auch die hidden Felder.

Die ID's hab ich ja richtig gesetzt, diese sind nicht das Problem zu erhalten.
Nach dem POST hatte ich dann allerdings ein Array z.B. team, welches an 2. und 4. Stelle gesetzt war.
Wenn ich dieses Array mit foreach aufrufe erhalte ich nur 2 Werte retour, relevant wären jedoch alle (auch die NULL Werte).

Ich bin bis jetzt nur auf die hidden Lösung mit default Werten != 0 gestoßen, wie ich nach dem POST sowohl durch die NULL Werte als auch die gesetzten Werte durchiterieren kann.


schizo schrieb am 19.11.2012 um 02:34

ich hab wieder mal ein mir unerklärliches Problem:

Code: PHP
$number_teams=5;
  if ($teamsize==4){
    $k=0;
    $l=$k+1;
    while ($l<$variants){
      $m=$l+1;
      while ($m<$variants){
        $n=$m+1;
        while ($n<$variants){
          $teamratio=mysql_result($nextgame_result,$k,"ratio")+mysql_result($nextgame_result,$l,"ratio")
+mysql_result($nextgame_result,$m,"ratio")+mysql_result($nextgame_result,$n,"ratio");
          $o=0;
          while ($o<$number_teams){
            if (abs($gameratio/2-$teamratio)<abs($diffratio[$o])){
/*            $p=$number_teams-$o-2;
              while ($p>=0){
                $q=$p+1;
                $ratio1[$q]=$ratio1[$p];
                $ratio2[$q]=$ratio2[$p];
                $diffratio[$q]=$diffratio[$p];
                $team1[$q][0]=$team1[$p][0];
                $team1[$q][1]=$team1[$p][1];
                $team1[$q][2]=$team1[$p][2];
                $team1[$q][3]=$team1[$p][3];
                $p--;
              }
*/            $ratio1[$o]=$teamratio;
              $ratio2[$o]=$gameratio-$teamratio;
              $diffratio[$o]=$gameratio/2-$teamratio;
              $team1[$o][0]=$k;
              $team1[$o][1]=$l;
              $team1[$o][2]=$m;
              $team1[$o][3]=$n;
              $o=$number_teams;
            }
            $o++;
          }
          $n++;
        }
        $m++;
      }
      $l++;
    }
  }

Ohne die auskommentierten Zeilen erhalte ich bei den Testdaten (die noch recht grob sind) 5 verschiedene Arrays für $k, $l, $m und $n.
Sobald ich jedoch die Kommentare entferne sind die jeweils die ersten Zwei Arrays ident (z.B. $team1[0][3] und $team1[1][3]).
Die weiteren Abfolgen unterscheiden sich jedoch. Sieht eventuell jemand anderer den Logikfehler? Ich steh derzeit auf der Leitung :(

Edit : initialisiert wurde das Array auch


Obermotz schrieb am 19.11.2012 um 08:53

omg, das ist ja 5-Fach exponentiell und du machst in der 3. Potenz mysql_result-Zugriffe :D
Das kann man bestimmt einfacher lösen, was willst du mit dem Code erreichen, grob umschrieben?


schizo schrieb am 19.11.2012 um 11:59

Ich möchte mir in dem Codesnippet anhand einer in mysql hinterlegten Spielertabelle optimale Teamzusammensetzungen ausrechnen. $k, $l, $m, $n sind hier die Zeilen aus einer SQL Abfrage, welche die Spieler für das nächste Spiel ausgibt.

So langsam ist der Code auch nicht. In dem Beispiel wird die while ($n...) Schleife gerade 35 mal durchlaufen, da ich die Schleifen nicht komplett durchiteriere, sondern im Falle $n bei $m+1 beginne.


Rektal schrieb am 19.11.2012 um 12:12

Ich würds mir gerne anschauen, wenn die Code-Formatierung:
- 2 spaces statt 8 verwenden würde (reicht vollkommen hier)
- lange Zeilen sinvoll umbricht, das man einfach einen Überblick hat

Plus es wäre super, die Zeilen auch noch minimieren (eigene Zeile für { und } muss nicht). Aber vermutlich ist es gscheiter gleich einen patebin zu verwenden :)


Obermotz schrieb am 19.11.2012 um 12:30

Das Ding gehört einfach refactored. Die Benutzung von mysql_result ist obsolet - wenn er mit assoziativem Array arbeiten würde, dann würden ihm die Variablen $k, $l und $n wegfallen, er könnte mit foreach und den mächtigen Arrayfunktionen von PHP arbeiten und das ganze wär sogar lesbar.

Btw here you are :D

code_182961.jpg


schizo schrieb am 19.11.2012 um 12:30

Hab den vorigen Post editiert, thx :)


COLOSSUS schrieb am 19.11.2012 um 12:34

Zitat von Obermotz
[...] den mächtigen Arrayfunktionen von PHP [...]

>:-D


Obermotz schrieb am 19.11.2012 um 12:34

Ich hab schon gewartet :D

// Aber wenn schon PHP dann bitte gscheid, so hab ichs gemeint ;)




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2026