[PHP/SQL] Datum categorie

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,

Ik ben bezig met een nieuws module te maken, en nu loop ik tegen een klein stom rot foutje aan =P

Ik hoop dat jullie me verder kunnen helpen, hier volgt het "Probleem":

Ik heb een database model:
-Nieuws_titel
-Nieuws_bericht
-Nieuws_datum
en overige velden

Nu wil ik dus graag dat alle berichten uit november onder elkaar worden weergegeven, met als top November..

Voorbeeld:

November:
-bericht sdsdsd
-bericht 2 blablablbalkba
December
-Bericht
Januarie
-Nog meer berichten

Alleen ik krijg dit niet voor :P elkaar iemand een idee?

Acties:
  • 0 Henk 'm!

  • WernerL
  • Registratie: December 2006
  • Laatst online: 13:08
Hoe sla je de datum op?
Als een timestamp?

Roses are red, violets are blue, unexpected '{' on line 32.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ja.. als date veld type..

dus zo: 2007-11-20

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:54

Janoz

Moderator Devschuur®

!litemod

Zorg dat je je berichten op datum sorteert en dan bij het afdrukken gewoon de maand van het vorige nieuwsbericht bijhouden. Zodra deze ongelijk is aan de huidige maand render je een nieuwe kop. Doe je dit aan eht begin van de uitleeslus en zorg je dat die 'previousMonth' geinitialiseerd staat op iets anders dan een bestaande maand dan komt er boven je eerste berichtje ook keurig een maand kop.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hmm, hoe zou ik dit precies kunnen doen? ik begrijp je principe wel, alleen de uitvoer ga ik niet begrijpen, hoe kan ik dit controleren enzo?

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:54

Janoz

Moderator Devschuur®

!litemod

Hoe je dit aan moet pakken? Simpel. Deel je probleem op in sub probleempjes en ga die stuk voor stuk oplossen. Probeer te achterhalen hoe je aan de maand komt als je een datum hebt. Zoek uit hoe je twee variabelen met elkaar kunt vergelijken en hoe je op basis daarvan een stuk code wel of niet uitvoerd en uiteindelijk alles samenvoegen tot een werkend geheel.

Wat heb je al geprobeerd en wat lukt er precies niet?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
PHP: filename
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
while($row = mysql_fetch_assoc($cNieuws->result)):
                    
                    list($jaar,$maandnr,$dag) = split('-',$row['nieuws_datum']);
                    $maand = array( '01' => 'januari',
                                    '02' =>'februari',
                                    '03' =>'maart',
                                    '04' =>'april',
                                    '05' =>'mei',
                                    '06' =>'juni',
                                    '07' =>'juli',
                                    '08' =>'augustus',
                                    '09' =>'september',
                                    '10' =>'oktober',
                                    '11' =>'november',
                                    '12' =>'december'                   
                                    );
                                    
                        
                        
                        
                        echo '<h2>'.$maand[$maandnr].'</h2><br>';
?>
                                <b><?=$maand[$maandnr]?></b><br>
                    <b><?=$row['nieuws_titel']?></b>
                    <p><?=inkorten($row['nieuws_bericht'],400,$row['nieuws_ID'])?></p>
<?PHP
        endwhile;
                }
            
            ?>


Dit is de code die ik nu heb, dus ik kan de maand alwel weergeven.. Maar kan ze alleen niet bij elkaar bundelen!

Acties:
  • 0 Henk 'm!

  • DarkFly
  • Registratie: December 2004
  • Niet online
Wat dacht je ervan om je de volgende SQL-query te gebruiken:
SELECT * FROM database WHERE Nieuws_datum like '2007-11-%';

Zo haal je alleen de rijen uit de database waar de nieuws_datum begint met 2007-11, dus welke uit november komen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ja dat had ik ook al geprobeerd, alleen als er dan twee berichten zijn met de datum november bijvoorbeeld:
2007-11-06
2007-11-14

Dan wordt er dus twee keer november geprint, en onder november beide berichten, dus elk bericht komt er twee keer te staan!

Acties:
  • 0 Henk 'm!

  • Joshua
  • Registratie: Juli 2005
  • Laatst online: 18-08 23:59
SELECT DISTINCT gebruiken?

Acties:
  • 0 Henk 'm!

  • fleppuhstein
  • Registratie: Januari 2002
  • Laatst online: 07-09 13:37
DarkFly schreef op dinsdag 20 november 2007 @ 15:43:
Wat dacht je ervan om je de volgende SQL-query te gebruiken:
SELECT * FROM database WHERE Nieuws_datum like '2007-11-%';

Zo haal je alleen de rijen uit de database waar de nieuws_datum begint met 2007-11, dus welke uit november komen.
Waarom, dan moet je voor alle berichten van 1 jaar gelijk 12 queries gebruiken ?

Als je gewoon een Select * from tabel order by date, en vervolgens voordat je echo'd kijkt of de maand van de huidige row gelijk is aan die van de vorige row. Indien ja, row plaatsen, immers er is geen nieuwe kop nodig. Is deze wel anders dan moet je een nieuwe kop generen, op basis van de maand. En als je dit in een loop zet voor alle rows, heb je een mooie oplossing. Die erg compact in code is, en slechts 1 query uitvoerd, die slechts een uitdraai van de tabel is, en niet moet zoeken met 'like'.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Maar hoe controleer ik of een row gelijk is aan de vorige row? Als ik dat weet, dan ben ik eruit :P haha

