Geburtstage sortieren
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
code
date
datenbank
datum
definieren
fehler
geburtstag
mode
not
null
ordern
sagen
set
show
start
umgehen
union
url
woche
zeitraum
-
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
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 -
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? -
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 -
technofan schrieb:
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.
... also meiner Meinung nach hapert es an
...if($min <= $bday && $bday <= $max){
ich würde deine query in etwa so umarbeitenSELECT 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:
(das ist jetzt von der console gekommen, daher etwas abgeändert ;)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)
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 ;) -
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? -
technofan schrieb:
wie gesagt: sql kann bestens mit zeiten umgehen.
... 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?
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 ;) -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage