Just nu i M3-nätverket
Jump to content

kommande / passerade


adji

Recommended Posts

tja,

håller på med en sida som skall visa ett spelschema, speldatumen sparas i en mysql databas och nu vill jag dela upp och visa dem antingen som kommande spelningar eller passerade/gjorda spelningar.

 

Trodde det skulle räcka med att göra ungefär såhär:

mysql_db_query("databas", "SELECT * FROM gigs WHERE datum > $nu ORDER BY datum");

där $nu är dagens datum och sedan bara vända på > för att visa spelade gigs...

Varför funkar inte detta?

Link to comment
Share on other sites

Det beror på hur tabellen ser ut (vilken datatyp kolumnen datum är), och vilket format $nu är i frågan. Du kan inte bara mixa sträng- och datumvärden.

 

Så här skulle det till ex. se ut:

CREATE TABLE gigs(
stad VARCHAR(255),
datum TIMESTAMP(8)
);

PHP-kod:

$sql = "SELECT * FROM gigs WHERE datum >= '" . addslashes(date("Ymd", time())) . "'";

 

Link to comment
Share on other sites

kolumnen datum är av datatypen text då användaren fyller i den manuellt, det skrivs in i formatet åååå-mm-dd och $nu returnerar datumet i formatet i samma format,

$nu = date("Y-m-d", time() +32400);

 

Link to comment
Share on other sites

Ja, då fungerar det inte alls att jämföra på det sättet.

I MySQL måste kolumnen antingen vara av datumtyp eller nummerisk.

 

Nu jämför du ju olika strängvärden, och då kan man inte använda sig av > och < på det sättet.

 

Så, jag föreslår att på det stället där du sparar datan i tabellen, omvandlar du det till ett timestampvärde, så kan du använda exemplet ovan.

 

Så här kan du omvandla, och göra indatakoll:

$_POST["datum"] = trim($_POST["datum"]);
$ok = preg_match("/^([0-9]{4})-([0-9]{2})-([0-9]{2})$/", $_POST["datum"], $träffar);

/* Se till att det är numeriska värden */
$träffar[0] = (int) $träffar[0];
$träffar[1] = (int) $träffar[1];
$träffar[2] = (int) $träffar[2];

/* Kontrollera om det var ett giltigt datum.
Byt ut 1999 till det tidigaste tillåtna året, och 2005 till det senaste. */
$startår = 1999;
$slutår = 2005;
if (!$ok || $träffar[0] < $startår || $träffar[0] > $slutår || !checkdate($träffar[1], $träffar[2], $träffar[0])) {
/* Kod som skriver ut att datumet var felformaterat */
echo "Felaktigt datum";
} else {
$datum = mktime(0,0,0,$träffar[1],$träffar[2],$träffar[0]);
/* Spara i databasen */
$sql = "INSERT INTO gigs (stad, datum) VALUES('" . addslashes($_POST["stad"]) . "', '" . addslashes(date("Ymd", $datum)) . "')";
mysql_query($sql);
echo "Sparat";
}

 

Link to comment
Share on other sites

Det finns fler fördelar med timestamp förresten.

Ett timestamp-värde tar 4 bytes, medan ett sådant strängvärde som du använder tar 11 bytes om det är av VARCHAR- eller TINYTEST-typ, 10 om det är CHAR, och 12 om det är TEXT-typ.

 

Det blir både mindre data att spara, och går snabbare.

 

Link to comment
Share on other sites

hm tror inte riktigt att jag fattar, har gjort som ovan men får endast

"fel datum" fram echoat, enligt exemplet skall man väl fylla i datumet med format åååå-mm-dd?

 

Link to comment
Share on other sites

Oj, förlåt.

Jag missade förskjutningen i matriserna.

Nedan är den korrigerade koden:

if ($_POST["datum"]){
$_POST["datum"] = trim($_POST["datum"]);
$ok = preg_match("/^([0-9]{4})-([0-9]{2})-([0-9]{2})$/", $_POST["datum"], $träffar);

/* Se till att det är numeriska värden */
$träffar[1] = (int) $träffar[1];
$träffar[2] = (int) $träffar[2];
$träffar[3] = (int) $träffar[3];

/* Kontrollera om det var ett giltigt datum.
Byt ut 1999 till det tidigaste tillåtna året, och 2005 till det senaste. */
$startår = 1999;
$slutår = 2005;
if (!$ok || $träffar[1] < $startår || $träffar[1] > $slutår || !checkdate($träffar[2], $träffar[3], $träffar[1])) {
/* Kod som skriver ut att datumet var felformaterat */
echo "Felaktigt datum";
} else {
$datum = mktime(0,0,0,$träffar[2],$träffar[3],$träffar[1]);
/* Spara i databasen */
$sql = "INSERT INTO gigs (stad, datum) VALUES('" . addslashes($_POST["stad"]) . "', '" . addslashes(date("Ymd", $datum)) . "')";
mysql_query($sql);
echo "Sparat $sql";
}
}

 

Link to comment
Share on other sites

kymriska

 

A ydych chwi yn siarad Cymraeg?

 

? ;)

 

 

Almir - ...

____________________________________________________________

-Läser Programmet för Informatik med Systemvetenskap på MDH, Västerås.-

 

