Tage zählen

low-group

Erfahrenes Mitglied
hi ich bins wieder ;)

Ich habe in meiner SQL-Tabelle Artikel stehen mit Starttime und Endtime. Wenn ein User den Artiel löscht, wird nur ein Timestamp gesetzt, was vorher auf 0 steht.
Nun habe ich eine Seite, wo die eigenen Artikel gezeigt werden mit der Anzahl der Tage, wie lange dieser online war und diese Seite ist mit Blätterfunktion zu den vorigen Monaten. Jetzt will ich, daß wenn ich im Monat März bin alle Online-Tage nur für den März gezählt werden. Wenn z.b. ein Artikel am 3. März beendet wurde und schon im Februar begann, sollte er dann nur 3 Tage zählen und nicht die Tage im Februar dazu.

Nun hier mal mein Code bisher:
$mount = der laufende Monat

PHP:
 $this = mktime(0,0,0,$month,0,$year);
$next = mktime(0,0,0,$month+1,0,$year);
$heute = time();

$result = $db->query("SELECT subject, posttime, endtime, adr, userid FROM  bb".$n."_portal_artikel WHERE userid=".$wbbuserdata['userid']." ");
while($row = $db->fetch_array($result)){  
$postmonat=formatdate("F",$row['posttime']);
$postm=formatdate("n",$row['posttime']);
$day = $row['posttime'];
$end2 = $row['endtime'];
$subject = htmlconverter($row['subject']);
$adr = htmlconverter($row['adr']);


if ($day > $next || $end2 < $this)
{
$tg =0;
}

elseif ($day<$this && $end2==0)
{
$tg = ($heute - $this)/86400;
}
elseif ($day<$this && $end2>$this && $end2<$next)
{
$tg = ($end2 - $this)/86400;
}
elseif ($day>=$this && $end2==0) {
$tg = ($next - $day)/86400;
}
elseif ($day>=$this && $end2<$next) {
$tg = ($end2 - $day)/86400;
}
eval ("\$portal_monbit .= \"".$tpl->get("portal_monbit")."\";");
}

nun haut das bei mir ewig nicht hin mit der richtigen Berechnung der Tage, wenn ich an deer einen Stelle was ändere, ändert sich wieder woanders was.
 
Hallo!

Du schon wieder! :rolleyes: :p
Und schon wieder ein Datum-Problem! :-(
Also, es ist mir jetzt ein bisschen zu spät, als das ich mir jetzt noch funktionierende Gedankengänge zusammenwurschteln kann, die dein Script betreffen.

Deswegen poste ich mal ein Beispiel, wie es vielleicht gehen könnte (hab' mir das jetzt in aller Kürze ausgedacht - deswegen keine Funktionsgarantie):

PHP:
<?php
$thismonth = mktime(0,0,0,$month, 0,$year);
if ($month == 12)
{
	$year++;
	$month = 1;
}
$nextmonth = mktime(0,0,0,$month+1,0,$year);

$pd = ($postdate < $thismonth ? $thismonth : $postdate);
$ed = ($enddate >= $nextmonth ? $nextmonth-1 : $enddate);

$tg = (int)($ed - $pd) / (60*60*24);

echo "Der Beitrag lief in diesem Monat $tg Tage";
?>
 
geht leider nicht dein Beispiel. Ich hatte es extra über der If-Abfrage versucht, um das ganze einschränken zu können und dies muß auch irgendwie gehen, aber ich habe das gefühl, daß es zu viele If-abfragen sind und eventl. sogar die reihenfolge eine Rolle spielt.
 

Also solltest du mit date des datum in die daten bank eingetragen haben habe ich hier nen nettes skript geschrieben das die zeit deines artikels von der eintragen bis jetzt anzeigt 8)
ich hoffe ich habe das richtig verstanden was du meinstest 8)
PHP:
<?php
function from2now($year, $month, $day, $hour, $minute) {

   // common
   $todayMonth = date(n); // Derzeitiger Monat
   $todayDay = date(j); // Derzeitiger Tag
   $todayHour = date(G); // Derzeitige Stunde
   $todayMinute = date(i); // derzeitige Minute

   $monthday = date(nj);
   $link = $month.$day;
   $datepoint = $link;

   if ($monthday < $datepoint) $years = date(Y) - $year;
   else $years = date(Y) - $year;

   if ($years < 1) $yearWord = '';
   elseif ($years == 1) $yearWord = 'year';
   elseif ($years > 1) $yearWord = 'years';

   if ($todayMonth > $month) {

       if ($todayDay < $day) $months = $todayMonth - $month -1;
       else $months = $todayMonth - $month;

   }
   else {

       $between = $month - $todayMonth;
       $plus = 12 - $month;

       if ($todayDay < $day) $months = $month + $plus - $between -1;
       else $months = $month + $plus - $between;

   }

   if ($months == 1) $monthWord = 'month';
   elseif ($months > 1) $monthWord = 'months';

   if ($todayDay > $day) {

       if ($todayHour < $hour) $days = $todayDay - $day -1;
       else $days = $todayDay - $day;
   }
   else {

       $between = $day - $todayDay;
       $daysToEndOfMonth = date(t) - $day;
       if (date(t) == 28) $plus = $daysToEndOfMonth;
       if (date(t) == 29) $plus = $daysToEndOfMonth;
       if (date(t) == 30) $plus = $daysToEndOfMonth;
       if (date(t) == 31) $plus = $daysToEndOfMonth;
       if ($todayHour < $hour) $days = $day + $plus - $between - 1;
       else $days = $day + $plus - $between;
   }

   if ($days == 1) $dayWord = 'day';
   else $dayWord = 'days';

   if ($todayHour > $hour) {
       if ($todayMinute < $minute) $hours = $todayHour - $hour - 1;
       else $hours = $todayHour - $hour;
   }

   else { 
       $between = $hour - $todayHour;
       $plus = 24 - $hour;
       if ($todayMinute < $minute) $hours = $hour + $plus - $between - 1;
       else $hours = $hour + $plus - $between;
   }

   if ($hours == 1) $hourWord = 'hour';
   if ($hours > 1) $hourWord = 'hours';

   if ($todayMinute > $minute) {
       $minutes = $todayMinute - $minute;
   }
   else { 
       $between = $minute - $todayMinute;
       $plus = 60 - $minute;
       $minutes = $minute + $plus - $between;
   }
   if ($minutes == 60) $minutes = 0;
   if ($minutes == 1) $minuteWord = 'minute';
   elseif ($minutes > 1) $minuteWord = 'minutes';

   if ($years == 0) { $years = ''; $yearWord = ''; }
   if ($months == 0) { $months = ''; $monthWord = ''; }
   if ($days == 0) { $days = ''; $dayWord = ''; }
   if ($hours == 0) { $hours = ''; $hourWord = ''; }
   if ($minutes == 0) { $minutes = ''; $minuteWord = ''; }

   echo $years.' '.$yearWord.' '.$months.'  '.$monthWord.' '.$days.' '.$dayWord.' '.$hours.' '.$hourWord.' '.$minutes.' '.$minuteWord.'';
}
das sql auslesen
   include("connect.inc.php"); // der db connect eben oder selber hinschreiben
   $sql = Select * from Artikel;    //schränkst du ein wie du willst
   $result = mysql_query($sql);
