PHP-frågor

Avdelningen för webbrelaterad programmering och grafisk design.
Skriv svar
Användarvisningsbild
lither
Hedersbit
Inlägg: 9507
Blev medlem: 2002-03-09 21:12:13
Ort: Göteborg
Kontakt:

PHP-frågor

Inlägg av lither » 2009-05-04 17:15:44

Jag är ledsen för att vara så ospecifik, men jag kommer med tiden att fylla på med fler frågor rörande en sajt som använder vissa PHP-funktioner där jag behöver hjälp, och vill slippa att dela upp det i flera trådar.

Först ut är i alla fall en fråga om preg_replace(). Jag vill ändra en datumkod, som är uppbyggd på strftime('%Y%m%d'), alltså exempelvis 20090507. Denna vill jag i en echo dela upp och få 2009-05-07 som output. Datan är lagrad i en databas, så bry er inte om att blanda in strftime-funktionen i preg_replace.

Sill
1. Nigger guy, two words which by themselves are harmless, but when combined they form a verbal missile of hate.
2. Vivaldi
3. Buffalos ...

Användarvisningsbild
linc
Administratör
Inlägg: 7602
Blev medlem: 2002-02-13 22:22:11
Ort: Skåneland
Kontakt:

Re: PHP-frågor

Inlägg av linc » 2009-05-04 17:58:20

Det är effektivare att använda sig av substr() när det är såna här enkla saker.

Exempel:

Kod: Markera allt

<?php
$date='20090507';
echo substr($date, 0, 4) . '-' . substr($date, 4, 2) . '-' . substr($date,6,2);
?>
hej.

Användarvisningsbild
lither
Hedersbit
Inlägg: 9507
Blev medlem: 2002-03-09 21:12:13
Ort: Göteborg
Kontakt:

Re: PHP-frågor

Inlägg av lither » 2009-05-05 10:01:59

Ah, en funktion jag helt gått miste om. Tack för den, linc!

Nästa fråga då:
Vad stoppar jag inom date=" " för att min query ska endast visa data från den nuvarande månaden, om ett exempel på ett datum ser ut som tidigare (ex "20090509")? Är jag helt vilse om jag ska använda mig av strpos()?

Kod: Markera allt

$result = mysql_query("SELECT * FROM transactions WHERE 1, date=" " ORDER BY date DESC, id DESC");
1. Nigger guy, two words which by themselves are harmless, but when combined they form a verbal missile of hate.
2. Vivaldi
3. Buffalos ...

Användarvisningsbild
xerxes
Inlägg: 835
Blev medlem: 2002-03-08 21:48:21
Ort: Lund
Kontakt:

Re: PHP-frågor

Inlägg av xerxes » 2009-05-05 12:04:00

Kolla upp LIKE:

Kod: Markera allt

$result = mysql_query("SELECT * FROM transactions WHERE date LIKE '".strftime('%Y%m')."%' ORDER BY date DESC, id DESC");
There are 2 kinds of people in the world: Those who understand hexadecimal, and those who don't.

Användarvisningsbild
lither
Hedersbit
Inlägg: 9507
Blev medlem: 2002-03-09 21:12:13
Ort: Göteborg
Kontakt:

Re: PHP-frågor

Inlägg av lither » 2009-05-05 12:31:48

xerxes skrev:Kolla upp LIKE:

Kod: Markera allt

$result = mysql_query("SELECT * FROM transactions WHERE date LIKE '".strftime('%Y%m')."%' ORDER BY date DESC, id DESC");
Cool. Och säg om jag skulle vilja ha det mellan ett tidspan, från den 25:e förra månaden, till den 24:e den pågående, hur ser det ut då? Jag tror att jag har listat ut början ...

Kod: Markera allt

LIKE '".strftime('%Y%m', strtotime('-1 month'))."25'
... men kan inte luska ut hur det ska sträcka sig mellan två datum.
1. Nigger guy, two words which by themselves are harmless, but when combined they form a verbal missile of hate.
2. Vivaldi
3. Buffalos ...

Användarvisningsbild
linc
Administratör
Inlägg: 7602
Blev medlem: 2002-02-13 22:22:11
Ort: Skåneland
Kontakt:

Re: PHP-frågor

Inlägg av linc » 2009-05-05 15:32:57

Det beror lite på hur det är lagrat i databasen. Är kolumnen i tabellen lagrad som en sträng (varchar/text/blob/whatever) och du bara har t ex "20090509" lagrad där, är det bättre att lagra det i formatet timestamp eller som en integer. Dessutom är det förödande för prestandan att använda sig av "LIKE" (som bara används för att söka efter delar av strängar).

