PHP/MySQL arhive sadrzaja iz baze

Ovako, imam bazu sa Table ‘content’ i u njoj Polja ‘title’, ‘content’, ‘date_year’, ‘date_month’, ‘date_day’.

Ono sto zelim napravit je arhiva kao u Wordpress-u. Da mi skripta iz baze ucita i sortira sve clanke prema godini i mjesecu i ispise ‘title’ clanka ispod mjeseca odnosno godine u kojoj je unesen.

Napravio sam to ovako:

echo "<h2>Archive</h2>";

$year_sql = "SELECT DISTINCT date_year FROM content";
$year_query = mysql_query($year_sql) or die(mysql_error());

$month_sql = "SELECT DISTINCT date_month FROM content";
$month_query = mysql_query($month_sql) or die(mysql_error());

while ($year_fetch = mysql_fetch_array($year_query)) {
$year = $year_fetch['0'];
echo "<a href='archive.php?year=$year'>$year</a>";
echo "
";

while ($month_fetch = mysql_fetch_array($month_query)) {
$month = $month_fetch['0'];
echo "<a href='archive.php?year=$year&month=$month'>$month</a>";
echo "
";
}
}

I funkcionira tocno kako sam zamislio.

Sad me zanima jel moguce to napraviti sa poljem date u MySQL bazi u formatu YYYY-MM-DD, jer izgelda mi nezgodno imati 3 polja za datum ako mogu imati samo jedno.

Uglavnom zelim imati arhivu koja ce mi iz baze ispisati godinu u kojoj su uneseni postovi, zatim ispod te godine mjesece u kojima su uneseni postovi i na kraju naslove postova. M

Kako to napraviti, koristeci samo ‘date’ znaci YYYY-MM-DD?

Hvala svima :slight_smile:

Koliko mi sada pada na pamet nekom procedurom unutar MySQL-a ili sa malo više matematike u PHP-u (izvučeš sve zapise i onda sortiraš).

Recimo za PHP, izvučeš sve datume sortirane od najnovijeg prema nastarijem i onda samo ideš korz svaki zapis. Sa date uzmeš godinu i spremiš u niz kao ključ (a taj ključ kao vrijednost ima niz koji će za svoje ključeve imati mjesece). Sada u svaki mjesec spremaš onaj članak koji odgovara godini i mjesecu. Time znaš koji mjeseci imaju nešta jer su samo oni postavljeni na nešta :).

To mi prvo pada na pamet sada u 2:18 :smiley:

Hvala Zlikovac :smiley:

Tako sam i ja nesto razmisljao, al znas sta me muci, ne znam jel pametno toliko puno stvari radit sa PHP-om ako se moze sa MySQL-om dobit sve sto treba. Ne znam koja je tu fora inace odnos PHP-a i MySQL-a, mislim da sam negdje citao da je najbolje i najbrze ako sve sto mozes napravis SQL query-em, znaci dobijes odmah gotove podatke za PHP.

Jel bolje ovo napravit sa procedurom unutar MySQL-a i kojom? :smiley: Ili je svejedno jel to radim procedurom unutar MySQL-a ili PHP-om?

pa staviš ORDER BY Datum
i onda imaš varijablu $tempYear koja sadrži trenutnu godinu (onu koju ispisuješ)
provjeravaš ako je godina različita od $tempYear pa onda setiraš tempYear opet na trenutnu godinu, a ispisuješ samo mjesece

[quote=“Limeni”]Ovako, imam bazu sa Table ‘content’ i u njoj Polja ‘title’, ‘content’, ‘date_year’, ‘date_month’, ‘date_day’.

Ono sto zelim napravit je arhiva kao u Wordpress-u. Da mi skripta iz baze ucita i sortira sve clanke prema godini i mjesecu i ispise ‘title’ clanka ispod mjeseca odnosno godine u kojoj je unesen.

Napravio sam to ovako:

echo "<h2>Archive</h2>";

$year_sql = "SELECT DISTINCT date_year FROM content";
$year_query = mysql_query($year_sql) or die(mysql_error());

$month_sql = "SELECT DISTINCT date_month FROM content";
$month_query = mysql_query($month_sql) or die(mysql_error());

while ($year_fetch = mysql_fetch_array($year_query)) {
$year = $year_fetch['0'];
echo "<a href='archive.php?year=$year'>$year</a>";
echo "
";

while ($month_fetch = mysql_fetch_array($month_query)) {
$month = $month_fetch['0'];
echo "<a href='archive.php?year=$year&month=$month'>$month</a>";
echo "
";
}
}

I funkcionira tocno kako sam zamislio.

Sad me zanima jel moguce to napraviti sa poljem date u MySQL bazi u formatu YYYY-MM-DD, jer izgelda mi nezgodno imati 3 polja za datum ako mogu imati samo jedno.

Uglavnom zelim imati arhivu koja ce mi iz baze ispisati godinu u kojoj su uneseni postovi, zatim ispod te godine mjesece u kojima su uneseni postovi i na kraju naslove postova. M

Kako to napraviti, koristeci samo ‘date’ znaci YYYY-MM-DD?

Hvala svima :)[/quote]

Ne kuzim smisao ispisa po mjesecima, al dobro.

Ako ces koristiti date, ovako nekako mozes izvuci sta ti treba:

SELECT DISTINCT MONTH(date_opened), YEAR(date_opened) FROM content

[quote=“ivan.skugor”]Ne kuzim smisao ispisa po mjesecima, al dobro.

