Ankündigung

Einklappen
Keine Ankündigung bisher.

$_POST Inhalte in Verhältnis bringen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • $_POST Inhalte in Verhältnis bringen

    Folgende Frage ob es eine bessere (elegantere) Lösung gibt als mein derzeitger Ansatz:

    Ich habe eine Liste mit Fussballspielen.. zu jedem Spiel kann man einen Tipp abgeben (2 Felder: TOR1 und TOR2). Beim absenden des form hab ich derzeit für jedes einzelne Feld ein INSERT/UPDATE in MySQL rein (Spalte TOR1 und TOR2).

    Ich hätte jetzt aber gerne noch eine weitere Prüfung drauf, das der Tipp nur in die DB geschrieben wird, wenn kein Feld der beiden leer ist, dann brauch ich ja beide gemeinsam.

    Ich hätte mir das so vorgestelle das ich in der Schleife wo ich den $_POST abfrage mir immer mir einer tempVar den vorigen Wert merke (wenn die TippID ident ist - siehe unten) und dann prüfe und dann - wenn ok - beide gemeinsam in die DB schick oder eben nichts mach wenn zB nur ein Feld der beiden gefüllt sind.

    Einen besseren Weg gibts da eh nicht, oder? Die POST-Daten kommen derzeit so daher (DBFeld-TippID).

    Array()
    [TippTor1-4064] => 9
    [TippTor2-4064] => 9
    [TippTor1-4063] => 5
    [TippTor2-4063] => 1
    [TippTor1-4062] => 3
    [TippTor2-4062] => 3
    [TippTor1-4061] => 0
    [TippTor2-4061] => 0
    [TippTor1-4060] => 0
    [TippTor2-4060] => 5

    Juergen
    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
    PHP.de Wissenssammlung | Kein Support per PN


  • #2
    PHP-Code:
    if ( !empty( $_POST['tor1'] ) and !empty( $_POST['tor2'] ) ) {
      
    $sql "INSERT INTO spiele (spiel,tor1,tor2) VALUES (...)";
      
    mysql_query($sql);

    PHP-Code:
    if ($var != 0) {
      
    $var 0;

    Kommentar


    • #3
      Es kommen nach submit ca. (70 x TOR1 + 70 x TOR2) 140 Felder = 140 POST-Array-Zeilen. Du meinst ich sollte die Schleife laufen lassen und immer bei einer neuen SpielID dann einfach mit der Nummer den dazugehörigen Post für Tor1 und Tor2 abfragen, versteh ich das richtig? Glaub das versuch ich mal.. hört sich gut an


      Übrigens - derzeit mach is es so:
      PHP-Code:
          foreach($_POST as $key => $value) {
              
              
      $key explode("-",$key);
              if ( !isset(
      $value) OR !ctype_digit($value) OR $value )
                  
      $value "NULL";

              
      $sql "INSERT INTO tabtipps
                      SET Nickname = '
      $LoggedInUser', 
                          SpielIDRef = 
      $key[1]
                          
      $key[0] = $value
                      ON DUPLICATE KEY UPDATE 
                          
      $key[0] = $value;";

              
      $result mysql_query($sql);
              if (
      mysql_error() <> "")
                  echo 
      "SQL Error: " mysql_error();
          } 
      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
      PHP.de Wissenssammlung | Kein Support per PN

      Kommentar


      • #4
        Zitat von hausl Beitrag anzeigen
        Es kommen nach submit ca. (70 x TOR1 + 70 x TOR2) 140 Felder = 140 POST-Array-Zeilen. Du meinst ich sollte die Schleife laufen lassen und immer bei einer neuen SpielID dann einfach mit der Nummer den dazugehörigen Post für Tor1 und Tor2 abfragen, versteh ich das richtig? Glaub das versuch ich mal.. hört sich gut an
        Der Aufbau der Daten ist schon Banane. Es wäre schlauer gewesen das ganze als Array zu formulieren das du so etwas bekommst:

        Code:
        Array {
         [4064] => array('Tor1' => xxx, "Tor2" => xxx);
         [4063] => array('Tor1' => xxx, "Tor2" => xxx);
        }
        oder

        Code:
        Array {
         [Tor1] => array('4064' => xxx, "4063" => xxx);
         [Tor2] => array('4064' => xxx, "4063" => xxx);
        }
        Dann würde eine simple Prüfung mit array_key_exists ausreichen um zu ermitteln ob beide Felder vorhanden sind.

        Bei deiner derzeitigen Prüfung musst du alle Schlüssel die mit TippTor2 beginnen in deiner foreach überspringen, den passen TippTor2 Schlüssel aus $key (welcher nur noch immer TippTor1-id enthält) zusammenbauen und prüfen ob der Wert für TippTor2-id in $_POST vorkommt.
        "Alles im Universum funktioniert, wenn du nur weißt wie du es anwenden musst".

        Kommentar


        • #5
          Zitat von Dark Guardian Beitrag anzeigen
          Der Aufbau der Daten ist schon Banane. Es wäre schlauer gewesen das ganze als Array zu formulieren das du so etwas bekommst:

          Code:
          Array {
           [4064] => array('Tor1' => xxx, "Tor2" => xxx);
           [4063] => array('Tor1' => xxx, "Tor2" => xxx);
          }
          Also genau so hab ich die Daten auch in der DB (TippID, UserID, SpielID, Tor1, Tor2), so würde ich es gerne machen, leider blick ich nicht ganz durch wo ich da ansetzten muss, schon beim benennen der Form-Felder oder erst beim auslesen des POST und wie .. hast nen Tipp wie/wo ich anfangen kann zu suchen..

          Juergen
          Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
          PHP.de Wissenssammlung | Kein Support per PN

          Kommentar


          • #6
            Ja, schon beim benennen der Formular-Felder.

            Ein Feld mit name="xyz[]" zu benennen, ergibt ein Array;
            und wenn du den Index schon vorgeben willst, kannst du auch name="xyz[4711]" oder name="xyz[abc]" verwenden.

            Damit bitte selber ein bisschen herumprobieren, und dabei immer wieder mit print_r/var_dump schauen, wie genau die Struktur der übermittelten POST-Daten aussieht.

            Kommentar


            • #7
              Ich habs nun hinbekommen, danke für die Hilfe..

              Solche bau ich jetzt unterm Strich im HTML dann:
              PHP-Code:
              ...
              <
              td><input type="text" name="4062[Tor1]" size="2" maxlength="2" value="" /></td>
              <
              td><input type="text" name="4062[Tor2]" size="2" maxlength="2" value="" /></td>
              ... 
              Und so übernehm ich es ins SQL
              PHP-Code:
                  foreach($_POST as $key => $value) {

                      for (
              $i 1$i <= 2$i++) {
                          
              // $value["Tor1"] und $value["Tor2"] checken
                          
              if ( !isset($value["Tor".$i]) OR !ctype_digit($value["Tor".$i]) OR $value["Tor".$i] < )
                              
              $value["Tor".$i] = "NULL";
                      }
                      
                      
              $sql "INSERT INTO tabtipps
                          SET Nickname = '
              $LoggedInUser', 
                              SpielIDRef = 
              $key
                              TippTor1 = "
              .$value['Tor1'].", 
                              TippTor2 = "
              .$value['Tor2'].
                          ON DUPLICATE KEY UPDATE 
                              TippTor1 = "
              .$value['Tor1'].",
                              TippTor2 = "
              .$value['Tor2'].";";

                      
              $result mysql_query($sql);
               
                      if (
              mysql_error() <> "") {
                          echo 
              "<p><b>SQL Error:</b></p>";
                          
              dump('$sql');
                          echo 
              "<br>".mysql_error();
                      }
                  } 
              Juergen
              Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
              PHP.de Wissenssammlung | Kein Support per PN

              Kommentar


              • #8
                MySql Query in der Schleife, da freut sich der Server

                Kommentar


                • #9
                  Ja ich bereite denen gerne eine Freude

                  Aber im ernst.. wie denn sonst? Ich muss den $_POST durchlaufen und die Inhalte dann in der DB updaten.. und vorher EINEN Query bauen und den dann in die DB schiessen kann ich nicht.. mir reicht das SQL Satement schon so.. bin froh das es so funzt...

                  Juergen
                  Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                  PHP.de Wissenssammlung | Kein Support per PN

                  Kommentar


                  • #10
                    Eine Frage dazu noch wegen Performance...

                    Angenommen ich habe 320 User x ca. 70 Tipps dann sind das gut 20.000 Einträge in der Tipp-Tabelle.

                    Wenn ich derzeit die Punkte *je User* berechne dann hab ich im ResultSet eine Schleife in php für Berechnung nach Punkteschema je Spiel (zB für richitgen 1-2-X tipp 2 Punkte und wenn genau erraten dann 3 Puntke).

                    Jetzt muss ich noch ein gesamt Ranking aller 300 User machen und bin gerade am überlegen ob es nicht etwas besseres gibt als das ich das in 2 Schleifen mache so wie oben für jeden User einzeln das obige Schema .. also 300 User x 70 Tipps jeweils zur Laufzeit (bei Seitenaufruf) berechnen.

                    Was meint ihr kann man da was sagen von der Performance ob das geht, weil wenn nicht dann mach ich das gar nciht so sondern lass mir was einfallen, das ich irgendwo die Einzel-Punkte abstelle.. irgendwie ..

                    Juergen
                    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                    PHP.de Wissenssammlung | Kein Support per PN

                    Kommentar

                    Lädt...
                    X