Men för att svara på din fråga:

Kod: Markera allt

$result = mysql_query("SELECT * FROM transactions WHERE UNIX_TIMESTAMP(date) BETWEEN UNIX_TIMESTAMP('20090201') AND UNIX_TIMESTAMP('20090501')");
Borde fungera, förutsatt att "date" har formatet YYYYMMDD. Har inte testat dock..
hej.

Användarvisningsbild
lither
Hedersbit
Inlägg: 9507
Blev medlem: 2002-03-09 21:12:13
Ort: Göteborg
Kontakt:

Re: PHP-frågor

Inlägg av lither » 2009-05-13 13:16:51

Kod: Markera allt

$result = mysql_query("SELECT * FROM transactions WHERE UNIX_TIMESTAMP(date) BETWEEN UNIX_TIMESTAMP($date1) AND UNIX_TIMESTAMP($date2)");
Nu står det dock still hur jag ska ange variablarna $date1 och $date2. Jag vill att den ska presentera samma data om det är den 26 april som om det vore den 1 maj. Tidsspannet ska vara den 25 april till 24 maj (eller 25 maj–24 juni, eller 25 juni–24 juli, osv). Det räcker alltså inte med strftime('%Y%m', strtotime('-1 month')) och sedan lägga till 25 i slutet för $date1, då det kan vara någon av de sista dagarna i samma månad och då får jag data från fel månad. Hur löser jag detta?
1. Nigger guy, two words which by themselves are harmless, but when combined they form a verbal missile of hate.
2. Vivaldi
3. Buffalos ...

Användarvisningsbild
linc
Administratör
Inlägg: 7602
Blev medlem: 2002-02-13 22:22:11
Ort: Skåneland
Kontakt:

Re: PHP-frågor

Inlägg av linc » 2009-05-15 10:51:32

Jag hänger inte riktigt med i varför det är ett problem, förklara gärna lite utförligare.

Mig veterligen finns det ingen månad vars sista datum är den 25e? :)
hej.

Användarvisningsbild
lither
Hedersbit
Inlägg: 9507
Blev medlem: 2002-03-09 21:12:13
Ort: Göteborg
Kontakt:

Re: PHP-frågor

Inlägg av lither » 2009-05-16 22:27:17

Jag utvecklar ett projekt för att styra upp min ekonomi. Där ska jag hämta och presentera data från mina transaktioner och ska kunna bläddra bland dessa för varje månad som går (och hoppa tillbaka). Jag ska ta ett konkret exempel på hur problemet kan se ut:

Nu är det maj månad. Så fort lönen trillar in den 25 vill jag börja jobba på ekonomin för juni månad därför bara presentera data, automatiskt, från den 25 maj, fram till den 24 juni. Nu ska scriptet känna av att även om det inte är juni månad ännu, så ska den presentera data mellan denna period. Och så fort det blir den 1 juni, ska den fortsätta att "känna av" vilken månad det är och fortfarande presentera datan för perioden 25 maj–24 juni. Hur anger jag detta i mina variabler, $date1 och $date2?
1. Nigger guy, two words which by themselves are harmless, but when combined they form a verbal missile of hate.
2. Vivaldi
3. Buffalos ...

Användarvisningsbild
linc
Administratör
Inlägg: 7602
Blev medlem: 2002-02-13 22:22:11
Ort: Skåneland
Kontakt:

Re: PHP-frågor

Inlägg av linc » 2009-05-17 0:54:43

Det finns säkert snyggare sätt att göra det på, men sådär rakt på hand hade jag löst det såhär:

Om följande kod körs idag (20090517) hade värdet av variablerna sett ut såhär:
$date1: 20090425
$date2: 20090524

Om koden däremot hade körts om en och en halv vecka (20090528) hade värdena sett ut såhär:
$date1: 20090525
$date2: 20090624

Kod: Markera allt

if (date('j') < 26) {
  $date1 = date('Ym', mktime(1,0,0, date('n'), 0)) . '25';
  $date2 = date('Ym') . '24';
} else {
  $date1 = date('Ym') . '25';
  $date2 = date('Ym', mktime(1,0,0, date('n')+1, 1)) . '24';
}
Har dock inte testkört koden, så jag lovar inte att den funkar i alla tänkbara sammanhang (skottsekunder eller vad det nu kan vara).
hej.

Skriv svar