Avatar billede MSR Juniormester
26. august 2007 - 23:58 Der er 13 kommentarer og
1 løsning

Hente dele af en timestamp til kalender

<?
$result = mysql_query("SELECT id, tidstart, overskrift, target FROM kalender " . $sortby);
    while ($row = mysql_fetch_array($result))
    {
    echo "<tr><td width='20'></td><td>" . $row['tidstart'] . "</td><td><a href='vis_arrangement.php?id=" . $row['id'] . "'title='for " . $row['target'] . "'>". $row['overskrift'] . "</a>" .
    "</td></tr>";
       
    };
?>

Heysa. jeg skal bruge ovenstående til en simpel kalender men da jeg sætter "starttid" som "NOW" får jeg jo hele timestamp´et. til oversigten i kalenderen skal jeg så kun bruge datoen som f.eks. idag 26.  Er det muligt at ændre outputtet så det fremstår således? yderligere og noget sværere vil jeg faktisk gerne have en  <tr>navn på måned</tr> hver gang måneden skifter på arrangementer. kan det lade sig gøre?
Avatar billede kjulius Novice
29. august 2007 - 23:17 #1
Du kan bruge DAY() funktionen til kun at returnere dagen:

SELECT id, DAY(tidstart) AS dag, overskrift, target
FROM kalender

(eller synonymet DAYOFMONTH() funktionen, som er identisk med DAY funktionen, men ikke er helt så standard - og således kan give lidt arbejde, hvis du skulle tænke på at bruge dit script til en anden database senere hen).

For at få månedsnavnet kan du bruge MONTHNAME():

SELECT id, DAY(tidstart) AS dag, MONTHNAME(tidstart) AS maaned, overskrift, target
FROM kalender

Det er dog op til din php-kode at identificere, hvornår månedsnavnet skifter. Det er ikke noget, som SQL er god til (at sammenligne med den foregående række). Det KAN under visse forudsætninger gøres i SQL, men det er meget mindre effektivt end at gøre det i PHP-koden og ikke anbefalelsesværdigt.
Avatar billede MSR Juniormester
30. august 2007 - 14:04 #2
Jo tak. det virker fint. dog skal jeg have "maaned" til at lave en switch da den pt siger "9" og jeg ville have den til at sige September. kan jeg lave en smitch midt i en query? eller kan jeg på anden vise redigere en variabel værdi således at den vises uden at lave f.eks. et left_join. jeg synes det er for voldsomt at lave en hel tabel ved siden af med værdierne:
1 - Januaer
2 - Februar... osv osv men måske er det den nemmeste løsning?
yderligere kan jeg jo vise <tr>"måneden"</tr> HVIS den ikke er vist før?

Resultatet burde være:
Måned 1
  dato 1 - arrangement1
  dato 2 - arrangement2
måned 2
  dato 1 - arrangement3

osv osv sv...
Avatar billede kjulius Novice
30. august 2007 - 19:47 #3
Det forstår jeg ikke rigtigt. MONTHNAME skal returnere navnet på måneden, altså September, og ikke 9. Du har vel ikke brugt MONTH i stedet for MONTHNAME?

Mht. din visningen af din HTML tabel, så er jeg ikke på nogen måde inde i PHP, men jeg formoder, at det skal være noget lign. dette her:

<?
$result = mysql_query("SELECT id, MONTHNAME(tidstart) AS Maaned, DAY(tidstart) AS Dag, overskrift, target FROM kalender " . $sortby);
    cmpMaaned == "";
    while ($row = mysql_fetch_array($result))
    {
    If (cmpMaaned != $row['Maaned']) {
      echo "<tr><td>".$row['Maaned']."</td></tr>";
      cmpMaaned == $row['Maaned'];
    };
    echo "<tr><td width='20'></td><td>" . $row['tidstart'] . "</td><td><a href='vis_arrangement.php?id=" . $row['id'] . "'title='for " . $row['target'] . "'>". $row['overskrift'] . "</a>" .
    "</td></tr>";
     
    };