while ($row = mysql_fetch_array($result)) {
   //Hier kommt es drauf an wie du date zum eintragen genutzt hasz
   //ich benutze meistens date("d M Y h:i")
	$Date_db = explode(" ", $row[datum]);
   //Nun hast du den tag monat und das jahr im array sowie die komplette zeitangabe
   //die werte die du schon hast verteilen
       $day = $Date_db[0];
       $month = $Date_db[1];
       $year = $Date_db[2];
       $rest_date = $Date_db[3];
//nun die uhrzeit teilen
       $time_date = explode(":", $rest_date);
       $minute = $time_date[1];
       $hour = $time_date[0];
	//ergebnis ausgeben 8)
	$erg = from2now($year, $month, $day, $hour, $minute);
	print($erg);
?>


bei fragen oder anregungen an mich wenden plz 8)
 
@Gandalf ( ;) ):
Ich glaub' nicht, dass er es mit date() eingetragen hat!
Timestamp!
Und das war (wenn ich mich richtig erinnere) auch so in vorherigen Posts so zu verstehen.
 
jo richtig, die Daten sind mit Timestamp eingetragen worden.

machen wir es anders. Hänge erstmal mein Script an und dann mal die Zugangsdaten zu dem Link.

User: user
Pass: userpass

Link: http://bayern.low-group.de/art_monat.php?sid=

Das ganze soll dazu dienen, daß auf der jeweilien Monatsseite die Kosten der Artikel für den laufenden Monat angegeben werden sollen.
 
Ich glaube, ich weiss, warum mein Script nicht funktionierte:

Ich hab' ganz vergessen, das heutige Datum zu berücksichtigen!

Das hab' ich hier geändert:

PHP:
<?php
$month = date('m');
$year = date('Y');
$thismonth = mktime(0,0,0,$month, 0,$year);
$now = time();
$postdate = mktime(1,2,3,$month-1,5,$year);
$enddate = mktime(2, 3, 4, $month+1,7, $year);

if ($postdate > $now) die ('Der Artikel wurde diesen Monat noch nicht eingetragen');
if ($postdate > $enddate) die ('Die Daten sind ungültig!');

$pd = ($postdate < $thismonth ? $thismonth : $postdate); 
$ed = ($enddate >= $now ? $now : $enddate); 

$tg = (int)(($ed - $pd) / (60*60*24));  
echo $tg;
?>

Wenn doch ein Fehler auftauchen sollte, bitte posten, wo und wann dieser auftritt (welche Werte haben $postdate und $enddate?!).
 
Zuletzt bearbeitet:
@rootssw

hab deine Daten jetzt drinne, kannst ja schauen, was bei rauskommt. Hab anstatt die () dies reingemacht - $tg =0;
 
Zurück