Acties:
  • 0 Henk 'm!

Verwijderd

edit:
Useless comment.

[ Voor 91% gewijzigd door Verwijderd op 20-11-2007 15:58 ]


Acties:
  • 0 Henk 'm!

  • hornage
  • Registratie: November 2001
  • Laatst online: 24-09-2024
Hieronder ff de opzet hiervoor
PHP:
1
2
3
4
5
6
7
8
  $lastmonth = "";
  while ($row = mysql_fetch_array($output)) {
    if ($row["date"] != $lastmonth) {
      echo monthname($row["date"]);
      $lastmonth = monthname($row["date"]);
    }
    echo $row["artikel"];
  }

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ok nu begrijp ik het concept wat je bedoeld, ik zal deze eens uitproberen!

Het werkt, heel erg bedankt allemaal!

hieonder mijn script:

PHP: filename
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 
    $lastmonth = "";
                    while($row = mysql_fetch_assoc($cNieuws->result)):                  
                    list($jaar,$maandnr,$dag) = split('-',$row['nieuws_datum']);
                    $maand = array( '01' => 'januari',
                                    '02' =>'februari',
                                    '03' =>'maart',
                                    '04' =>'april',
                                    '05' =>'mei',
                                    '06' =>'juni',
                                    '07' =>'juli',
                                    '08' =>'augustus',
                                    '09' =>'september',
                                    '10' =>'oktober',
                                    '11' =>'november',
                                    '12' =>'december'                   
                                    );
                                    
                        
                        
                        if($lastmonth != $maand[$maandnr])
                        {
                            echo '<b>'.$maand[$maandnr].'</b><br><br>';
                            $lastmonth = $maand[$maandnr];
                        }
                        else
                        {
                            echo '';
                        }
                        
                ?>
                        
                    
                    <b><?=$row['nieuws_titel']?></b>
                    <p><?=inkorten($row['nieuws_bericht'],400,$row['nieuws_ID'])?></p>
            <?PHP
                    endwhile;
                }
            
            ?>

[ Voor 87% gewijzigd door Verwijderd op 20-11-2007 16:14 ]


Acties:
  • 0 Henk 'm!

  • ATS
  • Registratie: September 2001
  • Laatst online: 10-09 06:36

ATS

Je kan natuurlijk ook direct het maandnummer vergelijken en lastmonth laten refereren aan het nummer in plaats van de naam van de maand. Initialiseren op 0 en je bent klaar. Scheelt toch weer wat array lookups. OK, die zijn niet heel duur, maar toch...

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


Acties:
  • 0 Henk 'm!

  • fleppuhstein
  • Registratie: Januari 2002
  • Laatst online: 07-09 13:37
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php

$lastmonth = "";
$maand = array('01' => 'januari','02' =>'februari','03' =>'maart','04' =>'april','05' =>'mei','06' =>'juni','07' =>'juli','08' =>'augustus','09' =>'september','10' =>'oktober','11' =>'november','12' =>'december' );

while($row = mysql_fetch_assoc($cNieuws->result)):                    
    
    list($jaar,$maandnr,$dag) = split('-',$row['nieuws_datum']);
                                    
    if($lastmonth != $maand[$maandnr]) {
        echo '<b>'.$maand[$maandnr].'</b><br><br>';
        $lastmonth = $maand[$maandnr];
    }
    
    echo "<b>".$row['nieuws_titel']."</b><p>".inkorten($row['nieuws_bericht'],400,$row['nieuws_ID']);     
    echo "</p>\n";

endwhile;
                
?>


Zoeits moet het zelfde bereiken, en zal iets beter, en sneller werken. Onnodige else met een lege echo verwijderd, en de declaratie van je maanden buiten je while gehaald.

[ Voor 3% gewijzigd door fleppuhstein op 20-11-2007 16:46 ]


Acties:
  • 0 Henk 'm!

  • ATS
  • Registratie: September 2001
  • Laatst online: 10-09 06:36

ATS

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php

$lastmonth = 0;
$maand = array('01' => 'januari','02' =>'februari','03' =>'maart','04' =>'april','05' =>'mei','06' =>'juni','07' =>'juli','08' =>'augustus','09' =>'september','10' =>'oktober','11' =>'november','12' =>'december' );

while($row = mysql_fetch_assoc($cNieuws->result)) {                    
    
    list($jaar,$maandnr,$dag) = split('-',$row['nieuws_datum']);
                                    
    if($lastmonth != $maandnr) {
        echo '<b>'.$maand[$maandnr].'</b><br><br>';
        $lastmonth = $maandnr;
    }
    
    echo "<b>".$row['nieuws_titel']."</b><p>".inkorten($row['nieuws_bericht'],400,$row['nieuws_ID']);     
    echo "</p>\n";

}
                
?>

Suggestie van fleppuhstein en mij gecombineerd. :) Overigens moet je natuurlijk ook nog zoiets toevoegen voor jaren. Immers, januari 2007 en 2008 zijn niet hetzelfde, en wat als er daar tussen geen berichten gepost worden? Heb trouwens ook die lelijke endwhile even eruit gesloopt...

[ Voor 3% gewijzigd door ATS op 20-11-2007 17:09 ]

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant

Pagina: 1