kostenloser Webspace werbefrei: lima-city


Geburtstage sortieren

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    technofan

    Moderator Kostenloser Webspace von technofan

    technofan hat kostenlosen Webspace.

    Hallo Leute,

    ich habe eine kleine Community, in der die Member ihren Geburtstag eintragen können. Dieser wird als UNIX-Timestamp in einer Datenbank gespeichert.

    Wenn ich die Geburtstage anzeigen lasse, möchte ich nur den Zeitraum von gestern bis die nächsten 4 Wochen.
    Er zeigt das dann so an "XYZ hat am soundsovielten den x-ten Geburtstag"
    das funktioniert auch soweit ganz gut...
    jetzt bau ich noch die Worte übermorgen, morgen und gestern ein, damit das ganze etwas schicker aussieht.
    nur sobald der Geburtstag den heutigen Tag erreicht hat, verschwindet er einfach... weiß einer wieso??

    Hier mal der Code

    setlocale(LC_TIME, "de_DE.UTF-8");
    		$bdays = '<table width="100%" border="0" cellspacing="0" cellpadding="0">';
    		$i = 1;
    		$bdayabfrage = $mysql->query("SELECT * FROM tkotrt_member WHERE bday != '' AND mainid = twinkid ORDER BY MONTH(FROM_UNIXTIME(bday)), DAY(FROM_UNIXTIME(bday)), YEAR(FROM_UNIXTIME(bday)) DESC");
    		#$bdayabfrage = $mysql->query("SELECT * FROM tkotrt_member WHERE bday != '' AND mainid = twinkid ORDER BY bday");
     
    		while($row = $mysql->fetchObj($bdayabfrage)){
    			//Wechselnde Hintergrundfarbe
    			if($i % 2 == 0){
    				$bgcolor = 'bgcolor="#E2E2E2"';
    			} else $bgcolor = '';
     
    			$next_age = floor((date("Ymd", time()) - date("Ymd", $row->bday)) / 10000) + 1;
    			$year_of_next_bday = date('Y', $row->bday) + $next_age;
     
    			$min = date(Ymd, strtotime("-1 day"));
    			$bday = date($year_of_next_bday.md, $row->bday);
    			$max = date(Ymd, strtotime("+".$bday_vorlauf." weeks"));
     
    			if($min <= $bday && $bday <= $max){
     
    				$bday_timestamp_now = mktime(0,0,0,date('n', $row->bday),date('j', $row->bday),$year_of_next_bday);
    				if(date('md', strtotime("-1 day")) == date('md', $row->bday)){
    					$bday_date = 'e gestern';
    					$next_age = $next_age -1;
    				} elseif(date('md', time()) == date('md', $row->bday)){
    					$bday_date = ' heute';
    				} elseif(date('Ymd', strtotime("+1 day")) == date($year_of_next_bday.'md', $row->bday)){
    					$bday_date = ' morgen';
    				} elseif(date('Ymd', strtotime("+2 day")) == date($year_of_next_bday.'md', $row->bday)){
    					$bday_date = ' übermorgen';
    				} else $bday_date = ' am '.strftime('%a den %d. %b', $bday_timestamp_now);
    				$bdays .= '<tr '.$bgcolor.'><td><a href="index.php?ct=show_profile&secct='.$row->mainid.'&id='.$row->twinkid.'">'.$row->membername.'</a> feiert'.$bday_date.' den '.$next_age.'. Geburtstag.</td></tr>';
    				$i++;
     
    			}
    		}
    		$bdays .= '</table>';
    		if($i - 1 == 0){
    			$echo_bdaycount = 'In den nächsten '.$bday_vorlauf.' Wochen finden keine Geburtstage statt';
    		} elseif($i - 1 == 1){
    			$echo_bdaycount = 'In den nächsten '.$bday_vorlauf.' Wochen findet ein Geburtstag statt';
    		} else $echo_bdaycount = 'In den nächsten '.$bday_vorlauf.' Wochen finden '.($i - 1).' Geburtstage statt';
    		echo '
    		<h2>Wer hat die nächsten '.$bday_vorlauf.' Wochen Geburtstag?</h2>
    		<span id="undertitle">'.$echo_bdaycount.'</span>
    		<div>'.$bdays.'</div>';


    also meiner Meinung nach hapert es an

    if($min <= $bday && $bday <= $max){


    Wäre schön, wenn mir da jemand helfen könnte.

    Grüße
    technofan
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Hallo technofan,
    füge mal
    ini_set('display_errors', 1);
    error_reporting(E_ALL);

    in dein Script ein, damit dir mögliche Fehler angezeigt werden.
    Beim ersten Überblick sehe ich, dass Fehler bereits beim Initialisieren der Variablen $min und $max existieren.
    $min = date(Ymd, strtotime("-1 day"));
    			$bday = date($year_of_next_bday.md, $row->bday);
    			$max = date(Ymd, strtotime("+".$bday_vorlauf." weeks"));

    Richtig:
    $min = date('Ymd', strtotime("-1 day"));
    $max = date('Ymd', strtotime("+".$bday_vorlauf." weeks"));

    Mfg,
    timebandit
  4. Autor dieses Themas

    technofan

    Moderator Kostenloser Webspace von technofan

    technofan hat kostenlosen Webspace.

    timebandit schrieb:
    Richtig:
    $min = date('Ymd', strtotime("-1 day"));
    $max = date('Ymd', strtotime("+".$bday_vorlauf." weeks"));



    Hallo,

    auf diese Art und Weise bekomme ich doch aber einen string und kein integer... wie kann ich denn dann die Operatoren >= und <= einsetzen?
    das funktioniert doch nur mit int oder nicht?
  5. Wenn du die Hochkommata wegläßt erzeugst du diesen Fehler:
    Notice: Use of undefined constant Ymd - assumed 'Ymd' in .......

    Mit Hochkommata bekommst du diesen , oder ähnlichen Wert zurückgeliefert;
    20130302
    Ein numerischer Wert, der sich aus dem Jahr 2013, dem Monat März also 03 und dem Tag also 02 zusammensetzt.

    Beitrag zuletzt geändert: 3.3.2013 1:18:15 von timebandit
  6. technofan schrieb:
    ... also meiner Meinung nach hapert es an
    if($min <= $bday && $bday <= $max){
    ...
    hmmm! also ich würde das ganze anders angehen. mysql kann ja hervorragend mit datum und zeit umgehen und das unheimlich schneller als apache+php.

    ich würde deine query in etwa so umarbeiten
    SELECT col_1,
           col_2,
           col_blaaa,
           concat(year(from_unixtime(bday)), '-',
                  right(concat('0', month(from_unixtime(bday))),2), '-',
                  right(concat('0', day(from_unixtime(bday))),2)) date1,
           concat(year(from_unixtime(bday)),
                  right(concat('0', month(from_unixtime(bday))),2),
                  right(concat('0', day(from_unixtime(bday))),2)) date2,
           col_n,
           col_n+1,
           col_blaaa
      FROM tkotrt_member
      WHERE bday != '' AND
            mainid = twinkid
      ORDER BY date2 DESC
    das ergibt das datum in date1 und date2 in etwa so:
    select (@ut:=unix_timestamp()) ut;
    +------------+
    | ut         |
    +------------+
    | 1362275328 |
    +------------+
    1 row in set (0.05 sec)
    
    mysql> select concat(year(from_unixtime(@ut)), '-',
        ->        right(concat('0', month(from_unixtime(@ut))),2), '-',
        ->        right(concat('0', day(from_unixtime(@ut))),2)) date1;
    +------------+
    | date1      |
    +------------+
    | 2013-03-03 |
    +------------+
    1 row in set (0.04 sec)
    
    mysql> select concat(year(from_unixtime(@ut)),
        ->        right(concat('0', month(from_unixtime(@ut))),2),
        ->        right(concat('0', day(from_unixtime(@ut))),2)) date2;
    +----------+
    | date2    |
    +----------+
    | 20130303 |
    +----------+
    1 row in set (0.05 sec)
    (das ist jetzt von der console gekommen, daher etwas abgeändert ;)
    mit date2 ist die sortierung viel einfacher und date1 kannst direkt ohne daran mit php basteln zu müssen, anzeigen. genaueres könnte ich noch sagen, wenn ich genaueres kennen würde ;)

    ich glaube, mit so formatierten daten kannst du deine while-schleife viel viel besser und kürzer gestalten. (eine kleine nebenwirkund: es wird auch erheblich schneller ;)
  7. Autor dieses Themas

    technofan

    Moderator Kostenloser Webspace von technofan

    technofan hat kostenlosen Webspace.

    das sieht garnet mal so übel aus.... kann man dann nicht auch direkt damit einen Zeitraum definieren? also sagen wir wie oben von gestern bis in 2 Wochen?

    und die dates kann ich dann wahrscheinlich wie gehabt mit $row->date1 ausgeben oder?
  8. technofan schrieb:
    ... kann man dann nicht auch direkt damit einen Zeitraum definieren? also sagen wir wie oben von gestern bis in 2 Wochen?
    wie gesagt: sql kann bestens mit zeiten umgehen.
    und die dates kann ich dann wahrscheinlich wie gehabt mit $row->date1 ausgeben oder?
    yepp!
    damit ich erst jetzt wieder zeit hatte, habe mal ein 'minidemo' dazu gemacht. das ding macht allerdings nur etwas vergleichbares, weill ich deine strukturen ja nicht kenne. außerdem meine 'datenbank' hat nur 3 figuren mit bdays drin, aber um es zu zeigen reicht es ;)
    es geht ja schließlich eh nur um die (ungefähre) query.

    und so funktioniert das ganze.

    das ist das 'hauptprogramm' ;):
    <?php
    /**
     *  czibere.lima-city.de/_forum/technofan/bday-sort.php
     */
    
    error_reporting(E_ALL | E_STRICT);
    $start = microtime();
    
    $show = false;
    $pe   = PHP_EOL;
    
    /* ---- initialise sql: bday ------------------------------------------------ */
    $where1 = '';
    $where2 = '';
    if(count($_POST)) {
      /* ---- initialise sql: not a bday ---------------------------------------- */
      if($_POST['action'] === 'kein geburtstag') {
        $where1 = 'NOT(';
        $where2 = ')';
      }
      $show = (!empty($_POST['mode']) AND ($_POST['mode'] === 'show')) ? true: false;
    }
    
    /* ---- connect to database ------------------------------------------------- */
    require_once './dbconnect_bday.php';
    
    /* ---- the query ----------------------------------------------------------- */
    $q = <<< EOT
    /* =============================================================================
        gibt geburtstage in dem Interwall von gestern - bis in 2 Woche sortiert aus
          v0.00.01_2013-03-04, by czibere
    ============================================================================= */
    
    -- create HTML <table...> ------------------------------------------------------
    (SELECT '        <table width="100%" border="1" cellspacing="0" cellpadding="0" style="background-color:#cec;">')
    UNION
    
    -- create HTML table header ----------------------------------------------------
    (SELECT '          <tr bgcolor="#60c3c0"><td><strong>nik</strong></td><td><strong>geburtstag</strong></td></tr>')
    UNION
    
    -- create HTML table rows and cells --------------------------------------------
    -- bgcolor="#E2E2E2" / null ----------------------------------------------------
    -- d = database; t = table -----------------------------------------------------
    (
    SELECT CONCAT('          <tr %bgcolor%><td>', name, '</td>', '<td>', FROM_UNIXTIME(bday), '</td></tr>')
      FROM $d.$t
      WHERE $where1 bday>=UNIX_TIMESTAMP(ADDDATE(CURDATE(), INTERVAL -1 DAY)+0) AND
                bday<=UNIX_TIMESTAMP(ADDDATE(CURDATE(), INTERVAL 14 DAY)+0)$where2
    )
    UNION
    
    -- END HTML <table... ----------------------------------------------------------
    (SELECT '        </table>')
    EOT;
    $_q = ($show) ?
      '<pre style="background-color:#ecc;"><h3>query:</h3>' . htmlentities($q) . ';</pre>':
      '';
    
    $r = ($r = mysql_query($q, $c)) ? $r: exit(''.mysql_error());
    
    /* ---- generates HTML ------------------------------------------------------ */
    $t = null;
    $x = 0;
    while($row = mysql_fetch_assoc($r)) {
      foreach($row as $k => $v) {
        $bgcolor = ((bool)$x = ($x + 1) % 2) ? 'bgcolor="#cec"': 'bgcolor="#aea"';
        $v       = str_replace('%bgcolor%', $bgcolor, $v);
        $t      .= $v . PHP_EOL;
      }
    }
    
    /* ---- show site ----------------------------------------------------------- */
    require_once './html.php';

    die (effektiven)anteile des progs sind:
    php 19 zeilen (also im vergleich zu deinem code sehr wenig!)
    sql 15 zeielen

    'dbconnect_bday.php' darf ich hier vernachlässigen ;)

    das ist html.php (mein 'untemplate engine' ;):
    <?php
    
    $title = "bday between 'date1' and 'date2'";
    $sel = ($show) ? ' checked': '';
    $_t = array($start, microtime());
    $_t = print_r($_t,true);
    
    exit(<<< EOT
    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8" />
        <title>$title</title>
      </head>
      <body>
    
        <header><h1>$title</h1></header>
    
        <article>
    
          <section id="form">
            <form action="" method="post">
              <input type="submit" name="action" value="geburtstag" />
              <input type="submit" name="action" value="kein geburtstag" />
              <input type="checkbox" name="mode" value="show"$sel /> show query?
            </form>
            <p></p>
          </section>
    
          <section id="table">
    $t      </section>
    
          <section id="query">
            <p>
    $_q
            </p>
          </section>
          <section id="time">
            <pre><stromg>duration</strong>
    $_t
            </pre>
          </section>
    
        </article>
      </body>
    </html>
    EOT
    );


    solltest noch fragen haben, nur zu ;)
  9. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!