18. september 2011 - 16:51Der er
21 kommentarer og 1 løsning
Begrænsning på konkurrencer..
Hej eksperter. Jeg er igang med en hjemmeside, med heste. Deri skal ens heste kunne deltage i nogle konkurrencer, alt efter hvilket niveau hesten er i.. Jeg skal så have lavet det sådan at der står hvis du er i niveau 0, kan du deltage i f.eks 2 konkurrencer, hvor præmien er det og det.. I niveau 1, 3 konkurrencer hvor præmien er lidt højere osv.
Der er 10 niveauer, men mit problem er, at jeg ved ikke hvordan jeg skal skrive det ned i kodning, og ved heller ikke hvordan jeg skal få konkurrencen til at åbne for tilmeldninger kl. 08:00, også lukke igen for tilmeldninger kl. 18:00, også kommer der f.eks resultater kl. 19:00. Dette er noget der skal ske én gang om dagen.. Er der nogen der kan hjælpe?
Hvis du ikke selv har noget kode og det skal laves fra bunden af så tror jeg nok du skal overveje at tilbyde andet end point på eksperten for at få det udvikling
expnet, lige nu så søger jeg bare en løsning på hvordan jeg skal lave det. Jeg ville da helt klart selv se om det var noget jeg kunne finde ud af, men jeg aner bare ikke hvordan jeg skal gøre :s
Du berører (mindst) to forskellige problemer i et spørgsmål, nemlig hvordan du holder rede på niveauer og konkurrencer, og hvordan du får tingene til at foregå på eller mellem forskellige tidspunkter. Det sidste kender jeg ikke så meget til, men jeg våger pelsen på det første, det om niveauer og konkurrencer.
Jeg ville nok bevare oplysningerne om niveauer, konkurrencer, præmier, o.s.v., i database tabeller og så kalde oplysningerne ind på siden ved hjælp af php mysql_queries (jeg ved fra tidligere spørgsmål at det er mysql du anvender.
Men først et spørgsmål: Hvordan ved programmet hvilket niveau det drejer sig om? Er der en html formular hvor folk kan angive niveau og har formularen action=konkurrencer.php (for eksempel) således at du i konkurrencer.php kan starte med $niveau = $_POST['niveau'];
I så fald kunne du måske have en mysql tabel 'konkurrencer' såsom:
konkurrencer id navn præmie 1 konkur1 100 2 konkur2 125 3 konkur3 150 o.s.v
og en mysql tabel 'niveauer' - hvis nu niveau0 kan deltage i konkurrence 1 og 2, niveau1 i konkurrence 1, 2, og 3, niveau2 i konkurrencer 1 til 5, o.s.v., så kan du for hvert niveau nøjes med at angive den højeste tilladte konkurrence. Tabellen kunne så være:
niveauer id navn top 0 begynder 2 1 fortsættere 3 2 viderekommende 5 3 super 7 o.s.v.
Hvad skal der så ske på siden konkurrencer.php? Skal du have udskrevet en liste af de konkurrencer hesten må deltage i, efter at hestens niveau er bekendt i niveau? Det kunne foregå således:
$result = mysql_query("SELECT navn, præmie FROM konkurrencer WHERE id <= (SELECT top FROM niveauer WHERE id = $niveau)"); echo "Du kan deltage i følgende konkurrencer: <br>"; while($row = mysql_fetch_array($result)) { echo "Konkurrence " . $row['navn'] . "med præmie på " . $row['præmie'] . " kr <br>"; }
Det skulle så med en hest på niveau 1 give dette:
Du kan deltage i følgende konkurrencer: konkurrence konkur1 med præmie på 100 kr konkurrence konkur2 med præmie på 125 kr konkurrence konkur3 med præmie på 150 kr
Du formulerer dit spørgsmål meget åbent. Jeg håber ovenstående 'brainstorming' kan levere lidt stof til eftertanke, der kan hjælpe dig til at skyde dig ind på hvad konkret det er du vil.
... og hvis du ikke har været ude for det før, så det der foregår i min foreslåede query er en subselect. I den inderste select forespørger du for top konkurrencen for det relevante niveau. Resultatet, for eksempel 3 for niveau1, anvendes så i den yderste select.
Tusind tak Christian_Belgien. Jeg kan fortælle at pt. har jeg en tabel ved navn "heste", i den er der en kolonne ved navn "niveau", som jo angiver hvilket niveau HESTEN er i..
Skal jeg så stadig oprette tabellen niveauer eller hvad?:)
"Klik her hvis du er niveau 0" "Klik her hvis du er niveau 1" "Klik her hvis du er niveau 2" "Klik her hvis du er niveau 3" "Klik her hvis du er niveau 4" "Klik her hvis du er niveau 5"
Også har du en side for hvert niveau.
Det med at vise resultatet klokken 19 kunne du gøre med javascript eller for eksempel PHP.
Kan du finde ud af PHP eller javascript ?
Så kunne man skrive noget i stil med :
<?php
$resultat = "Camilla vandt";
if(date("H") >= 19){
echo $resultat;
}
?>
Så hver dag når klokken er over 19 så vises teksten "Camilla vandt".
også vil jeg lige tilføje til indlæg #3 i forbindelse med at du så gerne vil have den laver udtrækning hverdag kl. 19.00
skal du finde ud af om der hvor din hjemmeside ligger om de undstøtter CronJob og så skal du lave en php side hvor du laver de ud regner hvem der har svare rigtig og i blandt dem som har svaret rigtigt skal du lave en "rand()" se på http://php.net/rand funktion der tager en tilfældig ud som vinder
når den php side er færdig skal den så ind og ligge i ens cronjob
p.s det er ikke mange steder man har den mulighed altså cronjob
og så vil det kun være mulighed ved at selv gå ind på den side kl 19.00 hverdag
MIT svar, som indeholder to spørgsmål: (1) Hvordan ved du hvilken hest det drejer sig om? Har du et eller andet sted en variabel $hest?
Hvis din heste tabel så er:
id navn niveau 1 Sorte 3 2 Jolly Jumper 7 3 Sprænghest 5
hvordan ved du så hvilke konkurrencer hver hest må deltage i? Det må du have stående et eller andet sted. Den gængse, og i min mening bedste, praksis er at have en særskilt tabel for hver 'slags' data, altså en tabel der for hver niveau angiver konkurrencerne. Så hvis du har hestens id stående i $hest, så kan du lave sådan en query:
$result = mysql_query("SELECT navn, præmie FROM konkurrencer WHERE id <= (SELECT top FROM niveauer WHERE id = (SELECT niveau FROM heste WHERE id = $hest))");
Jeg har ikke testet queryen, fordi det her foreløbigt er ment som brainstorming, så det kan godt være, at der er en syntaksfejl. Det er nogen tid siden jeg selv har anvendt sådanne subselects.
Christian jeg er ikke med mere :S Altså jeg har tænkt mig at lave et link fra hesten, og ind til "konkurrence-siden". Dvs, så der kommer til at stå f.eks konkurrence.php?id=12 Eller sådan noget. Kunne det ikke fungere?
Men jeg forstår ikke det der med at jeg både skal have niveau i min heste tabel og en tabel ved navn niveau?
Som sagt, ingen kommentarer om cronjob og tidspunkter, men hvad angår mysql delen, så står jeg ved mit forslag. Hvis et medlem af siden har en hest med et bestemt niveau, så skal det hele, inklusiv niveauet, styres fra oplysningen om hesten. Det er noget rod at indføre niveau særskilt. For eksempel, som Mille-Tigerdyr allerede siger, folk kan indføre et forkert niveau.
Der er en teori om normalisering af data (og mit forslag følger denne teori.) Hvis man følger denne teori omhyggeligt, så vil man fra sin database kunne udtrække oplysninger på alle tænkelige måder, også må måder man ikke havde forestillet sig da man oprettede tabellen.
Christian, men skal jeg stadig både have niveau feltet i min heste tabel OG en ny tabel ved navn niveau? Bliver det så ikke meget besværligt at finde hoved og hale i?:S
Hvordan ved du nu hvilke konkurrencer en hest må deltage i? En mulighed kunne være for hver hest at skrive dens niveau og hvilke konkurrencer dette niveau giver ret til. For eksempel:
id navn niveau topkonkurrence 1 Sorte 3 5 2 Jolly 5 8 3 Hvide 3 5
Så hvis du har femten heste på niveau 3 skriver du femten gange,at topkonkurrencen er 5. Hvad hvis du kommer til at skrive fejl, så der ved nogle heste på niveau 3 kommer til at stå 4? Så går der rod i. Og hvad hvis dit system udvikler sig, så du vil give heste på niveau 3 6 konkurrencer? Så skal du rette det, korrekt, i femten linier. Hvis du har en særskilt niveau tabel, så er der kun et sted at rette det.
Nu ligger det således, at database strukturer og normalisering hører til mine stærke sider. Det er min erfaring, at med en særskilt tabel for hver slags data, altså i dette tilfælde en særskilt niveau tabel, bliver systemet mere stabilt og mindre fejl følsomt, især når datamængden begynder at vokse.
Jamen forstår bare ikke hvordan hesten kommer ind i den der database?:S Så alle heste skal BÅDE lægge i databasen "heste" OG databasen "niveau", eller hvad??
Jeg forstår bare ikke hvordan de to ting kommer til at hænge sammen ;/
Du har en mysql database med en masse tabeller. Fra tidligere spørgsmål kender jeg tabellerne members og user_on line. Du fortæller nu, at du også har tabellen heste. Den tabel har velsagtens, mindst, kolonner med hest_id, navn, og niveau. Hvordan du får fyldt data i den tabel har du ikke fortalt. Måske har du til at starte 20 heste som du fylder i tabellen manuelt via phpmyadmin eller hvad du bruger. Såsom: INSERT INTO heste(id, navn, niveau) VALUES(1, 'Sorte', 3); INSERT INTO heste(id, navn, niveau) VALUES(2, 'Jolly', 5); INSERT INTO heste(id, navn, niveau) VALUES(3, 'Hvide', 3);
o.s.v. Når så bedriften vokser indsætter du måske, ligeledes manuelt, tyve heste mere.
Så foreslår jeg, at du opretter tabellen niveau. Den skal du også oprette manuelt i begyndelsen, såsom:
INSERT INTO niveau(id, navn, top) VALUES (0, 'begynder', 2); INSERT INTO niveau(id, navn, top) VALUES (1, 'viderekommende', 3); .... INSERT INTO niveau(id, navn, top) VALUES (9, 'superduper', 15);
Den tabel forbliver uforandret, med mindre du på et senere tidspunkt vil tilføje flere niveauer.
Og tabellen konkurrence opretter du manuelt i begyndelsen og lader den forblive uforandret, indtil du en dag beslutter dig for nye konkurrencer eller andre præmier:
INSERT INTO konkurrence(id, navn, præmie) VALUES (1, 'konkur1', 100); INSERT INTO konkurrence(id, navn, præmie) VALUES (2, 'konkur2', 125); INSERT INTO konkurrence(id, navn, præmie) VALUES (3, 'konkur3', 150);
Så er du klar til at begynde. Når 'ejeren' af hest nummer 3 melder sig (og du får heste_id'en i variabelen $hest), finder du frem til hvilke konkurrencer hesten kan deltage i ved først at finde hesten's niveau:
SELECT niveau FROM hest WHERE id = $id
og så hvad top konkurrencen er for det niveau:
SELECT top FROM niveau WHERE id = (SELECT niveau FROM hest WHERE id = $id)
og finder konkurrencerne mellem 1 og denne top ved:
SELECT navn, præmie FROM konkurrencer WHERE id <= (SELECT top FROM niveau WHERE id = (SELECT niveau FROM hest WHERE id = $id))
Det kalder du fra din php kode:
$result = mysql_query("SELECT navn, præmie FROM konkurrencer WHERE id <= (SELECT top FROM niveau WHERE id = (SELECT niveau FROM hest WHERE id = $id))")
Efterhånden som din applikation bliver mere kompleks, så gælder det om at holde tungen lige i munden og tage det skridt for skridt.
Og du kan naturligvis vælge også at lave forms for at indsætte niveauer og konkurrencer. Men det er vel spild af kræfter, eftersom du sandsynligvis skal have skrevet til de tabeller så sjældent.
Og så spørger du hvordan du skal få folk til at tilmelde sig konkurrencerne. Men nu synes jeg du prøver at løse det hele i et enkelt mega-spørgsmål. Nu har jeg prøvet at foreslå en database teknik, der vil kunne holde styr på det.
Man kunne for eksempel forestille sig, at når en heste-ejer logger på med hestens id, så bliver heste-ejeren præsenteret for en form med en liste af de mulige konkurrencer med en checkbox for hver konkurrence. Heste-ejeren checker en eller flere konkurrencer af og trykker på en submit knap - og deltager så i konkurrencerne. Som man siger i Tyskland: Keine Hexerei, nur baxerei.
Men teknisk hjælp til denne, eller en anden måde, foreslår jeg bliver for et nyt spørgsmål. Jeg bliver nødt til at slutte med dette spørgsmål, som jeg nu har brugt meget tid på. Jeg håber det har været til nytte.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.