Avatar billede discotk Nybegynder
27. december 2009 - 19:14 Der er 13 kommentarer og
1 løsning

While loop if $date

Hej Eksperter!
Har siddet og bakset med med et script der skal regne sig frem til de sidste 30 dage og skruve dem ud. Dernæst skal det igennem en løkke, ud fra hvilken dato skrive et bestemt antal som bliver talt igennem COUNT( DISTINCT )...

Her er problemet så....
Jeg kan uanset hvad jeg prøver ikke få den til at skrive de specifikke tal ud fra hver dato... den skriver bare hele tiden 0 (bruger else-funktionen), hvis jeg skriver if ($datepicker == $countdate), ellers skriver den 26-12-2009 Query was empty, hvis jeg skriver if ($datepicker = $countdate)

Her er min kode, men hvis i har andre forslag er jeg mere end modtagelig.

____________________________________________

<?php
require_once('Connections/cms.php');
mysql_select_db($database_cms, $cms);
?>
<?php
$lastmonth =  date("d") . (date("m")-1);
$t = time();
    while(date("dm", $t) != $lastmonth) {
        $t -= (24*60*60);
        $countdate = date("d-m-Y", $t);
            echo $countdate;
            echo "<br />";

if ($datepicker = $countdate) { $counter_query = mysql_query("SELECT date, COUNT( DISTINCT ip ) AS antal FROM counter GROUP BY date WHERE date='$datepicker'");
$counter_result = mysql_query($counter_query) or die(mysql_error());
    while ($counter = mysql_fetch_array($counter_query)) {
        echo $counter['antal']; }
} else {     echo "0";
            echo "<br />";}

} ?>

På forhånd tak!
27. december 2009 - 21:27 #1
Jeg har fundet et par ting som muligvis er problemer i din kode.  Dem vender jeg tilbage til nedenfor.

Men det var da en kompliceret maade du bruger til at finde de sidste 30 dage.  Jeg er ved at kikke paa at kalkulere de sidste 30 dage direkte i sql statementet.  Jeg fandt dette eksempel som jeg er ved at leje med.  Jeg skal vende tilbage.

"Here is an example that uses date functions. The following query selects all rows with a date_col value from within the last 30 days:

mysql> SELECT something FROM tbl_name
    -> WHERE DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= date_col;"  Link http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html

De mulige problemer med din kode: 

(1)  Er datoerne i database tabellen formatteret som 26-12-2009? Da jeg i forbindelse med et tidligere spoergsmaal fra dig proevede at indsaette datoer saaledes formatterede fik jeg kun 0000-00-00.  Foerst da jeg formatterede datoerne som 2009-12-26 fik jeg brugbare resultater. 

(2)  Du synes at have en double query idet du foerst siger :

$counter_query = mysql_query("SELECT date, COUNT( DISTINCT ip ) AS antal FROM counter GROUP BY date WHERE date='$datepicker'");

og saa

$counter_result = mysql_query($counter_query) or die(mysql_error());
    while ($counter = mysql_fetch_array($counter_query)) {
        echo $counter['antal']; }

Jeg vil mene at du skal skippe denne linie:  $counter_result = mysql_query($counter_query) or die(mysql_error());

Som sagt, jeg vender tilbage naar jeg har proevet at traekke de sidste 30 date ud direkte fra database tabellen.  Om det bliver i aften eller i morgen tidlig vil vise sig.
Avatar billede discotk Nybegynder
27. december 2009 - 22:00 #2
Som du ganske vidst nok siger så hjalp du mig med et tidligere spørgsmål som faktisk omhandler det samme, nu er jeg dog bare igang med at få dataerne skrevet ud på en bestemt måde :)

For at uddybe spørgsmålet lidt bedre så det er lettere at forstå... Så er det fordi jeg sidder med Open Flash Chart (et flash/json styret statistik/diagram værktøj) hvor man skal skrive værdierne ud på en bestemt måde, i et array f.eks. i en while som her.

Jeg skulle gerne ende med et resultat der ligner noget med:
24-12-2009
3
23-12-2009
0
22-12-2009
5... osv (en måned tilbage...)

Hvorfor jeg bruger denne kalkulation i en while er fordi i mit besøgssystem registrerer kun datoer når der har været nogen inde - Det vil så sige at den registrerer ikke nogen når der ikke har været nogen inde på siden. Derfor har jeg denne funtion til at skrive de resterende datoer, hvor der ikke har været nogen inde.