Ako ces koristiti date, ovako nekako mozes izvuci sta ti treba:

SELECT DISTINCT MONTH(date_opened), YEAR(date_opened) FROM content[/quote]

ovo će mu dati samo jedan članak za svaki mjesec godinu…
Koliko sam ja skužio napisao je sve članke, a on želi samo to grupirati kroz godine/mjesece, makar vrlo vjerojatno da sam ja nešt krivo skužio

Ako želiš da MySQL obavi sav posao možeš napraviti proceduru koja će napraviti ono što bi trebao PHP ali da ti vrati serializirani niz koji onda sa PHP unserializiraš :). Iako mislim da ono sa PHP ne bi trebalo utjecati na performanse jer teško da će radit sa 1000000 članaka :slight_smile:

[quote=“Kečko”]ovo će mu dati samo jedan članak za svaki mjesec godinu…
Koliko sam ja skužio napisao je sve članke, a on želi samo to grupirati kroz godine/mjesece, makar vrlo vjerojatno da sam ja nešt krivo skužio[/quote]

Onda stavi GROUP BY i rjesen problem. :smiley:

Zbog cega proceduru?

Serijalizirani niz??

A to mi je prvo palo na pamet. Maloprije sam se tek probudio

više neznam u čemu je problem, ali još jednom ću ponoviti, ljudi se previše opterečuju performansama…
Na početku najvažnije je d aizradiš projekt, ako ti radi posao ne diraj ga… Ako dolazi do prevelikog loada, pogledaš na brzinu dal ima nešt za optimizirat (najbolje imati TODO listu u koju bacaš što se može optimizirati ) ako ti se neda nabaviš jači server i gazi… Ipak je danas hardwer jeftiniji od programera

[quote=“Kečko”]više neznam u čemu je problem, ali još jednom ću ponoviti, ljudi se previše opterečuju performansama…
Na početku najvažnije je d aizradiš projekt, ako ti radi posao ne diraj ga… Ako dolazi do prevelikog loada, pogledaš na brzinu dal ima nešt za optimizirat (najbolje imati TODO listu u koju bacaš što se može optimizirati ) ako ti se neda nabaviš jači server i gazi… Ipak je danas hardwer jeftiniji od programera[/quote]

Ako iz pocetka programiras pametno, mislim da u velikoj vecini slucajeva neces ni prismrdit nekom uskom grlu. Analiza zahtjeva i procjena opterecenosti sustava, pa tim i dizajna sustava igra veliku ulogu.

Al ne kuzim zasto to tu pises. :smiley:

@Limeni

Tvoj gornji upit ti samo slučajno radi točno to što hoćeš. Pokušaj simulirati situaciju u kojoj u bazi imaš članke u dvjema godinama, npr. 2009 i 2010. No, dok za 2009. imaš članke u svim mjesecima, za 2010. imaš samo u prvom mjesecu.

Ići ovako nešto raditi nekakvim posebnim SQL upitima je bespotrebno, jer baš ništa nećeš pojednostavniti kod u odnosu da naprosto selektiraš sve naslove članaka od nekog početnog do završnog datuma, sortirano uzlazno po datumu.

Potom iteriraš od zapisa do zapisa i uvijek pamteći prethodni datum (trailer) provjeravaš da li datum tekućeg zapisa (iterator) ima isti mjesec i godinu. U slučaju promjene samo generiraš potreban kod zaglavlja mjeseca, odn. mjeseca i godine. Na početku naprosto inicijaliziraš trailer na nešto nepostojeće, tako da ti prva usporedba da razliku i u mjesecu i u datumu i okine ispis prvog zaglavlja.

Evo konacno sam ulovio vremena i sredio arhivu :slight_smile:

function archiveOut() {
		
$sqlYear = "SELECT DISTINCT YEAR(date) AS year FROM content_manager ORDER BY date";
$queryYear = mysql_query($sqlYear) or die(mysql_error());
while($fetchYear = mysql_fetch_array($queryYear)) {
$year = $fetchYear['year'];
echo "<h2>Year: " . $year . "</h2>";
echo "
";
				
$sqlMonth = "SELECT DISTINCT MONTHNAME(date) AS month FROM content_manager WHERE YEAR(date) = '$year' ORDER BY date";
$queryMonth = mysql_query($sqlMonth) or die(mysql_error);
while($fetchMonth = mysql_fetch_array($queryMonth)) {
$month = $fetchMonth['month'];
echo "<a href='article.php?year=$year&month=$month'>" . $month . "</a>";
echo "
";
}
}
}

Ovako izgleda kod i funkcionira sve savrseno. U mysql bazi imam ovako: id, title, content i date, date je u formatu YYYY-MM-DD hh:mm:ss.

@tsereg

Pokusao sam napravit sto si napisao, popunit clancima 2009 godinu za svaki mjesec a u 2010 samo za sjecanj i radi mi kako treba, upisao sam clanke za svaki mjesec u 2009 i 2010 godini i svaki put mi dobro ispise prvo godinu a onda ispod nje sve mjeseci u kojima se nalazi sadrzaj. Jesam te dobro razumio?

Ako netko ima drugaciji nacin za napravit ovo ili ispravit neke stari neka slobodno tipka.

Jeli je moguće napraviti formu za unos podataka (Lavarel PHP) da bude identična kao ova u privitku?
Nemogu priložiti fotografiju niti u pdf-u.