Dropdown Auswahl, brauche Denkanstoss

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

  • Dropdown Auswahl, brauche Denkanstoss

    Hallo zusammen,
    ich bräuchte bitte einen Denkanstoss, wie ich das umsetzen muss.

    Ich habe ein Dropdown mit Monatsauswahl. Wird hier z.b. der Januar ausgewählt und auf submit gedrückt, übergebe ich den Monat per

    if post

    in meine SQL Abfrage.
    Das funktioniert alles wunderbar.

    Ich möchte aber, wenn jemand auf die Seite geht, dass der aktuelle Monat bereits angezeigt wird. Wie ich den Monat abfrage usw. ist nicht das Problem, nur wie sage ich php / der SQL Abfrage, dass

    WHERE MONTH(datum) = '".$monat."'

    $monat immer der aktuelle Monat ist, ausser es wird im Dropdown etwas ausgewählt.

    Ich bin kein Proggi, schaffe aber gewisse Dinge in php und mysql. Ich weiß nicht, muss ich das mit einer if/else machen oder ganz anders?

    Kann mir da jemand einen Denkanstoß geben, nachwas ich da suchen muss, oder was ich verwenden muss.

    Danke schon mal

  • #2
    Hallöchen.

    Denkanstoss;
    - Befasse dich mit OPTION in HTML-Formularen. Dort kannste Vorselectieren
    - Befasse dich mit PHP-Timestamp = Heute = Monat. Diesen dann in deine Form

    Gruss WW

    P.S.
    Nutze eine Suchmaschine deiner Wahl

    Kommentar


    • #3
      Danke Wasser_Wanderer.

      Ok, dann muss ich doch Teile meines Codes posten :-)

      HTML-Code:
      <form method="post" action=""> 
         <select name="tab">
           <option value="null" selected="selected">Bitte ausw&auml;hlen</option>
           <option value="214">Februar</option>
           <option value="114">Januar</option>
           <option value="null">-----</option>
           <option value="1213">Dezember</option>
           <option value="1113">November</option>
         </select>
         <input type="submit" name="submit" value="OK">
      </form>
      PHP-Code:
      <?
         if($_POST['tab'] == 214)
           {
             $monat=2;
             $year=2014;
           }
         if($_POST['tab'] == 114)
          {
            $monat=1;
            $year=2014;
          }

      usw...
      PHP-Code:
      $query mysql_query("
      SELECT datum, wochentag, infotext
      FROM test_tabelle
      WHERE MONTH(datum) = '"
      .$monat."'
      AND YEAR(datum) = '"
      .$year."'
      ORDER BY datum DESC"
      ); 
      So. Hab ein Dropdown. Hier kann man den Monat auswählen. Wenn einer ausgewählt wird, zeigt es mir alle Daten von der DB-Tabelle an. Ich möchte aber, dass wenn ich die Seite aufrufe, gleich Daten vom aktuellen Monat angezeigt werden.
      Heisst: In meiner sql Abfrage muss $monat nicht durch das Dropdown, sonder als erstes mit dem aktuellen Monat abgefragt werden.

      Meine Frage und den Denkanstoss den ich brauche, wie setze ich das um.
      Ich vermute, dass ich dem sql sagen muss, frage aktuellen Monat ab, ausser es wird im Dropdown etwas ausgewählt.
      Und genau hier hänge ich.
      Hey sql, Monat ist "aktuell", ausser Dropdown Auswahl wurde getroffen.

      Macht man das in einer if /elseif / else Schleife, oder wird das ganz anders gemacht?

      Daher dein Ansatz mit OPTION und TIMESTAMP hatte ich ja umgesetzt..

      Kommentar


      • #4
        Ist doch ganz simpel: Du setzt Default-Werte, die angewendet werden, wenn keine spezielle Auswahl getroffen wurde.

        Setze $monat und $jahr einfach am Scriptanfang auf den aktuellen Monat und das aktuelle Jahr. Wenn diese Werte dann nicht in deiner Auswertung der POST-Parameter überschrieben werden (weil keine Auswahl per POST übergeben wurde) – dann hast du die aktuellen Werte zu dem Zeitpunkt, wo du die Variablen in dein SQL-Statement einsetzt.


        Das erfordert doch gar nicht so viel logisches Denken, hm?
        I don't believe in rebirth. Actually, I never did in my whole lives.

        Kommentar


        • #5
          Hi mbspeedy,

          ein paar allgemeine Tipps:
          1.) Versuch auf direktes MySQL via mysql_* zu verzichten. Es ist deprecated und wird in einer zukünftigen Version von PHP entfernt.
          2.) Mir ist nicht ganz klar, warum du eine bestimmte Zahl für bestimmte Monate verwenden musst. Wäre die Übergabe der Monatszahl nicht einfacher? (Beispiel dazu kommt gleich)
          3.) Wenn du auf 2.) nicht verzichten kannst (warum auch immer), würde ich dir die Verwendung von switch-case empfehlen.
          4.) Wie wahsaga schon sagte, ich das eigentlich nicht so schwer. Setze einfach einen Default-Value und verwende den, sollte es kein POST geben.

          Hier mal ein kurzes Beispiel für 2.) :
          PHP-Code:
          <?php
              
          // Aktuelles Datum ermitteln
              
          $Jahr date"Y" );
              
          $Monat date"m" );

              
          // Liste aller IDs festlegen
              
          $MonatsID = array(
                   
          => 114,
                   
          => 214,
                  
          11 => 1113,
                  
          12 => 1213
              
          );

              
          // Vom Benutzer festgelegt
              
          if ( $_SERVER["REQUEST_METHOD"] == "POST" ) {
                  
          // Monat aus der Post Abfrage filtern
                  
          $TmpMonat filter_inputINPUT_POST "tab"FILTER_VALIDATE_INT );

                  if ( (
          $TmpMonat >= 1) && (!empty( $MonatsID$TmpMonat ])) ) {
                      
          $Monat $TmpMonat;
                  }
              }

              
          // Zugriff auf die Monats-ID
              
          echo $MonatsID$Monat ];

              
          // Hier dann deine Datenbank-Abfrage
          ?>
          Ich hab ein paar Kommentare hinzugefügt. Ich hoffe, das hilft ein wenig. Doch Achtung! Nicht getestet. Nur NetBeans hat das gegengeprüft. ;-)

          Gruß
          Chris

          Kommentar


          • #6
            Hallo anihex,

            danke für deine Antwort.

            1.) Versuch auf direktes MySQL via mysql_* zu verzichten. Es ist deprecated und wird in einer zukünftigen Version von PHP entfernt.
            Ist das mit dem mysqli das neuere?? Würde das dann wieder gehen?

            2.) Mir ist nicht ganz klar, warum du eine bestimmte Zahl für bestimmte Monate verwenden musst. Wäre die Übergabe der Monatszahl nicht einfacher? (Beispiel dazu kommt gleich)
            Ich habs nicht besser gewusst. Hab im Dropdown Menü die Auswahl der Monate. Januar wurde mit der Zahl z.B. 114 (Januar 2014) versehen. Und diese Zahl frage ich dann in meinem
            PHP-Code:
            if($_POST['tab'] == 114
            ab. Daher die Zahlen. Macht man das anders??

            3.) Wenn du auf 2.) nicht verzichten kannst (warum auch immer), würde ich dir die Verwendung von switch-case empfehlen.
            Wenn man es anders löst, dann bin ich darauf nicht angewiesen.

            4.) Wie wahsaga schon sagte, ich das eigentlich nicht so schwer. Setze einfach einen Default-Value und verwende den, sollte es kein POST geben.
            Hab ich gestern schon rumprobiert. Ich muss aber zugeben, ich weiß nicht wo ich das dann einfügen soll. Es hat mir auf meiner Seite dann immer das echo ausgegeben (hingeschrieben)

            PHP-Code:
            $monattime();
            $datum date("n"$monat);
            echo 
            $datum;
                                        
            $yeartime();
            $datum date("Y"$year);
            echo 
            $datum
            Das habe ich mal über die IF Anweisung hingeschrieben. Und natürlich wird das echo dann auf die Seite geschrieben.
            Ich habs noch nicht geblickt, wie ich diese Zeitabfrage in meine sql Abfrage reinbringe..

            Für mich eine verzwickte Sache.

            Wenn ich mir deine Hilfe anschaue, versteh ich ja auch nicht alles..
            PHP-Code:
            REQUEST_METHOD 
            Weiß z.B. nicht was das bewirkt oder macht.
            php kann eigentlich so einfach sein, aber bei manchen Sachen merkt man wieder: ungelernt und ein Depp.

            Ich such übrigends immer die Suchmaschinen durch, wenn ich was will und schau mir Seiten an, wo jemand das erklärt.. mehr oder weniger.
            Aber meistens ist es dann so, ich brauch das nur ungefähr und ein zwei Dinge anders und schon ist das für mich wieder zu schwierig.

            Ich mach es immer so: Schauen wie wurden andere Dinge umgesetzt. Was kann ich davon verwenden. Ausprobieren und schauen was passiert. Geht nicht? Anders ausprobieren. Irgendwann geht es, oder ich find ne andere Lösung, oder ich lass es bleiben...

            Daher noch einmal: Danke für die Hilfe!
            Zuletzt geändert von mbspeedy; 27.02.2014, 14:31.

            Kommentar


            • #7
              Hallo mbspeedy,

              zu 1.): Die mysql_* Abfragen sind - wie gesagt - veraltet und werden in einer späteren Version entfernt. MySQLi (=MySQL improved) ist eine etwas bessere Variante. Man kann sie prozedual (also wie mysql_*) nutzen.
              Der Vorteil ist jedoch, dass man sie auch Objekt orientiert (=OOP) verwenden kann.
              PDO (=PHP Database Object) ist ein allgemein gültiges Datenbank-Objekt. Wie der Name schon vermuten lässt, ist auch hier OOP angesagt. Dafür kann man PDO aber für MySQL, SQLite, MS SQL etc. verwenden (Nur die Abfragen selbst müsste man umgestalten).
              Weil PDO komplett OOP ist (im Gegensatz zu MySQLi) würde ich dies bevorzugen.
              Peter hat auf seiner Website sehr viele Informationen dazu, die auch gut erklärt sind. (Meiner Meinung nach)

              Zu 2.): Jetzt verstehe ich den Aufbau deines Formulars (denke ich jedenfalls).
              In deinem Beispiel gibt es ein Problem.
              Du gehst davon aus, dass die Seite auf jeden Fall über eine POST-Abfrage aufgerufen wird. Das ist aber natürlich nicht immer gewähleistet.
              Daher setzt man erstmal Default-Werte. In meinem Beispiel sind das diese Zeilen: (Korrigiert)
              PHP-Code:
                  // Aktuelles Datum ermitteln
                  
              $Jahr date"Y" );
                  
              $Monat date"n" ); 
              Wie du siehst, rufe ich die Funktion "date" auf und übergebe ihr nur ein Format an das sie sich halten soll. Das hat einen einfachen Grund: Übergebe ich der Funktion keinen Timestamp, wird die aktuelle Zeit benutzt. Und durch "Y" bzw. "n" bekomme ich das aktuelle Jahr (vierstellig) bzw. den Monat (ohne führende Null).
              Mit diesen Werten wird das Skript nun arbeiten. Es sei denn, der Nutzer hat über POST andere Werte übermittelt.
              Seiten können dabei über POST oder GET aufgerufen werden. GET ist dabei der Standard. Sollte die Seite aber über POST aufgerufen werden (z.B. über ein Formular), dann enthält die Superglobale $_SERVER einen Hinweis darauf. Was eine Superglobale ist, hat Peter im Abschnitt "Grundlagen" erklärt.
              Eines der möglichen Werte hierbei ist "REQUEST_METHOD". Dort ist dann entweder POST oder GET enthalten.
              Sollte die Seite nun über POST aufgerufen werden (und nur dann), dann versuchen wir einen Wert auszulesen.
              PHP-Code:
                      // Monat aus der Post Abfrage filtern
                      
              $TmpMonat filter_inputINPUT_POST "tab"FILTER_VALIDATE_INT ); 
              Um den Wert von $Monat nicht blindlings zu überschreiben, speichern wir den Wert erstmal in einer temporären Variable. Die Funktion "filter_input" übernimmt in diesem Fall so ziemlich alles, was wir sonst manuell machen müssten.
              Als da wären:
              - Prüfen ob das Feld gesetzt ist
              - Sicherstellen, dass der Wert eine Zahl ist
              Solltest du dich fragen: "Wie? Prüfen ob das Feld gesetzt ist? Das Formular enthält die Daten doch!", dann lass mich dir Folgendes sagen: Die Daten könnten von überall kommen. Nicht nur von deinem Formular. Daher gilt: Prüfen, prüfen, prüfen!
              Oberste Regel lautet: "Misstraue deinem Nutzer." Klingt hart, aber nur so kannst du Angriffe versuchen vorzubeugen.

              Kommen wir zum letzten Schritt in der Überprüfung:
              PHP-Code:
                      if ( ($TmpMonat >= 1) && (!empty( $MonatsID$TmpMonat ])) ) {
                          
              $Monat $TmpMonat;
                      } 
              Hier wird nun geprüft, ob $TmpMonat einen gültigen Wert hat. Denn nach der Wertzuweisung durch filter_input hat $TmpMonat eines von drei möglichen Werten:
              - false
              - NULL
              - Einen Integer
              In den ersten beiden Fällen ist $TmpMonat (als Zahl betrachtet) unter 1. Im Fall, dass $TmpMonat mindestens 1 ist, wird versucht den Monat in der Tabelle möglicher Monats-IDs zu finden. Und nur wenn der Monat auch dort gefunden wird, bekommt $Monat den Wert von $TmpMonat.

              Da du die ID ja nicht brauchst, kannst du auch einen Bereichs-Check durchführen.
              Also
              PHP-Code:
                      if ( ($TmpMonat >= 1) && ($TmpMonat <= 12) ) {
                          
              $Monat $TmpMonat;
                      } 
              Allerdings ist mir vorhin aufgefallen, wäre es vielleicht besser, wenn man den Wert von $TmpMonat vorher auf jeden Fall zu einem Integer umwandelt.
              intval bietet sich hierfür eigentlich an.
              Hier nochmal der komplette Code. Aber ein wenig korrigiert und angepasst.
              PHP-Code:
               <?php
                  
              // Aktuelles Datum ermitteln
                  
              $Jahr date"Y" );
                  
              $Monat date"n" );

                  
              // Vom Benutzer festgelegt
                  
              if ( $_SERVER["REQUEST_METHOD"] == "POST" ) {
                      
              // Monat aus der Post Abfrage filtern
                      
              $TmpMonat intvalfilter_inputINPUT_POST "tab"FILTER_VALIDATE_INT ) );

                      if ( (
              $TmpMonat >= 1) && ($TmpMonat <= 12) ) {
                          
              $Monat $TmpMonat;
                      }
                  }

                  
              // Zugriff auf die Monats-ID
                  
              echo $MonatsID$Monat ];

                  
              // Hier dann deine Datenbank-Abfrage
              ?>
              Ich hoffe das hilft dir ein wenig weiter.
              Zuletzt geändert von anihex; 27.02.2014, 15:24. Grund: Zu früh auf "Abschicken" geklickt. Post vervollständigt.

              Kommentar


              • #8
                Zitat von mbspeedy Beitrag anzeigen
                PHP-Code:
                $monattime();
                $datum date("n"$monat);
                echo 
                $datum;
                                            
                $yeartime();
                $datum date("Y"$year);
                echo 
                $datum
                Das habe ich mal über die IF Anweisung hingeschrieben. Und natürlich wird das echo dann auf die Seite geschrieben.
                Ich habs noch nicht geblickt, wie ich diese Zeitabfrage in meine sql Abfrage reinbringe..
                [FONT="Courier New"]time()[/FONT] brauchst du nicht, [FONT="Courier New"]date[/FONT] nimmt automatisch den aktuellen Zeitpunkt wenn du keinen zweiten Parameter angibst.

                Und [FONT="Courier New"]$monat[/FONT] und [FONT="Courier New"]$jahr[/FONT] sind die Variablen, die du mit den zum aktuellen Datum gehörenden Werten vorbelegen sollst.

                In deine SQL-Anweisung „reinbringen” brauchst du die nicht mehr extra – du hast sie doch bereits drin!

                Ich mach es immer so: Schauen wie wurden andere Dinge umgesetzt. Was kann ich davon verwenden. Ausprobieren und schauen was passiert. Geht nicht? Anders ausprobieren.
                Das ist zwar OK – aber du solltest auch immer im Handbuch nachlesen, wenn dir nicht klar ist, was eine bestimmte Funktion macht.
                I don't believe in rebirth. Actually, I never did in my whole lives.

                Kommentar


                • #9
                  @anihex
                  Jetzt hab ich schon in ein paar Foren gelesen, dass Mitglieder angeschnautzt werden mit: Schau in das Handbuch, mach dich mit den Grundlagen vertraut.
                  Du aber, nimmst dir die Zeit und erklärst es mir noch!!!

                  Dafür ein dickes !!!!! Vielen Dank.


                  @wahsaga
                  auch dir ein herzliches Dankeschön für deine Hilfe.
                  Auch wenn nun doch das Handbuch angesprochen wird ;-)
                  Manchmal lese ich es, verstehe es aber nicht.
                  Wenn ich sehe, wie was umgesetzt wird und sehe was dabei rauskommt, kann ich das nachvollziehen und weiß dann auch wie ich es anwenden muss/kann.

                  Aber auch dir: Vielen Dank!


                  Ich werde mir jetzt anihex Antwort zu Gemüte führen und das versuchen richtig umzusetzen.
                  Wenn ich nicht weiterkomme, oder eine Frage habe, melde ich mich wieder.
                  Hab ich es hinbekommen, werde ich mich auch noch einmal melden.

                  Kommentar


                  • #10
                    So, ich meld mich doch schon eher.
                    Hab jetzt nur das mit angefügt
                    PHP-Code:
                    // Aktuelles Datum ermitteln
                    $year date"Y" );
                    $monat date"n" ); 
                    und schon funktioniert es wie ich es möchte!!
                    Ich sag ja, es kann so einfach sein!

                    Aber..
                    @anihex, muss ich dennoch das von dir aufgeführte umsetzen?
                    Ist nur für interne Zwecke und es kommt kein User daran..
                    PHP-Code:
                    // Monat aus der Post Abfrage filtern
                            
                    $TmpMonat filter_inputINPUT_POST "tab"FILTER_VALIDATE_INT ); 

                    usw... 
                    Ich denke, die Frage kann ich mir selbst beantworten.
                    Ja ich muss, damit es richtig ist, oder?

                    Kommentar


                    • #11
                      Es gibt kein "richtig" in der Programmierung. Nur "anders". Das ist jedenfalls meine Meinung.
                      Auf filter_input wurde ich durch meinen Editor (NetBeans) aufmerksam. Der riet mir nämlich, auf die Superglobalen nicht direkt, sondern durch filter_input zuzugreifen.
                      Da filter_input für mich die Daten validieren oder filtern kann, gefiel mir das auf Anhieb.
                      Wenn du aber sicher bist, dass das niemals. Online geht und deine Kollegen (sollte es nicht nur für dich sein), kein Schindluder damit treiben, bleibt es dir überlassen ob du die Daten prüfst.
                      Ich persönlich würde es zwar tun, schon allein damit ich gegen gewisse dumme User (=mich ) geschützt bin.

                      Und es freut mich, wenn ich dir ein wenig helfen konnte.

                      Kommentar

                      Lädt...
                      X