?>
Avatar billede kjulius Novice
30. august 2007 - 19:49 #4
<?
$result = mysql_query("SELECT id, MONTHNAME(tidstart) AS Maaned, DAY(tidstart) AS Dag, overskrift, target FROM kalender " . $sortby);
    cmpMaaned == "";
    while ($row = mysql_fetch_array($result))
    {
    If (cmpMaaned != $row['Maaned']) {
      echo "<tr><td>".$row['Maaned']."</td></tr>";
      cmpMaaned == $row['Maaned'];
    };
    echo "<tr><td width='20'></td><td>" . $row['Dag'] . "</td><td><a href='vis_arrangement.php?id=" . $row['id'] . "'title='for " . $row['target'] . "'>". $row['overskrift'] . "</a>" .
    "</td></tr>";
   
    };
?>
Avatar billede MSR Juniormester
30. august 2007 - 22:41 #5
Jo jeg bruger MONTH for jeg bryder mig ikke om de engelske navne på månederne. Jeg overvejer nu at lave et left join selvom det virker overkill.
Jeg kan ikke se det virker det du har skrevet med cmpMaaned == ""; er det ikke fordi du hver gang netop sætter mpMaaned == "";??? så vil den ALDRIG være ==$row['Maaned']) jo?
eller er det fordi du ikke har en ELSE ?

jeg prøver sådan her:
<?
$result = mysql_query("SELECT id, MONTHNAME(tidstart) AS Maaned, DAY(tidstart) AS Dag, overskrift, target FROM kalender " . $sortby);
    while ($row = mysql_fetch_array($result))
    {
    If (cmpMaaned != $row['Maaned']) {
      echo "<tr><td colspan='3'>".$row['Maaned']."</td></tr>";
      cmpMaaned == $row['Maaned'];
  } ELSE {
    echo "";  };
    echo "<tr><td width='20'></td><td>" . $row['Dag'] . ".</td><td><a href='vis_arrangement.php?id=" . $row['id'] . "'title='for " . $row['target'] . "'>". $row['overskrift'] . "</a>" .
    "</td></tr>";
 
    };
?>

men det virker sgu heller ikke. damn!!! 
    };
Avatar billede MSR Juniormester
30. august 2007 - 22:45 #6
Så for pokker da. idéen var god nok. det skulle bare huskes som variabler jo.

<?
$result = mysql_query("SELECT id, MONTHNAME(tidstart) AS Maaned, DAY(tidstart) AS Dag, overskrift, target FROM kalender " . $sortby);
    while ($row = mysql_fetch_array($result))
    {
    If ($cmpMaaned != $row['Maaned']) {
      echo "<tr><td colspan='3'>".$row['Maaned']."</td></tr>";
      $cmpMaaned = $row['Maaned'];
  } ELSE {
    echo "";  };
    echo "<tr><td width='20'></td><td>" . $row['Dag'] . ".</td><td><a href='vis_arrangement.php?id=" . $row['id'] . "'title='for " . $row['target'] . "'>". $row['overskrift'] . "</a>" .
    "</td></tr>";
 
    };
?>
det virker fint. tak for hjælpen. Kan du evt også hjælpe mig med det left join så jeg får de rigtige navne på månederne?

På forhånd tak
Avatar billede MSR Juniormester
30. august 2007 - 22:57 #7
Nu tager jeg kun den øverste linie for resten virker jo:

$result = mysql_query("SELECT id, MONTH(tidstart) AS Maaned, maanedsnavne.navn RIGHT JOIN kalender ON kalender.Maaned=maanedsnavne.nummer, DAY(tidstart) AS Dag, overskrift, target FROM kalender " . $sortby);

det virker til gengæld ikke. jeg har sgu aldrig luret de joins der. pis´ oss
Den nye tabel hedder maanedsnavne og har et nummer (1-12) med hver et navn (jan-dec)
Avatar billede kjulius Novice
30. august 2007 - 23:03 #8
Ja, det var netop det. Jeg glemte at variabler skal prefixes med $ i PHP. Men jeg tror du tager fejl, hvis du indsætter et ELSE, for så mister du jo den række, hvor skiftet sker.

Mht. en left join for at finde månedsnavnet, så er det intet problem.

$result = mysql_query("SELECT k.id, m.Maaned, DAY(k.tidstart) AS Dag, k.overskrift, k.target FROM kalender k LEFT JOIN maaneder m ON m.maanednr = MONTH(k.tidstart)" . $sortby);

Men det burde nu slet ikke være nødvendigt, forudsat at du bruger MySQL version 5.0.25 kan du sætte locale til dansk, således at MONTHNAME vil returnere korrekte danske månedsnavne.

