webForumDet fria alternativet

"Nästa Match: " script

16 svar · 914 visningar · startad av richardjoha

richardjohaMedlem sedan okt. 2005787 inlägg
#1

Hur svårt är det att göra ett script som visar lagets komande matcher typ så här:

Nästa Match: BLABLA IF - BLABLA IF, 2010.01.01 kl. 13.30 på Vångavallen.

Haken är att man ska kunna lägag till infon till en databas och så fort den aktuella matchen har spelats ska det växla till matchen som tidsmässigt ligger efter i spelschemat.

Är relativt ny inom php och skulle vilja ha lite hjälp att komma igång eller iaf veta hur jag ska bygga upp det..

TulorkMedlem sedan aug. 2004903 inlägg
#2

det går, dock aldrig byggt något som är "tidbaserat"

itpastornMedlem sedan feb. 2007278 inlägg
#3

Lösning

Under förutsättning att du skall hämta en match bara och att matchernas starttid finns i databasen och att de varar i två timmar.

Och att du använder MySQL....

SELECT (de fält du vill ha)
FROM matcher
WHERE starttid >= NOW() + INTERVAL 2 HOUR
ORDER BY starttid ASC
LIMIT 0,1

Returnerar nästa ännu ej färdigspelade match.

Lars Gunther

richardjohaMedlem sedan okt. 2005787 inlägg
#4

itpastorn skrev:

Under förutsättning att du skall hämta en match bara och att matchernas starttid finns i databasen och att de varar i två timmar.

Och att du använder MySQL....

SELECT (de fält du vill ha)
FROM matcher
WHERE starttid >= NOW() + INTERVAL 2 HOUR
ORDER BY starttid ASC
LIMIT 0,1

Returnerar nästa ännu ej färdigspelade match.

Lars Gunther

men säg då att man lägger hela säsongens matcher i databasen (22 st) och om match 1 startar kl. 18.00 och slutar kl 20.00 så skrivs match 2 ut direkt kl. 20.00 osv.

måste man döpa varje post i databasen med typ datumen det ska växla eller hur fungerar det? för det kan ju inte NOW() reglera utan att veta när som är nu?

GunnarDMedlem sedan juni 20014 290 inlägg
#5

richardjoha skrev:

men säg då att man lägger hela säsongens matcher i databasen (22 st) och om match 1 startar kl. 18.00 och slutar kl 20.00 så skrivs match 2 ut direkt kl. 20.00 osv.

måste man döpa varje post i databasen med typ datumen det ska växla eller hur fungerar det? för det kan ju inte NOW() reglera utan att veta när som är nu?

I databasen lägger du in datum och tid, om du använder MySQL så kör med datetime på kolumnen, då är det enkelt att plocka ut kommande matcher, med den koden itpastorn skrev in, se bara till att kolumnen starttid är i formatet datetime och har datum+tid inlagd.

NOW() returnerar både datum och tid.

itpastornMedlem sedan feb. 2007278 inlägg
#6

Jodå, det funkar

richardjoha skrev:

men säg då att man lägger hela säsongens matcher i databasen (22 st) och om match 1 startar kl. 18.00 och slutar kl 20.00 så skrivs match 2 ut direkt kl. 20.00 osv.

Måste man döpa varje post i databasen med typ datumen det ska växla eller hur fungerar det? för det kan ju inte NOW() reglera utan att veta när som är nu?

Gunnar D har redan svarat, men låt mig förtydliga.

Kolumnen "starttid" förutsätts vara av typen "datetime" (vad skulle den annars vara?). now() utgår från klockan på servern, och så länge som den inte står i en annan tidszon (typ webbhotell i USA) så vet den vad klockan är.

Om servern står i en annan tidszon så måste det justeras först, "per connection", vilket är möjligt med MySQL 4.1 och senare.

Rekommenderad läsning:
http://dev.mysql.com/doc/en/Date_and_time_functions.html

Lars Gunther

richardjohaMedlem sedan okt. 2005787 inlägg
#7

screenshot från phpmyadmin, är detta okej uppställt??!

detta script är väl inte så avancerat att få i hop för en nybörjare va?

mall.jpg
itpastornMedlem sedan feb. 2007278 inlägg
#8

Kolumnformat

1. Int är en onödigt stor datatyp. Kör "smallint" med tillägget "unsigned" (Inga negativa tal). Du kan då ha 65536 matcher i din tabell. Int klarar upp till fyra miljarder... http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html