Disse to while funktioner skal altså kunne arbejde sammen, hvor der i den øverste linje står datoen og nedenunder står antallet af besøgende, trukket ud så den kun tæller de unikke besøgende, som i det foregående spørgsmål (http://www.eksperten.dk/spm/896397). Et MySQL udtræk der ligner følgende "SELECT date, COUNT( DISTINCT ip ) AS antal FROM counter GROUP BY date"
27. december 2009 - 22:03 #3
Det gik nemmere end jeg havde frygtet.  Jeg puttede nogle hits fra mere end en maaned siden i databasen og koerte saa nedenstaaende kode hvilket gav datoerne og antal per dag for de sidste 30 dage hvor der var hits, plus et total antal.  Du kan proeve det ud paa http://christianjorgensen.be/discotk1.php

Her er foerst indholdet af tabellen, saa koden (hvor du skal rette mysql forbindelsen og hvor jeg kalder tabellen discotk) og til slut udskriftet.  Hvis enten datoerne i din databasetabel er formatteret "paa dansk" eller du kan acceptere nedenstaaende format saa skulle den vaere hjemme.  Ellers maa dato-udskriften vendes om.  Det er jeg ved at kikke paa.

Foerst indholdet af databasetabellen:

      id  ip  page_id  date 
      1 192.168.1.1 52 2009-12-24
      1 192.168.1.1 25 2009-12-24
      1 192.168.1.2 25 2009-12-24
      1 192.168.1.1 27 2009-12-23
      1 192.168.1.1 1 2009-12-23
      1 192.168.1.2 15 2009-12-23
      1 192.168.1.3 29 2009-12-23
      1 192.168.1.1 11 2009-12-26
      1 192.168.1.1 11 2009-12-26
      1 192.168.1.1 11 2009-12-25
      1 192.168.1.2 11 2009-12-25
      1 192.168.1.3 11 2009-12-25
      1 192.168.1.4 11 2009-12-25
      1 192.168.1.1 11 2009-11-28
      1 192.168.1.1 11 2009-11-27
      1 192.168.1.1 11 2009-11-26
      1 192.168.1.1 11 2009-11-25
      1 192.168.1.1 11 2009-11-24
      1 192.168.1.1 11 2009-11-23

Saa koden:

<?
$link = mysql_connect ('christianjorgensen.be.mysql', 'christianjoygen', 'dnyBKKbe') or die(mysql_erorr());
mysql_select_db('christianjoygen') or die('Could not select database');

$counter_query = mysql_query("SELECT date, COUNT( DISTINCT ip ) AS antal FROM discotk WHERE DATE_SUB(CURDATE(), interval 30 day) <= date GROUP BY date");
$total = 0;
while ($counter = mysql_fetch_array($counter_query))
{
  $total += $counter['antal'];
  echo $counter['date'] . ' - antal besoeg: ' . $counter['antal'] . "<br/>";
}
echo "total antal besoeg: " . $total;

mysql_close($link);
?>

og resultatet:

2009-11-27 - antal besoeg: 1
2009-11-28 - antal besoeg: 1
2009-12-23 - antal besoeg: 3
2009-12-24 - antal besoeg: 2
2009-12-25 - antal besoeg: 4
2009-12-26 - antal besoeg: 1
total antal besoeg: 12
Avatar billede discotk Nybegynder
27. december 2009 - 22:07 #4
... Det skulle måske nævnes at der i dette statistik diagram fra Open Flash Chart er en X- og Y-akse... I X-aksen skal der står datoer for den sidste måned og Y-aksen koordinater bestemmes ud fra hvor mange antal unikke besøgende der har været.

Det er sådan set ligegyldigt hvordan tingene bliver skrevet i databasen, skal bare kunne trække dem ud på en brugervenlig facon, så det ikke står i mktime() eller lign i X-aksen :)

Er åben for forslag, ændringer og anden ny læring :)
27. december 2009 - 22:07 #5
Jeg saa ikke dit indlaeg #2 foer jeg fik min #3 skudt af, det var ikke for at ignorere dig.  Jeg kikker og kommenterer asap.
Avatar billede discotk Nybegynder
27. december 2009 - 23:07 #6
Kunne jeg heller ikke forstille mig :) jeg er skam bare glad for at du gider hjælpe mig...

Det virker forresten rigtig godt, men mangler stadig de resterende dato'er. Men du giver bare en tilbagemelding når du er klar eller har et bud
28. december 2009 - 06:00 #7
Saa er den vist ved at vaere der.  Med SELECT DATE_FORMAT(date, '%d %m %Y') giver den dag-maaned-aar format ud uanset hvad dato formatet er.

Jeg faar nu dette resultat (bemaerk at der er en linie mindre end i gaar hvad der gerne skulle vaere, hvis du ikke laengere vil have en total skrapper du den bare - )

28 11 2009
1
23 12 2009
3
24 12 2009
2
25 12 2009
4
26 12 2009
1
total antal besoeg: 11

og koden i http://christianjorgensen.be/discotk1.php er den foelgende:

<?
$link = mysql_connect ('christianjorgensen.be.mysql', 'christianjoygen', 'dnyBKKbe') or die(mysql_erorr());
mysql_select_db('christianjoygen') or die('Could not select database');

$counter_query = mysql_query("SELECT DATE_FORMAT(date, '%d %m %Y') AS date, COUNT( DISTINCT ip ) AS antal FROM discotk WHERE DATE_SUB(CURDATE(), interval 30 day) <= date GROUP BY date");
$total = 0;
while ($counter = mysql_fetch_array($counter_query))
{
  $antal = $counter['antal'];
  echo $counter['date'] . "<br/>";
  echo $antal . "<br/>";
  $total += $antal; 
}
echo "total antal besoeg: " . $total;

