"We are back" « oc.at

php/mysql Problem

schizo 09.11.2012 - 20:03 9855 32
Posts

Rektal

Here to stay
Registered: Dec 2002
Location: Inside
Posts: 4548
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

My Little Pwny
Avatar
Registered: Jan 2002
Location: Scotland
Posts: 13497
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

Produkt der Gesellschaft
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 2786
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

Here to stay
Registered: Dec 2002
Location: Inside
Posts: 4548
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

Produkt der Gesellschaft
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 2786
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.
Bearbeitet von schizo am 14.11.2012, 00:31

Obermotz

Fünfzylindernazi
Avatar
Registered: Nov 2002
Location: OÖ/RI
Posts: 5262
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.
Bearbeitet von Obermotz am 14.11.2012, 09:06

schizo

Produkt der Gesellschaft
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 2786
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

Produkt der Gesellschaft
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 2786
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
Bearbeitet von schizo am 19.11.2012, 12:29

Obermotz

Fünfzylindernazi
Avatar
Registered: Nov 2002
Location: OÖ/RI
Posts: 5262
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

Produkt der Gesellschaft
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 2786
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

Here to stay
Registered: Dec 2002
Location: Inside
Posts: 4548
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

Fünfzylindernazi
Avatar
Registered: Nov 2002
Location: OÖ/RI
Posts: 5262
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
Bearbeitet von Obermotz am 19.11.2012, 12:33

schizo

Produkt der Gesellschaft
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 2786
Hab den vorigen Post editiert, thx :)

COLOSSUS

Administrator
GNUltra
Avatar
Registered: Dec 2000
Location: ~
Posts: 12434
Zitat von Obermotz
[...] den mächtigen Arrayfunktionen von PHP [...]

>:-D

Obermotz

Fünfzylindernazi
Avatar
Registered: Nov 2002
Location: OÖ/RI
Posts: 5262
Ich hab schon gewartet :D

// Aber wenn schon PHP dann bitte gscheid, so hab ichs gemeint ;)
Bearbeitet von Obermotz am 19.11.2012, 12:41
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz