In einer Spalte nach dem DATE suchen, das am nähsten zurück liegt

Collapse
This topic is closed.
X
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • #46
    hmm,

    so das hab ich jetzt mal schnell reingehackt und auch nicht testen können, es sollte eigentlich machen was du willst, wenn fragen auftauchen oder fehler bitte posten wir kümmern uns darum :



    Code:
    <?php
    
    $heutejahr = date("Y",time());
    
    $heute = date("d.m.Y",time());
    
    $timerer = date("m",time());
    
    $timererer = date("d",time());
    
    $timestamp = mktime(0,0,0,$timererer,$timerer,$heutejahr);
    
    $conn = mysql_connect("datenbankserver","masteruser","masterpass");
    
    if ($conn)
    
            {
    
                    $sel = mysql_select_db("datenbankname",$conn);
    
                    $query = "SELECT name, tag FROM jahrgangsstufe";
    
                    $result = mysql_query($query,$sel);
    
                    $anzahl = 1;
    
                    while ($zeileholen = mysql_fetch_array( $result, MYSQL_ASSOC ))
    
                            {
    
                                    $schueler[$anzahl]["name"] = $zeileholen["name"];
    
                                    $schueler[$anzahl]["tag"] = $zeileholen["tag"];
    
                                    $anzahl++;
    
                            }
    
                    $anzahl--;
    
                    for ($i=1;$i<=$anzahl;$i++)
    
                            {
    
                                    $datum = explode ("-",$schueler[$i]["tag"]); //splittet das Datum auf, wir brauchen nur tag und Monat
    
                                    $schueler[$i]["timestamp"] = mktime(0,0,0,$datum[1],$datum[2],$heutejahr); // jeder bekommt ein   timestamp in diesem Jahr
    
                             }
    
                     for ($i=1;$i<=$anzahl;$i++)
    
                            {
    
                                    $schueler[$i]["abgerechnet"] = $timestamp - $schueler[$i]["timestamp"]  // jetzt wird heute abgezogen
    
                             }
    
                     // so jetzt haben wir schonmal eine Liste , jetzt muss sie sortiert werden.
    
                     // zuerst die postiven Absteigend, dann die negativen vom kleinsten an.
    
                     // denn ddas geht dann ja von 31.12. runter auf heute.
    
                     $positiv = 0;
    
                     $negativ = 0;
    
                     $heute  = 0;
    
                     for ($i=1;$i<=$anzahl;$i++)
    
                            {
    
                                    if ( $schueler[$i]["abgerechnet"] > 0)
    
                                            {
    
                                                    $positiv++;
    
                                            }
    
                                    if ( $schueler[$i]["abgerechnet"] < 0)
    
                                            {
    
                                                    $negativ++;
    
                                            }
    
                            }
    
                     for ($i=1;$i<=$anzahl;$i++)
    
                            {
    
    
    
                                    if ($schueler[$i]["abgerechnet"] == 0)
    
                                            {
    
                                                    echo $schueler[$i]["name"]." hat heute Geburtstag<br>";
    
                                            }
    
                            }
    
    
    
                     for ($i=1;$i<=$positiv;$i++)
    
                            {
    
                                    $momstand = 1000*24*60*60;  // 1000 Tage gibt es nicht
    
                                    $aktuell = 0;
    
                                    for($n=1;$n<=$anzahl;$n++)
    
                                            {
    
                                                    if ($schueler[$n]["abgerechnet"] > 0)
    
                                                            {
    
                                                                    if ($schueler[$n]["abgerechnet"] < $momstand)            // wir suchen den kleinsten Abstand zu heute
    
                                                                            {
    
                                                                                    $momstand =  $schueler[$n]["abgerechnet"];
    
                                                                                    $aktuell = $n;
    
                                                                            }
    
                                                            }
    
                                            }
    
                                    echo $schueler[$aktuell]["name"]."<br>";
    
                                    $schueler[$aktuell]["abgerechnet"] = 0;
    
                            }
    
                        for ($i=1;$i<=$negativ;$i++)
    
                            {
    
                                    $momstand = 0  // 1000 Tage gibt es nicht
    
                                    $aktuell = 0;
    
                                    for($n=1;$n<=$anzahl;$n++)
    
                                            {
    
                                                    if ($schueler[$n]["abgerechnet"] < 0)
    
                                                            {
    
                                                                    if ($schueler[$n]["abgerechnet"] < $momstand)            // wir suchen die kleinste Zahl
    
                                                                            {
    
                                                                                    $momstand =  $schueler[$n]["abgerechnet"];
    
                                                                                    $aktuell = $n;
    
                                                                            }
    
                                                            }
    
                                            }
    
                                    echo $schueler[$aktuell]["name"]."<br>";
    
                                    $schueler[$aktuell]["abgerechnet"] = 0;
    
                            }
    
    
    
    
    
    ?>

    Comment


    • #47
      Oh, wow, krass :-) Edle Sache... ich hab noch bis um 4 Vorlesung, und dann setz ich mich gleich an den Rechner und probiere das. Riesen Großen Dank erstmal für deine Hilfe... aber ich freu mich mal nicht zu früh :-) Es taucht bestimmt noch ein Problem auf... :-))) ich melde mich. Thanx

      (P.S. Ich glaube dieser Thread ist ein neuer Rekord!?)

      Comment


      • #48
        hmm,

        das hab ich mal überhört, in meinen Scripten tauchen keine Probleme auf, meine Scripts sind Probleme

        Comment


        • #49
          hmmm,

          so , es hatten sich wirklich Syntaxbugs eingeschlichen, naja und auch unkreative Logikbugs, da ich keine SQL DB da habe hab ich jetzt etwas improvisiert. Dieses Script funzt es ist halt ohne DB sprich ich hab das Array das von der DB kommt simuliert, dafür funzt das Script jetzt perfekt, man kann halt nicht alles haben.
          Code:
          <?php
          $heutejahr = date("Y",time());
          $heute = date("d.m.Y",time());
          $timerer = date("m",time());
          $timererer = date("d",time());
          $timestamp = mktime(0,0,0,$timerer,$timererer,$heutejahr);
          $conn = true;
          if ($conn)
                  {
                          $zeileholen["name"][1] = "Korry Solderknall";
                          $zeileholen["tag"][1] = "1973-04-23";
                          $zeileholen["name"][2] = "Harry Hirsch";
                          $zeileholen["tag"][2] = "1973-06-23";
                          $zeileholen["name"][3] = "Joe Knödel";
                          $zeileholen["tag"][3] = "1980-02-22";
                          $zeileholen["name"][4] = "Colin Raglett";
                          $zeileholen["tag"][4] = "1921-11-27";
                          $zeileholen["name"][5] = "Karl Napp";
                          $zeileholen["tag"][5] = "1969-12-23";
                          $zeileholen["name"][6] = "Salem Unteruns";
                          $zeileholen["tag"][6] = "1969-12-02";
                          $anzahl = 1;
                         $doedel=1;
                         while($doedel<=6)
                                  {
                                          $schueler[$anzahl]["name"] = $zeileholen["name"][$doedel];
                                          $schueler[$anzahl]["tag"] = $zeileholen["tag"][$doedel];
                                          $anzahl++;
                                          $doedel++;
                                  }
                          $anzahl--;
                          for ($i=1;$i<=$anzahl;$i++)
                                  {
                                          $datum = explode ("-",$schueler[$i]["tag"]); //splittet das Datum auf, wir brauchen nur tag und Monat
                                          $schueler[$i]["timestamp"] = mktime(0,0,0,$datum[1],$datum[2],$heutejahr); // jeder bekommt ein   timestamp in diesem Jahr
                                  }
                           for ($i=1;$i<=$anzahl;$i++)
                                  {
                                          $schueler[$i]["abgerechnet"] = $timestamp - $schueler[$i]["timestamp"];  // jetzt wird heute abgezogen
                                   }
                           // so jetzt haben wir schonmal eine Liste , jetzt muss sie sortiert werden.
                           // zuerst die postiven Absteigend, dann die negativen vom kleinsten an.
                           // denn ddas geht dann ja von 31.12. runter auf heute.
                           $positiv = 0;
                           $negativ = 0;
                           $heute  = 0;
                           for ($i=1;$i<=$anzahl;$i++)
                                  {
                                          if ( $schueler[$i]["abgerechnet"] > 0)
                                                  {
                                                          $positiv++;
                                                  }
                                          if ( $schueler[$i]["abgerechnet"] < 0)
                                                  {
                                                          $negativ++;
                                                  }
                                  }
                           for ($i=1;$i<=$anzahl;$i++)
                                  {
          
                                          if ($schueler[$i]["abgerechnet"] == 0)
                                                  {
                                                          echo $schueler[$i]["name"]." hat heute Geburtstag<br>";
                                                  }
                                  }
          
                           for ($i=1;$i<=$positiv;$i++)
                                  {
                                          $momstand = 1000*24*60*60;  // 1000 Tage gibt es nicht
                                          $aktuell = 0;
                                          for($n=1;$n<=$anzahl;$n++)
                                                  {
                                                          if ($schueler[$n]["abgerechnet"] > 0)
                                                                  {
                                                                          if ($schueler[$n]["abgerechnet"] < $momstand)            // wir suchen den kleinsten Abstand zu heute
                                                                                  {
                                                                                          $momstand =  $schueler[$n]["abgerechnet"];
                                                                                          $aktuell = $n;
                                                                                  }
                                                                  }
                                                  }
                                          echo $schueler[$aktuell]["name"]."<br>";
                                          $schueler[$aktuell]["abgerechnet"] = 0;
                                  }
                              for ($i=1;$i<=$negativ;$i++)
                                  {
                                          $momstand = 0;  // 1000 Tage gibt es nicht
                                          $aktuell = 0;
                                          for($n=1;$n<=$anzahl;$n++)
                                                  {
                                                          if ($schueler[$n]["abgerechnet"] < 0)
                                                                  {
                                                                          if ($schueler[$n]["abgerechnet"] < $momstand)            // wir suchen die kleinste Zahl
                                                                                  {
                                                                                          $momstand =  $schueler[$n]["abgerechnet"];
                                                                                          $aktuell = $n;
                                                                                  }
                                                                  }
                                                  }
                                          echo $schueler[$aktuell]["name"]."<br>";
                                          $schueler[$aktuell]["abgerechnet"] = 0;
                                  }
          
             }
          ?>
          PS: Optimierer werden gesucht, sollte nicht schwer sein

          Comment


          • #50
            Respekt!

            CAT Music Files

            Comment


            • #51
              naja,

              ich denke der Code ist verständlich, aber so performand wie Gummistiefel beim 100m Lauf. Die ganzen schleifen kann man zu zwei kürzen denke ich im optimierungswahn und wenn ich endlich mal durch die MULTISORT Funktion durchsteigen würde dann wäre es eine Sache von der 1/4 Codelänge glaub ich.

              Comment


              • #52
                Ja, also ich würd sagen, 1A. Soweit funktioniert das supi, Nur... ich will ja nicht jeden einzeln eintragen... sondern das ganze von einer MySQL Datenbank beziehen. Im ersten Beispiel war ein DBconnect mit drin, ich hab versucht das irgendwie zu verbinden, aber es ist mir nicht gelungen... wer könnte das übernehmen? (jetzt sind wieder die mysql profis gefragt... :-) sky? thanx

                Comment


                • #53
                  Dazu bedarf es gar keines Profis, das ist nicht schwer...


                  $conn = mysql_connect($dbhost,$dbuser,$dbpass);

                  if ($conn) {
                  mysql_select_db($dbname,$conn);

                  $resid = mysql_query("SELECT namensspalte,datumsspalte FROM tabelle");

                  for ($i=1;$i<mysql_num_rows($resid);$i++) {
                  $tempdata = mysql_fetch_array($resid);
                  $zeileholen["name"][$i] = $tempdata[namenspalte];
                  $zeileholen["tag"][$i] = $tempdata[datumspalte];
                  }
                  $anzahl = 1;
                  $doedel = 1;
                  while($doedel<=mysql_num_rows($resid))
                  {

                  Ab da weiter wie bisher. Die Spaltennamen, den Tabellennamen und die Datenbankvariablen musst du natürlich noch anpassen.

                  CAT Music Files

                  Comment


                  • #54
                    Danke, soweit so gut...

                    nun scheint der connect zu funktionieren, aber folgender Fehler wird ausgespuckt:

                    Warning: Supplied argument is not a valid MySQL result resource in /kunden/larsi.net/webseiten/abi2001/anfang.php on line 36

                    und auch auf Line43

                    (siehe auch http://www.larsi.net/abi2001/anfang.php)

                    die betreffenden Zeilen sind diese hier:

                    for ($i=1;$i<mysql_num_rows($resid);$i++) {

                    und

                    while($doedel<=mysql_num_rows($resid))

                    was kann da schief laufen?

                    Comment


                    • #55
                      Dann ist deine Query wohl nicht in Ordnung... Poste sie mal kurz.

                      Hm, und noch ein kleiner Fehler meinerseits:

                      for ($i=1;$i<=mysql_num_rows($resid);$i++) {

                      muss es heißen.

                      CAT Music Files

                      Comment


                      • #56
                        <?php
                        $heutejahr = date("Y",time());
                        $heute = date("d.m.Y",time());
                        $timerer = date("m",time());
                        $timererer = date("d",time());
                        $timestamp = mktime(0,0,0,$timerer,$timererer,$heutejahr);
                        $conn = mysql_connect("mysql.domainfactory.de","dbxxx","xxx");

                        if ($conn) {
                        mysql_select_db($xxx,$conn);

                        $resid = mysql_query("SELECT name, tag FROM jahrgangsstufe");

                        for ($i=1;$i<=mysql_num_rows($resid);$i++) {
                        $tempdata = mysql_fetch_array($resid);
                        $zeileholen["name"][$i] = $tempdata[namenspalte];
                        $zeileholen["tag"][$i] = $tempdata[datumspalte];
                        }
                        $anzahl = 1;
                        $doedel = 1;
                        while($doedel<=mysql_num_rows($resid))
                        {
                        $schueler[$anzahl]["name"] = $zeileholen["name"][$doedel];
                        $schueler[$anzahl]["tag"] = $zeileholen["tag"][$doedel];
                        $anzahl++;
                        $doedel++;
                        }

                        Comment


                        • #57
                          Aha, dann sei doch so gut und

                          mysql_select_db($xxx,$conn) or die('Fehler bei DB-Auswahl: '.mysql_error());

                          CAT Music Files

                          Comment


                          • #58
                            No Database selected? Hä? Hab ich doch gemacht.. oder nich?

                            Comment


                            • #59
                              *seufz*

                              das kann ja kein barmherziger Mensch mitansehen, wie ihr PHP mißbraucht für Sachen, für die mySQL geschrieben wurde!

                              Also ... wir suchen die Leute (name), die zuletzt Geburtstag hatten (tag) aus der Tabelle jahrgangsstufe.

                              Vor ein oder zwei Jahren wär ich noch losgezogen und hätt per Schleife gesucht ...
                              Code:
                              # suchen
                              $t=time(); $n=0;
                              for ($t=$t-$t%86400; !$n; $t-=68400)
                              {
                                $q = mysql_query ("select name from jahrgangsstufe
                                  where tag like '".date('%-m-d', $t)."'");
                                $n = mysql_num_rows($q);
                              }
                              $tag = date(d, $t);
                              $monat = date(m, $t);
                              $y = date(y);
                              # ausgeben
                              while ($r = mysql_fetch_row($q))
                               echo "$r[0] hatte am $tag.$monat. seinen "
                                . ($y-$r[1]). ". Geburtstag.<br>";
                              Aber mal abgesehen davon, dass das unter Umständen ziemlich lange dauert, ist es auch noch reichlich unelegant und belastet den mySQL-Server unnötig.

                              .........

                              Mit einer Query geht´s auch, allerdings muss dann die Abbruchbedingung in PHP geschrieben werden:
                              Code:
                              $q = mysql_query ("select name,
                                  substr(tag,6,5) as datum,
                                  substr(tag,1,4) as jahr
                                from jahrgangsstufe
                                where substr(tag,6,5)<'". date('m-d'). "'
                                order by substr(tag,6,5) desc, tag asc"
                              );
                              $y = date(y);
                              for ($i=0; $x=mysql_fetch_array($q); $i++)
                              {
                                if ($i || $x[datum]!=$lastdatum)
                                {
                                  $lastdatum=$x[datum];
                                  list ($monat, $tag) = explode('-',$x[datum]);
                                  echo "$x[name] hatte am $tag.$monat. seinen "
                                    . ($y-$x[jahr]). ". Geburtstag.<br>";
                                }
                                else
                                  break;
                              }
                              Aber hier ist die Schleife doch reichlich kompliziert ... Einfacher geht´s mit zwei Queries.

                              Erst mysql nach dem passenden Datum suchen lassen; dann alle Leute holen, die an dem Tag Geburtstag hatten:
                              Code:
                              # letzten Geburtstag ermitteln
                              $q = mysql_query ("select substr(tag,6,5) as datum
                                from jahrgangsstufe
                                where substr(tag,6,5)<'". date('m-d'). "'
                                order by substr(tag,6,5) desc limit 1"
                              );
                              list($datum) = mysql_fetch_row($q);
                              list ($monat, $tag) = explode ('-', $datum);
                              $y = date(y);
                              # alle Leute raussuchen
                              $q = mysql_query ("select name, substr(tag,1,4)
                                from jahrgangsstufe
                                where tag like '%-$datum'
                                order by tag asc"
                              );
                              while ($r = mysql_fetch_row($q))
                               echo "$r[0] hatte am $tag.$monat. seinen "
                                . ($y-$r[1]). ". Geburtstag.<br>";
                              P.S.: Ich geh natürlich in allen Beispielen davon aus, dass das Datum in einem DATE-Feld gespeichert ist, wie sich das gehört.
                              mein Sport: mein Frühstück: meine Arbeit:

                              Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

                              Comment


                              • #60
                                hmm,

                                leider bekomme ich kein eines von deinen zum laufen, naja gut die erste Variante läuft und hat mir eben alles zerschossen weil die Seite innerhalb weniger Sekunden >1.2 MB war dann sind mir hier die Prozesse in die Knie gegangen weil mein virtueller Speicher voll war, Apache hat sich mit ner Exeption verabschiedet, sogar die Inetverbindung hat sich verabschiedet und jetzt hab ich in der Taskleiste 2 von dien DFÜ Verbindungssymbolen Das hab bisher sogar ich nicht geschafft das System mit so ein Paar Zeilen in die Knie zu zwingen. Naja wie auch immer, ansonsten die anderen beiden Scripte erzeugen Mysql-Ressourceerrors, er mag ddeine Querys nicht An der DB liegst nicht die heisst jahrgangsstufe es wird auch connectet und die DB ausgewählt, das funzt, ich hab auch den Query von v3 mit dem phpmyadmin ein zu geben, daber das geht auch nicht aus date(m-d) hab ich 11-28 gemacht aber nix gehtmehr.

                                ps: dann doch lieger sicher mit php, da weiss ich dass es funzt, ich bin eh nicht davon überzeugt das die Scripte das machen was sie sollen, ich kann es mir einfach nicht Bildlich vorstellen und das ist selten.

                                Comment

                                Working...
                                X