2. Fälttypen "text" rymmer upp till 65536 tecken. Onödigt stort för ett lags namn. varchar(100) borde räcka med råge. Platsen är nog inte heller så lång? varchar(150)? http://dev.mysql.com/doc/refman/5.0/en/string-type-overview.html

3. Ett index på datumet gör att sökningar och sorteringar går snabbare.

Lars Gunther

richardjohaMedlem sedan okt. 2005787 inlägg
#9

Har tänkt om lite och ändrat upplägget lite. tack itpastorn för hjälpen :)

Ser detta bättre ut?

Jag tänkte att jag inte behövde nått ID utan att datumen bara ska styra när hemmalag - bortalag och info ska visas. alltså att det datum som är närmst frammåt i tiden visas helatiden i utskriften på hemsidan och när det datumet har passerats växlar det till nästa post i databasen.

mall2.jpg
CompusaMedlem sedan jan. 20023 327 inlägg
#10

Jag tycker du ska ändra databasdesignen lite. Ha en tabell för matcher och en tabell för lag. Dvs

Tabell Lag: id, namn
Tabell Match, hemmaLag (främmande-nyckel till id i tabellen lag), bortaLag (fk till id i Lag), info, datum

Detta är en mer korrekt design och den ger dig en rad fördelar, exempelvis så behöver du bara skriva in ett namn på ett lag en gång i databasen. Det är även enkelt att exempelvis skapa select-boxar med namnen på lag i ditt webb-gränssnitt...

Sedan så är din primärnyckel i tabellen felaktig om denna tabell är tänkt att innehålla samtliga matcher? Korrekt primärnyckel ska i så fall vara kombinationen hemmaLag, bortaLag, datum. För att unikt kunna peka ut en rad i denna tabell så måsta dessa tre attribut utgöra primärnyckeln. Ett annat alternativ är att använda sig av en surrogatnyckel som jag gjort i tabellen Lag, men detta anser jag inte nödvändigt i tabellen match...

richardjohaMedlem sedan okt. 2005787 inlägg
#11

Compusa skrev:

Jag tycker du ska ändra databasdesignen lite. Ha en tabell för matcher och en tabell för lag. Dvs

Tabell Lag: id, namn
Tabell Match, hemmaLag (främmande-nyckel till id i tabellen lag), bortaLag (fk till id i Lag), info, datum

Detta är en mer korrekt design och den ger dig en rad fördelar, exempelvis så behöver du bara skriva in ett namn på ett lag en gång i databasen. Det är även enkelt att exempelvis skapa select-boxar med namnen på lag i ditt webb-gränssnitt...

Sedan så är din primärnyckel i tabellen felaktig om denna tabell är tänkt att innehålla samtliga matcher? Korrekt primärnyckel ska i så fall vara kombinationen hemmaLag, bortaLag, datum. För att unikt kunna peka ut en rad i denna tabell så måsta dessa tre attribut utgöra primärnyckeln. Ett annat alternativ är att använda sig av en surrogatnyckel som jag gjort i tabellen Lag, men detta anser jag inte nödvändigt i tabellen match...

usch... för mycket info att ta in på en ¨gång där :S du kan inte ge mig ett exempel compusa?

itpastornMedlem sedan feb. 2007278 inlägg
#12

Compusas svar är overkill för den uppgift du beskrivit. Så länge du bara har ett enda lag, som aldrig spelar två matcher på exakt samma tidpunkt, så funkar din tabell. Å andra sidan så vet du väl alltid det ena lagets namn i det fallet och kan ändra tabellen till att innehålla fälten "motståndarlag" och ett enum-fält "hemma"/"borta"

I den händelse att flera matcher kan starta på exakt samma klockslag, så funkar din lösning inte.

I den händelse du vill ha flera skilda lag i din applikation, så är det dags att läsa på en aning om normaliseringsregler, som compusa kallar "mer korrekt".

http://www.databasteknik.se/webbkursen/normalisering/index.html

Lars Gunther

richardjohaMedlem sedan okt. 2005787 inlägg
#13

itpastorn skrev:

Compusas svar är overkill för den uppgift du beskrivit. Så länge du bara har ett enda lag, som aldrig spelar två matcher på exakt samma tidpunkt, så funkar din tabell. Å andra sidan så vet du väl alltid det ena lagets namn i det fallet och kan ändra tabellen till att innehålla fälten "motståndarlag" och ett enum-fält "hemma"/"borta"

I den händelse att flera matcher kan starta på exakt samma klockslag, så funkar din lösning inte.

