SQL-kod för arkiv

Publicerat: 2013-05-04 21:56:17 | Kategori: PHP & SQL

Kvällens stora uppdatering var som sagt ett bloggarkiv. I min databas så läggs en tidsstämpel till automatiskt när jag skrivit ett inlägg. Det är i "CURRENT_TIMESTAMP" som är formaterat som "0000-00-00 00:00:00". Det är väldigt passande för att visa i inlägg, men är inte sådär jätteanpassat för ett arkiv. Utmaningen var alltså att konvertera om tidsstämpeln till månad och år.

Det finns många sätt att lösa det med, men i mitt fall valde jag att göra det endast med sql. För att visa månad och år i menyn användes följande:

$sql = "SELECT DISTINCT DATE_FORMAT(datum, '%M %Y') AS 'month', DATE_FORMAT(datum, '%M-%Y') AS 'month2' FROM posts ORDER BY datum DESC";

För att översätta till svenska blir det ungefär "välj unika datum formaterade i månad och år och kalla det för månad". I princip gör den samma sak två gånger just nu. En gång för att visa och en gång för att skapa en länk. Det hade varit bättre att lägga till ett streck med en str_replace i php, men jag ville bara få det löst så fort som möjligt. :)

För att visa inläggen för den aktuella månaden och året så krävs det ytterligare en kodsnutt:

$sql = "SELECT * FROM posts WHERE DATE_FORMAT(datum, '%M-%Y') = '$search_archive' ORDER BY datum DESC";

Här väljer databasen ut månad-år och jämför det med $search_archive som i detta fallet är $_GET-värdet från länken som skapades högre upp.

 

Uppdatering 2013-05-04
Något som slog mig häromdagen är att MySQL faktiskt visar månaderna på engelska vilket är ett litet problem om man har en hemsida på svenska vilket är fallet här. Ett enkelt sätt att lösa detta på är att sätta upp en array och översätta med preg_replace. Först och främst så behöver vi inte översätta alla månader, endast hälften skiljer sig. Vi sätter först upp en enkel array och skriver de engelska namnen på månaderna.

$patterns = array('/January/', '/February/', '/March/', '/May/', '/June/', '/July/', '/October/'); 

Efter detta så måste vi skapa ännu en array med de svenska namnen.

$replacements = array('Januari', 'Februari', 'Mars', 'Maj', 'Juni', 'Juli', 'Oktober'); 

Nu gäller det bara att koppla ihop dem med en preg_replace.

$timestamp2 = preg_replace($patterns, $replacements, $timestamp); 

$timestamp i detta fall är vad som tas ut ur databasen och formaterats om med date_format. Om inte preg_replace hittar ett ord från $patterns så kommer det inte att ändras, t ex "april". Om däremot ordet i $patterns skulle hittas så letar preg_replace upp översättningen i $replacements.

Det här fungerar såklart inte bara för månader, även dagar eller i princip vad som helst kan översättas på samma sätt.


comments powered by Disqus