Announcement

Collapse
No announcement yet.

Nach Datum sortieren - Einträge werden weggelassen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Nach Datum sortieren - Einträge werden weggelassen

    Hi, ich habe folgendes Problem:

    Ich habe hier in einer mySQL Datenbank mehrere Geburtsdaten aus einem Adressbuch. Diese will ich nun mit einem PHP Script abrufen, welches mir dann sagt, der und der hat morgen Geburtstag und so weiter. Natürlich ist es sinnvoll, diese Einträge auch nach Datum absteigend zu sortieren.


    So weit so gut. Ich rufe sie mit:
    PHP Code:
    $sql =     "SELECT surname, name, gbdatum FROM cdb_members " 
             
    "WHERE DATE_FORMAT(`gbdatum`, CONCAT(YEAR(CURDATE()), '-%m-%d')) " 
             
    "BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 10 DAY) ORDER BY MONTH(gbdatum) , DAY(gbdatum) ;"
    ab, dies funktioniert auch... fast
    Bei dieser Methode werden manche Einträge einfach weggelassen.
    Als Beispiel hat Onkel Fritz heute am 25.10 Geburtstag, ohne die Order by Clausel wird er angezeigt, mit dieser fehlt er aber...


    Achja, angezeigt werden sie mit PHP folgendermaßen:

    PHP Code:
            while($row mysql_fetch_row($erg)) {
                    for(
    $i=0,$m=count($arr);$i<$m;$i++) {
                    
                        
                    } 
                        
                    for(
    $i=0$i<mysql_num_fields($erg); $i++) {

                        switch (
    $i) {
                            case 
    0:
                                    echo 
    ""  $row[$i] . "  \n";
                                break;
                        
                            case 
    1:
                            
            echo 
    " "  $row[$i] . " hat am \n";
                                break;
                            case 
    2:
                            
    $d    =    explode("-",$row[$i]);
                            
                            echo 
    " "  $d[2] . "." $d[1] . " Geburtstag\n";
                            
                            
    $gbdate $d[2].".".$d[1];
                            if (
    $gbdate == $aktuellesDatum)
                            {
                            echo 
    " Heute!";
                            }
                            echo 
    "<BR>";
                                break;
                            default:
                                echo 
    "d "  $row[$i] . "<BR>\n";
                      } 
                    }
                    echo 
    "</tr>\n";
                } 


    Woran liegt es? Bei so einem Fehler kann ich ja nicht mehr davon ausgehen dass das Script vollständig funkioniert, ich kann ja nicht einfach den Geburtstag von meinem Onkel Fritz vergessen....

    Alfons

  • #2
    Wenn du das das Feld "gbdatum" als Datumsfeld in deiner Datenbank programmiert hast, dann brauchst du das umständliche umgeforme doch garnicht?
    Code:
    $sql =     "SELECT surname, name, gbdatum FROM cdb_members " 
             . "WHERE gbdatum > Now() AND gbdatum < DATE_ADD(CURDATE(), INTERVAL 10 DAY)"
    ." ORDER BY  gbdatum;";
    Damit werden alle angezeigt, die in den nächsten 10 Tagen geb haben!
    (ungetestet)

    PS: now() und Curdate() machen da keinen unterschied!

    Comment


    • #3
      gbdatum ist ein date Feld.

      Und dein SQL Code funktioniert nicht, da er das Jahr mit einbezieht.
      Code:
      gbdatum > Now()
      Das Geburtsdatum kann aber nicht größer sein als das aktuelle:
      1968-01-01 > 2010-10-25 ist damit negativ und wird nicht angezeigt.

      Es geht mir aber sowieso nur ums sortieren, im Prinzip wird es ja alles richtig angezeigt nur eben durcheinander und wenn ich so sortiere wie oben, dann nicht mehr vollständig

      Comment


      • #4
        oh ja sorry das mim Jahr hab ich echt voll verrafft xD

        du ehast also nur ORDER BY eingefügt ? Wenn dem so ist bin ich Ratlos sry...

        Das einzige was mir noch auffällt ist, dass du nicht angibst wie sortiert werden soll... aber daran wirds wohl nicht liegen ?

        Comment


        • #5
          du ehast also nur ORDER BY eingefügt ? Wenn dem so ist bin ich Ratlos sry...

          Das einzige was mir noch auffällt ist, dass du nicht angibst wie sortiert werden soll... aber daran wirds wohl nicht liegen ?
          Das weiß ich ja eben nicht, wenn ich das wüsste, bräuchte ich ja diesen Thread nicht

          Hast du, bzw. jemand denn noch einen Vorschlag womit, oder wie man das lösen kann. Habe auch schon mit ASC und DESC hantiert aber bin zu keinem zufriedenstellenden Ergebnis gekommen.

          Comment


          • #6
            Hallo,
            Originally posted by Alfons View Post
            ....ohne die Order by Clausel wird er angezeigt, mit dieser fehlt er aber...
            Das würde ich erstmal grundsätzlich ausschliessen! MySQL lässt nicht aufgrund einer ORDER BY Klausel Datensätze weg! Für den Ausschluss von DS ist ausschlieslich die WHERE-Klausel zuständig. In Verbindung mit LIMIT kann ORDER BY jedoch dafür sorgen, dass jeweils andere Einträge "geschluckt" (limitiert) werden.

            Ich würde den Fehler also eher in deinem PHP-Script suchen und mir das Ergebnis der Abfrage mal direkt von MySQL anzeigen lassen. (Entweder über die Konsole oder von PHPMyAdmin).

            Deinen PHP-Code hast du offensichtlich versucht so kompliziert wie möglich zu schreiben oder? Wofür ist die leere Schleife gut?
            PHP Code:
            for($i=0,$m=count($arr);$i<$m;$i++) {
                            
                                
                            } 
            Und mal ehrlich, das for-switch-case-Konstrukt ist der Hammer . Du liebst Schleifen, stimmts!

            Gruß Falk
            Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

            Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

            Comment


            • #7
              Hm, in der MySQL Konsole werden alle Einträge ausgegeben und auch richtig sortiert, aber woran kann es denn nun liegen, das mein PHP Code nicht stimmt?


              Schleifen sind was tolles jaa
              Aber naja was soll ich sagen, ich habe es so gelernt in den Tutorials die ich gelesen habe. Und an sich finde ich das Verfahren auch recht praktisch, da man mit der Switch-Case Methode das ganze einzeln durcharbeiten kann.

              Hier habe ich nochmal den kompletten PHP-Code, also auch mit den MySQL übergaben
              Spoiler:

              PHP Code:
              <?php
               
              include("../hidden/db_connect1.inc.php");  
              $aktuellesDatum date('d.m');
              $datumIn10Tagen date('d.m'strtotime('+10 day'));
              $aktuellesJahr  date('Y');


              $sql =     "SELECT surname, name, gbdatum FROM cdb_members " 
                       
              "WHERE DATE_FORMAT(`gbdatum`, CONCAT(YEAR(CURDATE()), '-%m-%d')) " 
                       
              "BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 10 DAY) ORDER BY MONTH(gbdatum) , DAY(gbdatum) ;";


              if(@
              mysql_connect($host$user$pwd)) {
                if(@
              mysql_select_db($dbname)) {
                  
              mysql_query("SET NAMES 'utf8';");
                  
              $erg mysql_query($sql);
                      
                      if (
              $erg) {

                      
              $gbleute mysql_fetch_array($ergMYSQL_ASSOC);
                      echo 
              "Geburtstage in den n&auml;chsten 10 Tagen: <BR><BR>\n";
                      
                  
                  
                  
                  
                  
                  
                  
                              while(
              $row mysql_fetch_row($erg)) {
                                  
                              for(
              $i=0$i<mysql_num_fields($erg); $i++) {

                                  switch (
              $i) {
                                      case 
              0:
                                              echo 
              ""  $row[$i] . "  \n";
                                          break;
                                  
                                      case 
              1:
                                      
                      echo 
              " "  $row[$i] . " hat am \n";
                                          break;
                                      case 
              2:
                                      
              $d    =    explode("-",$row[$i]);
                                      
                                      echo 
              " "  $d[2] . "." $d[1] . " Geburtstag\n";
                                      
                                      
              $gbdate $d[2].".".$d[1];
                                      
              $datumtom date('d.m'strtotime('+1 day'));
                                      
              $datumuetom date('d.m'strtotime('+2 day'));
                                      if (
              $gbdate == $aktuellesDatum)
                                      {
                                      echo 
              "<strong> Heute!</strong>";
                                      }
                                      
                                      if (
              $gbdate == $datumtom)
                                      {
                                      echo 
              "<strong> Morgen!</strong>";
                                      }
                                      
                                      if (
              $gbdate == $datumuetom)
                                      {
                                      echo 
              "<strong> Übermorgen!</strong>";
                                      }
                                      echo 
              "<BR>";
                                          break;
                                      default:
                                          echo 
              "d "  $row[$i] . "<BR>\n";
                                } 
                              }
                              echo 
              "</tr>\n";
                          }
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  }
                  }
                  else
                      echo 
              "<h5>Verbindung zur Datenbank ist im Moment nicht m&ouml;glich!</h5>\n";
                  
                  
              mysql_close();
              }
              else
                  echo 
              "<h5>Der Server ist wegen Wartungsarbeiten "
                  
              "vor&uuml;bergehend nicht erreichbar.</h5>\n";
              ?>



              EDIT:

              Ich hab das Problem gelöst und zwar habe ich
              PHP Code:
              $gbleute mysql_fetch_array($ergMYSQL_ASSOC); 
              auskommentiert nun zeigt er auch die 16 Einträge an, die auch die MySQL-Konsole ausgibt.
              Aber kann mir wer erklären warum das so ist?
              Zuletzt editiert von Alfons; 26.10.2010, 10:29.

              Comment


              • #8
                Originally posted by Alfons View Post
                ...Schleifen sind was tolles jaa
                Aber naja was soll ich sagen, ich habe es so gelernt in den Tutorials die ich gelesen habe. Und an sich finde ich das Verfahren auch recht praktisch, da man mit der Switch-Case Methode das ganze einzeln durcharbeiten kann.
                Wenn du das tatsächlich SO aus irgendwelchen Tutorials hast, dann schmeiss das Zeug weg und lass dir dein Geld wiedergeben . Das ist Murks und spätestens in 14 Tagen nicht mehr wartbar, weil du nicht mehr weisst was du da gemacht hast. Und wenn in deiner Abfrage ein Feld hinzukommt, bekommst du wahrscheinlich Zustände beim Anpassen der Ausgabe.

                Originally posted by Alfons View Post
                ...Ich hab das Problem gelöst und zwar habe ich
                PHP Code:
                $gbleute mysql_fetch_array($ergMYSQL_ASSOC); 
                auskommentiert nun zeigt er auch die 16 Einträge an, die auch die MySQL-Konsole ausgibt.
                Aber kann mir wer erklären warum das so ist?
                Du tust ja damit bereits den ersten Datensatz fetchen, also aus dem Cursor abholen. Da du diesen aber nicht weiter verwendest wird er quasi verworfen.

                Das ist als ob du ein Buch aufschlägst, zum Testen ob Seiten vorhanden sind schonmal die erste Seite umblätterst und dich dann wunderst das es auf der zweiten Seite losgeht.

                Gruß Falk
                Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                Comment


                • #9
                  Wenn du das tatsächlich SO aus irgendwelchen Tutorials hast, dann schmeiss das Zeug weg und lass dir dein Geld wiedergeben . Das ist Murks und spätestens in 14 Tagen nicht mehr wartbar, weil du nicht mehr weisst was du da gemacht hast. Und wenn in deiner Abfrage ein Feld hinzukommt, bekommst du wahrscheinlich Zustände beim Anpassen der Ausgabe.
                  Dazu sag ich nur:
                  Nur kleine Geister halten Ordnung, Genies überblicken das Chaos.

                  Achso stimmt, da hätte ich auch von selbst drauf kommen können...

                  Ich danke dir für deine Hilfe!

                  Comment

                  Working...
                  X