Link to comment
Share on other sites

Nej,

Jag kan inte så mycket kymriska, men håller på att lära mig. Är på nybörjarstadiet än så länge.

 

Har inte så mycket tid över heller när allt man gör är programmerar (hur kan man säga att man programmerar utan att låta jättetråkig?) och roar sig ;)

 

Kan du flytande?

 

Link to comment
Share on other sites

Rikard Nilsson

Jag har jobbat vidare på min gamla form-date funktion (som nu blivit en class) den finns på http://www.nilsson-online.net/code/php/classes/noFormDate.php och den hanterar php's time()och gör till/från drop-boxar.

 

Några tips från folk här på eforum har letat sig in i den oxå.

 

Funkar dock bara om du använder just time() eftersom den använder sekunder och mktime (om ja inte glömt allt ja kodat i den =)

 

Link to comment
Share on other sites

Man bör akta sig för att använda time(). Det beror iofs lite på vad man ska göra med koden, men om man vänjer att använda sig av sekender under UNIX-epoken, så kan man inte (utan specialkod) skriva datum före 1970, samt efter 2040 (runt omkring).

 

Så för att göra sin kod säker bör man använda sig av andra rutiner. Date-objektet på http://pear.php.net är väldigt bra.

 

Koden jag skrivit ovan är dock säker, då den använder sig av MySQLs datumtyp, vilken inte har det problemet som PHP har. När man väl handskas med datumet i PHP så är det antingen en sträng, eller varje del (år/månad/dag) som ett heltal.

Funktionen checkdate() sätter dock begränsningen på året till max 32767, vilket inte torde bli något problem.

 

Link to comment
Share on other sites

Fredrik Stark

Jag har då aldrig behövt använda specialfunktioner för att använda negativa unix timestampvärden... kan du ge exempel?

 

Edit:

jo, jag vill bara säga att jag inte försöker vara spydig eller nåt, jag vill verkligen veta eftersom det kan vara idé för mig att göra om mina applikationer som använder sig av unix timestamp =)

[inlägget ändrat 2002-12-16 12:33:38 av Fredrik Stark]

Link to comment
Share on other sites

Nag ydw

 

'Rwedi dysgu Cymareg yn Uppsala 1968-1969 (20p), a 'roeddwn yng Ngymru am wythnos yn 1974.

 

Så särskilt flytande, nej. Och jag får nog ta fram lexikon om jag ska skriva nåt mer intelligent än det där.

 

(Hur sjutton flyttar man den här dialogen till ett lämpligare ställe? Jag gillar inte att störa PHP-forumet med det här. Och inte har jag fått avi i e-posten om svar heller, trots att jag kryssat i rutan.)

 

R-)

 

Link to comment
Share on other sites

Ja, jag har också funderat på kurs vid Uppsala, men har egentligen inte tid som sagt.

Men jag tycker det är ett vackert språk, därav intresset.

 

Att jag valde Cariad som signatur är väl inte så konstigt, då det är en väldigt viktig sak, och cariad är (mig veterligen) den starkaste formen. :)

 

Som tex Bwrdd ?

:)

 

Link to comment
Share on other sites

En tidsstämpel är ett heltal som har som största storlek 2^31.

 

Om man gå lägre, eller högre än detta värde från 1 januari 1970 så får man problem (dvs. < 1903 eller > 2038)

 

För mig (Linux, PHP 4.2.3) fungerar inte ens vissa datum-funktioner med datum innan 1970 alls.

 

Ibland spelar tidiga datum (<1970) mindre roll, om man inte tex. gör något historiskt arkiv. Men datum senare än 2038 bör man väl fundera på...

Tänk bara på hysterin kring 2000. Det är inte alls så säkert att våra applikationer inte kommer att användas då. Som nostalgia i alla fall? :)

echo "Fungerande:<br>";
echo mktime(0,0,0,12,16,1969) . "<br>";
echo mktime(0,0,0,12,16,2002) . "<br>";
echo mktime(0,0,0,12,16,2037) . "<br>";
echo strtotime ("10 September 2000") . "<br>";

echo "<br>";

echo "Ej fungerande:<br>";
echo mktime(0,0,0,12,16,1733) . "<br>";
echo mktime(0,0,0,12,16,1969) . "<br>";
echo mktime(0,0,0,12,16,2050) . "<br>";
echo strtotime ("10 September 1866") . "<br>";
echo strtotime ("10 September 1960") . "<br>";

 

Link to comment
Share on other sites

Rikard Nilsson

Jo, jag e väl medveten om det problemet med 32-bit arkitekturen (stavning här) om begränsningen till/mellan de årtal (1970-2038), men om man skriver något sådant project att man inte kan/måsta använda något annat system (tex databasens datum-funktioner) så låser man lite granna till just den databasen, och inte till sälva språket i sig.

 

Jag har även kollat lite på vLIB (http://vlib.activefish.com/) där vlibDate ingår som är rätt så omfattande för manipulering av datum och tid utanför 32bit intervallet.

 

Och för de flesta mindre projekt går time() aldeles utmärkt att använda (tex: spelscheman, matchhistorik, statestik mm)

 

Men visst, precis som du säger skall man veta dess begränsningar.

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...