I den händelse du vill ha flera skilda lag i din applikation, så är det dags att läsa på en aning om normaliseringsregler, som compusa kallar "mer korrekt".

http://www.databasteknik.se/webbkursen/normalisering/index.html

Lars Gunther

Tanken är att detta ska finnas på ett fotbollslags hemsida väldigt enkelt uppe i ena hörnet typ. "Manchester United - Aston Villa, 2010.01.01 kl. 13.30 på Vångavallen."

Är det smidigare att ha bara ett fält som heter match istället för att ha både "hemmalag" & "bortalag". Jag har ju hela spelschemat färdigt och vill ju att det ska växla till nästa macth efter att datumen paserats..

Alltså räcker det kanske med fälten
Lag, Plats och Datum i databasen?

richardjohaMedlem sedan okt. 2005787 inlägg
#14

Nu har jag fått ordning på kodandet och databasen. tack för tipsen :)

en sista fråga i tråden bara..

jag har ett fält i databasen som heter starttid och som har formatet DATETIME vilket ger utskriften ÅÅÅÅ-MM-DD HH:MM:SS. måste jag ha ett fält med heter DATE och ett med TIME för att få utskriften ÅÅÅÅ-MM-DD HH:MM?

itpastornMedlem sedan feb. 2007278 inlägg
#15

richardjoha skrev:

jag har ett fält i databasen som heter starttid och som har formatet DATETIME vilket ger utskriften ÅÅÅÅ-MM-DD HH:MM:SS. måste jag ha ett fält med heter DATE och ett med TIME för att få utskriften ÅÅÅÅ-MM-DD HH:MM?

Du har (minst) fyra alternativ, i tilltagande grad av "proffsighet":

1. I PHP kan du korta ner strängen med substr() i PHP

$tid =  substr($tid,0,-2);

2. Välj datumformat i SQL-frågan:

SELECT DATE_FORMAT(matchtid,'%Y-%m-%d %H:%i') AS matchtid from tab

3. Du kan konvertera i php till "UNIX Epoch Time" med strtotime() och sedan konvertera tillbaka till det tidsformat du vill ha.

$matchtid = strtotime($matchtid);
$matchtid = strftime('%Y-%m-%d %H:%I',$matchtid);

Lägg märke till att du det är %I för php-funktionen, men %i (med gement i) i MySQL-funktionen.

4. Du kan konvertera till "UNIX Epoch Time" i SQL och sedan formattera hur du vill i php med strftime():

SELECT UNIX_TIMESTAMP(matchtid) AS matchtid FROM tab

http://se.php.net/substr
http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html
http://php.net/strftime
http://php.net/strtotime
http://php.net/setlocale

Lars Gunther

richardjohaMedlem sedan okt. 2005787 inlägg
#16
<?php
require("conn_match.php");

$sql = "SELECT hemmalag, bortalag, info, starttid FROM matcher WHERE starttid >= NOW() + INTERVAL 0 HOUR ORDER BY starttid ASC LIMIT 0,1";

$result = mysql_query($sql) or die ("kunde inte välja tabell");
$row = mysql_fetch_assoc($result);

$hemmalag = $row['hemmalag'];
$bortalag = $row['bortalag'];
$starttid = $row ['starttid'];$starttid = strtotime($starttid); 
$starttid = strftime('%Y-%m-%d %H:%I',$starttid);
$info = $row['info'];
	
echo "<h6>";
echo "$hemmalag";
echo " - ";
echo "$bortalag"; 
echo "<p>"; 
echo "$starttid";
echo " <p> "; 
echo "$info";
echo "</h6>";
echo " <p> "; 
echo " <p> "; 

?>

I databasen ska matchen börja 15.15, tidigare har det visats att matchen ska börja 15.15 men nu när jag testar och får exempel 3. att fungera visas tiden 15.03...?!?! varför??
.....................................
Utskriften:

ÖIS A - J-Södra Tipselit
2007-02-25 15:03
Zinkensdamm

.....................................
3. Du kan konvertera i php till "UNIX Epoch Time" med strtotime() och sedan konvertera tillbaka till det tidsformat du vill ha.

$matchtid = strtotime($matchtid);
$matchtid = strftime('%Y-%m-%d %H:%I',$matchtid);

Lägg märke till att du det är %I för php-funktionen, men %i (med gement i) i MySQL-funktionen.

richardjohaMedlem sedan okt. 2005787 inlägg
#17

BUMP!

145 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
142 ms — hämta tråd, inlägg och bilagor (db)