Fra MyAdmin (eller via ODBC?) udføres denne kommando:

SET lc_time_names = 'da_DK';
Avatar billede MSR Juniormester
30. august 2007 - 23:17 #9
jeg bruger så desværre PHP Version 4.4.7
Så det er bare igang med den left join. æv altså...

Det virker fint med den ELSE for hvis måneden findes skal der slet ikke være en tom tr uden indhold. så skal det nsæte arrangement vises og det gør det.

Tak for hjælpen endnu engang. når jeg får det her til at virke får du dine points :D
Avatar billede MSR Juniormester
30. august 2007 - 23:30 #10
$result = mysql_query("SELECT k.id, DAY(k.tidstart) AS Dag, k.overskrift, k.target, MONTH(k.tidstart) AS Maaned FROM kalender k LEFT JOIN maanedsnavne m ON m.maanednummer = MONTH(k.tidstart)" . $sortby);

Nu prøvede jeg den her. den du skrev virkede ikke...

$result = mysql_query("SELECT k.id, DAY(k.tidstart) AS Dag, k.overskrift, k.target, MONTH(k.tidstart) AS Maaned FROM kalender k, maanedsnavne.nummer FROM maanedsnavne RIGHT JOIN kalender ON MONTH(kalender.tidstart)=maanedsnavne.nummer" . $sortby);

Er det her helt hen i skoven?
Avatar billede kjulius Novice
30. august 2007 - 23:34 #11
Jo, men hvis vi nu tager et sæt rækker som:

Juni, 25, ksflksfl
Juni, 26, kklklss
Juni, 28, kslsdlfslf
Juli, 22, klsldflsf
August, 11, skslfsdfjls
August, 22, jsldfslflsf

Med din kode ville du så få:

Juni
26, kklklss
Juli
August
22, jsldfslflsf

Det var jo ikke lige det, der var meningen.
Med min oprindelige kode uden ELSE ville du have fået:

Juni
25, ksflksfl
26, kklklss
28, kslsdlfslf
Juli
22, klsldflsf
August
11, skslfsdfjls
22, jsldfslflsf

Jeg beklager, at jeg ikke havde læst din kommentar, hvor du angiver dine tabel og feltnavne. Her er den reviderede version:

$result = mysql_query("SELECT k.id, m.navn, DAY(k.tidstart) AS Dag, k.overskrift, k.target FROM kalender k LEFT JOIN maanednavne m ON m.nummer = MONTH(k.tidstart)" . $sortby);
Avatar billede MSR Juniormester
30. august 2007 - 23:45 #12
Det er jeg ikke helt enig i.
For det første får jeg alle arrangementer med? for det andet er der jo en ); efter ELSE hvilket vel betyder at A ELLER B + C ?
A= "maned"
B= ""
C= resten af arrangementerne.

Dog virker den left join stadig ikke.
Avatar billede MSR Juniormester
30. august 2007 - 23:50 #13
<?
$result = mysql_query("SELECT k.id, m.navn, DAY(k.tidstart) AS Dag, k.overskrift, k.target FROM kalender k LEFT JOIN maanedsnavne m ON m.nummer = MONTH(k.tidstart)" . $sortby);
    while ($row = mysql_fetch_array($result))
    {
    If ($cmpMaaned != $row['navn']) {
      echo "<tr><td colspan='3'>".$row['navn']."</td></tr>";
      $cmpMaaned = $row['navn'];
  } ELSE {
    echo "";  };
    echo "<tr><td width='20'></td><td>" . $row['Dag'] . ".</td><td><a href='vis_arrangement.php?id=" . $row['id'] . "'title='for " . $row['target'] . "'>". $row['overskrift'] . "</a>" .
    "</td></tr>";
 
    };
?>

Så virker det. jeg skulle naturligvis rette til "navn" istedet for "maaned".
Smid et svar så får du points og et tusind tak for hjælpen.
Avatar billede kjulius Novice
31. august 2007 - 00:45 #14
Du har ret. Jeg overså, at du echoer en blank. PHP er som sagt ikke lige mit felt. Der er alt for mange krøllede og kantede paranteser for min smag. :-)

Jeg har for øvrigt allerede afgivet et svar. :-)
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
Computerworld tilbyder specialiserede kurser i database-management

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