mysql_close($link);
?>
Avatar billede discotk Nybegynder
28. december 2009 - 09:13 #8
Det virker rigtig godt.. Men hvordan får jeg de andre datoer frem som ikke står i databasen?

Står nu med resultatet hvor den kun tæller de sidste 30 dage hvor der er registreret noget i databasen. Men skal have de sidste 30 dage også selvom der ikke er registreret noget, altså så jeg får resultatet:

24 12 2009
3
23 12 2009
0
22 12 2009
5
21 12 2009
0
20 12 2009
3... osv 30 dage tilbage hvor alle de 30 dage vises selvom der ikke er registreret noget i databasen)
28. december 2009 - 16:53 #9
Jeg har set dit indlaeg.  Jeg arbejder med det.  Tavsheden skyldtes at jeg havde noget andet jeg skulle forberede til i morgen.
28. december 2009 - 21:01 #10
Det tog sin tid.  Maaske er jeg ikke saa smart som jeg troede.  Men nu tror jeg den er der.  Jeg ledte efter en "smukkere" metode hvor der kun var et kald til databasen men forvildede mig totalt.  Saa vendte jeg tilbage til din kode med et database kald for hver dato men rettede mysql kaldet.  Du kan afproeve det i http://christianjorgensen.be/discotk2.php, men her foelger foerst koden og derefter resultatet baseret paa den samme database tabel som jeg har brugt hele tiden.

Koden:

<?
$link = mysql_connect ('christianjorgensen.be.mysql', 'christianjoygen', 'dnyBKKbe') or die(mysql_erorr());
mysql_select_db('christianjoygen') or die('Could not select database');
$lastmonth =  date("d") . (date("m")-1);
$t = time();
while(date("dm", $t) != $lastmonth)
{
  $t -= (24*60*60);
  $countdate = date("d m Y", $t);
  echo $countdate . "<br/>";
  $counter_query = mysql_query("SELECT COUNT(DISTINCT ip) AS antal FROM discotk where DATE_FORMAT(date,'%d %m %Y') = '$countdate' GROUP BY date") or die(mysql_error());
  if(mysql_num_rows($counter_query))
  {
    $row = mysql_fetch_array($counter_query);
    echo $row['antal'] . "<br/>";
  }
  else echo "0<br/>";
}
mysql_close($link); 
?>

og resultatet:

27 12 2009
0
26 12 2009
1
25 12 2009
4
24 12 2009
2
23 12 2009
3
22 12 2009
0
21 12 2009
0
20 12 2009
0
19 12 2009
0
18 12 2009
0
17 12 2009
0
16 12 2009
0
15 12 2009
0
14 12 2009
0
13 12 2009
0
12 12 2009
0
11 12 2009
0
10 12 2009
0
09 12 2009
0
08 12 2009
0
07 12 2009
0
06 12 2009
0
05 12 2009
0
04 12 2009
0
03 12 2009
0
02 12 2009
0
01 12 2009
0
30 11 2009
0
29 11 2009
0
28 11 2009
1
Avatar billede discotk Nybegynder
28. december 2009 - 22:29 #11
Du er for god til det her :) Du fortjener helt klar nogle point.

Et lille ekstra spørgsmål for at være rigtig irriterende... Hvis jeg så vil ha vendt værdierne om, så den ældste dato kommer først?
28. december 2009 - 23:30 #12
I saa fald skulle du jo ikke have lavet eksemplet som du gjorde.  Jeg kigger paa den ogsaa, men det bliver nok i morgen aften.  Derefter vil jeg nok mene at yderligere spoergsmaal boer stilles i et nyt spoergsmaal.  Saa bliver det set af alle medlemmerne af eksperten hvoraf nogen maaske har bedre ideer end jeg.
Avatar billede discotk Nybegynder
29. december 2009 - 09:41 #13
:) Det er taget til efteretning. Tusind tak for din store hjælp så langt!
Avatar billede discotk Nybegynder
29. december 2009 - 09:45 #14
Løsningen til de resterende eksperter!

[quote]<?php
require_once('Connections/cms.php');
mysql_select_db($database_cms, $cms);
$lastmonth =  date("d") . (date("m")-1);
$t = time();
while(date("dm", $t) != $lastmonth)
{
  $t -= (24*60*60);
  $countdate = date("d m Y", $t);
  echo $countdate . "<br/>";
  $counter_query = mysql_query("SELECT COUNT(DISTINCT ip) AS antal FROM counter where DATE_FORMAT(date,'%d %m %Y') = '$countdate' GROUP BY date") or die(mysql_error());
  if(mysql_num_rows($counter_query))
  {
    $row = mysql_fetch_array($counter_query);
    echo $row['antal'] . "<br/>";
  }
  else echo "0<br/>";
}
mysql_close($cms); 
?>[/quote]
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester