04. april 2007 - 22:39Der er
78 kommentarer og 1 løsning
tilfældige forespørgsler på ID
Jeg skal trække 16 ids ud, men når man lagrer rækker i sin database har de jo ikke altid ID fra 1-16. Mine forespørgsler er kun på id 1-16, kan man på nogen måde trække tilfældige 16 ids ud, men samtidig skal disse være forskellige?
Mine forspørgsler ser pt således ud:
$query1 = mysql_query("SELECT * FROM liga WHERE id = 1"); $liga1 = mysql_fetch_array($query1);
Og så fortsætter de bare fra 1 til 16 i id.. Så forespørgsel nr. 16 ser således ud:
$query16 = mysql_query("SELECT * FROM liga WHERE id = 16"); $liga16 = mysql_fetch_array($query16);
---
Kan det lade sig gøre ?
Hvis jeg skal prøve at formulere det anderledes, så skriv det i en kommentar..
Danmark vil mindske afhængigheden af globale techgiganter, men det kræver mere end politiske formuleringer og strategier, understreger PROSA’s formand Niels Bertelsen.
$liga efterfuldt af tal er det ID som "klanen" har i databasen.. Men det skal somsagt gøres "tilfældigt", men samtidig skal det ikke kunne ændre sig, det skal tildeles så snart man bliver tilføjet i databasen, og så skal det ellers være "absolut" resten af tiden!
Okay, som jeg forstår vil du have 16 tilfældige rækker fra en database, disse skal så parres i 8 par, og denne parring skal gemmes 'for evigt'.....right ?
Der er vist noget med at denne query -->
SELECT klan FROM liga ORDER BY RAND() LIMIT 0,16
IKKE altid levere et random svar....derfor kunne dette måske være en løsning -->
Ikke testet så muligvis er der syntaks problemer :), ideen er -->
Hele tabellen vælges. En løkke startes og gentages 16 gange. I løkken findes en tilfældig værdi mellem 1 og antallet af rækker. Pointeren sættes til den tilfældige valgte række. Hvis klan værdien fra rækken ikke er i arrayet i forvejen fyldes værdien i arrayet klan. Hvis klan værdien er i arrayet i forvejen sættes løkke tælleren $i en tilbage.
Så kan du f.eks. gemme de 16 værdier i tabellen samtidig med at brugeren tilføjes. Da rækkefølgen er tilfældig burde du altid kunne lave ovenstående tabel ved blot at parre klan[1] med klan[2], klan[3] med klan[4] osv osv....
Altså. Der er 16 hold, der skal møde hinanden ÉN gang hver, og de skal ikke opstå mere en ÉN gang i hver spillerunde, så derfor kan det der indtil videre ikke gå, fordi der f.eks. er 4 x IGame bare i den vi har lavet nu. Men jeg kan overhovedet ikke forstå, hvordan de er opstået.
Men ja, der skal være 15 x 8 kampe, hvor alle møder alle..
Som sagt så skal jeg senere kunne lave et "update" system, så jeg selv kan indtaste resultater osv., så jeg er ret meget på bar bund, men jeg sætter virkelig pris på alt den hjælp du giver mig :)
Klassisk fordi jeg ikke lige var opmærksom på at array_search jo kan returnere værdien '0' som altså betyder at værdien blev fundet på plads '0', men mit tidligere kode tolkede dette '0' som at værdien ikke blev fundet.....altså et mix af Boolean og Integers...tsk tsk.. :)
Ja, nu finder den 16 tilfældige 'klaner' og laver første spillerunde. Naturligvis ændre de sig når du trykker opdater, det er jo netop 16 tilfældige klaner der vælges hver gang siden vises.
Jeg kan så forstå at vi skal have lavet 15 spillerunder hvor alle møder alle og den samlede kamp plan skal gemmes.....
Jeg sidder lige og roder med hvordan spillerunderne kan laves....Så jeg vender tilbage.
Så fik jeg kigget på spillerunderne...mine matematik evner rækker simpelthen ikke til en formel der kan kombinere modstanderne...så jeg har blot lavet et stort array med hele turneringen i...skulle du finde dobbeltkonfekt i turneringen vender du bare tilbage :)
Men prøv denne kode, den skulle som sagt gerne præsentere en hel turnering med 15 spille runder -->
Hvis ovenstående virker som beskrevet er vi klar til at kigge på hvordan, og under hvilke former, vi kan gemme turneringen, således at du kan indtaste resultater og vise turneringen så længe den 'løber'.
Jeg har kigget lidt på din side og det ser ud som om du 'kun' har 16 tilmeldte hold...?? Hvorfor skal der så findes 16 tilfældige, det vil jo altid være de samme 16 ??
Hvis du vil have at holdene skal møde hinanden i en bestemt rækkefølge skal du indtaste turnerings skemaet i de øverste array's. Skriv holdene på en liste, giv dem numre fra 1-16. Så er array'erne bygget op således at de første 2 numre møder hinnanden, de næste to møder hinnanden osv...
Bare lige for at opklare et par løse ender....turnerings skemaet som vi arbejder med for øjeblikket..skal det genereres af dig når alle hold er tilmeldt og derefter er det fast indtil næste turnering ??
Det må gerne genereres automatisk. Når jeg siger at det skal være 16 tilfældige, er det fordi, at jeg førhen har taget dem ved hjælp af deres ID, det var såmænd det der var startproblemet :D
Altså, jeg lavede en query på hvert ID, så alle klanerne skulle have fra ID 1-16, det er vel ikke nødvendigt at de er det nu? De kan godt have ID 28 ikke? Jeg havde nemlig gjort mig afhængig af deres ID, hvilket jo ikke er særlig smart.
Det er godt nok genialt! Det virker som det skal nu.. :)
Synes det er utrolig pænt af dig, at give mig så meget hjælp og at du bruger din tid på det her!!
Hvordan kommer man så det næste skridt med at vælge forskellige maps og få resultater på?
Så har jeg lige et spørgsmål. Ved du om de arrays du har indtastet, er de 100% forskellige, således at ingen møder hinanden 2 gange, og ingen af tallene står 2 gange i ét array? :)
Jeg laver lige idt rettelser til koden, da der er nogle ting som jeg har misforstået og derfor kan laves lidt enklere :)
Med hensyn til de øverste array's med turnerings planen i, så skulle den være OK..der er 15 array's, et for hver spillerunde. I hvert array står hvert 'hold' en gang, og samlet set møder alle alle....
Det er korrekt at den ændre holdene når du opdatere, det er fordi vi arbejder med den sekvens hvor du danner turneringen første gang...senere vil vi gemme hele dynen i en tabel og så tilgå den fra en anden side hvor du så kan indtaste resultater osv....
Men jeg kigger lige på det, og vender tilbage om lidt.
Og jeg er da bare glad for at du sætter pris på hjælpen, så er det jo altid rart at hjælpe :)
Det er da utrolig smart, at gemme dem i en tabel, havde jeg ikke lige tænkt på.. Men kan man på den måde også komme til at påvirke stillingen? Nu skal jeg nok lade vær med at rode dig ud i mere, men jeg opdaterer nemlig selv stillingen på:
Kan man så stadig komme til at påvirke holdet selvom de er i 2 forskellige tabeller? Fordi hvis vi opretter dem i en ny tabel, hvor er deres relation til deres gamle tabel så?
Så har jeg fået noget dejligt mad i maven...:) og kigget på koden...det er muligt at vi ikke behøver at gemme mere i databasen end du allerede har, men det må vi kigge på senere. Prøv nedenstående kode og hvis jeg ikke tager meget fejl, så ændre turneringen sig ikke mere når du opdatere, men lad høre om det er korrekt :)
Vi behøver ikke gemme turneringsplanen, da den nu altid vil være den samme så længe du ikke ændrer indholdet af 'liga' tabellen.
Men du skal jo have resultaterne gemt på en eller anden måde.
Enten kan vi oprette en mySQL tabel hvor vi gemmer resultaterne, eller vi kan gemme resultaterne direkte i koden.
Der er lidt forskellige muligheder ved de to muligheder, men der er især to hensyn som du skal tage stilling til. Sikkerhed og brugervenlighed.
Hvis du vælger en tabel løsning, kan vi jo lave en side som du kan logge ind på og derfra opdatere kampene, men et login system er aldrig 100% sikkert, så det gør dig jo sårbar overfor 'fjendtlige' brugere, risikoen er ganske vist lav, men den er der.
Hvis du opdatere direkte i koden, vil koden være langt mere enkel, brugervenligheden vil afhænge af dine evner til at opdatere koden korrekt...nok ikke det store problem :)...og sikkerheden er 100% bevaret.
Men lad høre hvad du syntes vi skal arbejde med, og spørg endelig hvis du er i tvivl om noget.
Det skal jo også nævnes at hvis vi gemmer resultaterne i en tabel, er det jo nærliggende at bruge de informationer til at danne stillingen udfra...ganske automatisk :)
Synes vi skal tage tabellen i MySQL. Det er det jeg har lagt op til indtil videre, fordi jeg har også lavet en form for automatik :) Mit storeproblem var egentlig at få det lavet i en ny tabel og få det overført til klanerne i stillingen.
Altså.. Der spilles 30 runder. 15-15 er uafgjort og giver 1 point. 14-16 er tabt kamp og giver 0 point, og til sidst er 16-14 en vundet kamp og giver 2 point.
Du kan garanteret gøre det let, men hvor havde jeg mange problemer med det. Har lige forlagt det, vil prøve at finde det jeg havde lavet, men kan også være du bare har løsningen på en meget hurtig måde..
Men altså hvor er jeg forvirret, håber du forstår det jeg mener..
Er du forvirret ? :), hvad forvirrer ?, det er jo ret vigtigt at du selv er med på hvad vi laver, fordi de kommende løsninger bliver du nok nød til selv at starte på og så tager vi problemerne efterhånden. Jeg skal selvfølgelig nok forsøge at give dig et oplæg til de forskellige del elementer hvis du har brug for det. Men lad endelig høre hvad du er i tvivl om.
Kan bare ikke forstå, at når jeg skriver så meget for at finde en løsning, at du så kan lave den på så få linje..
Og jeg tænker alt for langt tror jeg. Kender ikke så meget til arrays, men de er da utrolig smarte.
Når jeg skal lave sådan et system som dette, så har jeg ingen anelse om, hvordan man opretter en helt ny tabel og laver forbindelse mellem resultaterne og klanen, så man kan trække det ud og opdatere osv.
Hvis en kamp bliver 15-15
Ville jeg nok lave 2 inputs, som har hvert deres navn. Så ville jeg relatere dem til de hold de "hører til". Og i stillingen ville jeg så sige:
Og du kan bare gøre det på meget lettere måder, forstår sådanset det meste af det du har lavet, men jeg kan ikke se hvordan man skal tage det næste skridt.. Har slet ikke arbejdet med "relationer" eller hvad man nu kalder det.
Tænker jeg for meget over at det skal kunne påvirke stillingen :) ?
Det er klart at jo mere indblik og forståelse man har for PHP, jo kortere kode kan man skrive, men du skal ikke lade dig gå på af at du skal bruge flere linjer, det vigtigste er jo at koden virker. Når du så har kode der virker, kan det være god træning at prøve at reducere den. Ofte skal jeg også først have funktionaliteten på plads, altså se at det virker, før jeg kan reducere og gøre koden kortere. Men som sagt kort kode er ikke alt, det er ofte vigtigere at man kan overskue koden. Man kan f.eks. skrive en superkort kode idag, og når man så skal kigge på den 6 mdr. senere, tager det en lille uge at fatte hvad det er man har lavet :)
Så humlen er at du skal bruge de virkemidler du kender og så prøve at krydre dem med nye ting som du samler op rundt omkring. Jeg ved ikke om du kan læse og forstå engelsk, men hvis det ikke er et problem, er php.net jo et leksikon af viden og informationer om forskelige dele af sproget.
Der er absolut ikke noget galt med at tænke langt frem, det er faktisk ofte en stor fordel at man først danner sig det store overblik, og derefter går igang med koden. Men projektet her er jo ved at udvikle sig hurtigt :), så jeg forstår da godt hvis det er svært at gennemskue sammenhængene.
Hvis det hjælper har jeg faktisk heller ikke det fulde overblik over hvordan tingene skal hænge sammen, men hvis du er frisk på projektet så tager vi jo bare tingene som de kommer, så må vi jo bare tage et par skridt tilbage hvis det bliver nødvendigt at ændre nogle ting undervejs.
De eksempler du viser omkring point tildeling er udemærkede. Vores problem lige nu er at vi ikke rigtigt kan implementere dem, da vi stadig ikke har fået på plads hvordan vi vil gemme informationerne, og derfor heller ikke hvordan vi kan bruge dem. Men lad mig prøve at beskrive projektet for dig, som jeg forstår det :)
Du har tabellen 'liga' jeg kender ikke det fulde omfang af den tabel, men jeg foreslår at den tabel bare indeholder følgende :
Id, Holdnavn.
Så skal vi bruge en turneringstabel, den skal indeholde :
Id, Hjemmeresultat, Uderesultat.
Da turneringsplanen indeholder 15 spillerunder med 8 kampe i hver kommer denne tabel til at indeholde 15x8 altså 120 rækker, en for hver kamp. Da vi allerede har lavet vores turneringsplan således at den ikke ændre sig, bygger vi tabellen således at række 1 i tabellen er resultatet af den første kamp, række 2 er resultatet af den anden kamp osv....
Det er muligt vi senere tilføjer nogle felter til 'liga' tabellen med sejre, uafgjorte og tabte kampe, men foreløbig er jeg ikke sikker på at vi behøver dem.
Okay så vi har to tabeller, en med hold ('liga') og en med resultater.
Når vi viser turneringsplanen skal vi bruge 'liga' tabellen til at danne kampene, og så kigger vi i resultat tabellen for at skrive resultaterne. Det er jo egentlig simpelt nok, men det skal jo også være muligt for dig at skrive resultaterne ind. Det kan du enten gøre direkte i tabellen, via myPhpAdmin, men da indholdet i tabellen ikke er nemt at sætte sammen med holdnavnene, det er jo bare 120 rækker med tal, så er det nok bedre at du kan gøre det via turneringsplanen. Så derfor er det nødvendigt at lave et login system, således at du kan logge ind og få adgang til at skrive resultater ind, via turneringsplanen. Hvis ikke vi laver et login system, kan alle jo skrive resultater ind og det er vel ikke godt. Det kan stort set laves ved at udvide den side vi arbejder med i øjeblikket, det vigtigste lige nu er blot at du er med på at det bliver muligt at indtaste fra den samme side som vi arbejder med nu.
Så nu har vi en side hvorfra vi kan indtaste og vise resultaterne af kampene.
Så skal vi jo også have en side der viser stillingen i turneringen. Denne side skal....hmmm....he he ja se nu mangler der jo noget...der skal jo være en reference mellem resultaterne og holdene som er rimelig nem at tolke...derfor skal vi nok lave resultat tabellen lidt om. Den skal indeholde :
Når vi så skal lave stillingen, kigger vi alle kampene igennem, og laver noget kode der holder styr på sejre, uafgjorte og tabte kampe for alle holdene og når vi er færdige kan vi regne stillingen ud og vise den.
....Så to tabeller og to sider kan måske gøre det...
Er du mere forvirret nu eller hjælper det lidt på overblikket ?
Jeg bliver nok nød til at slutte for iaften, men jeg er højst sandsynligt på igen imorgen aften.
Hvis du har mod på det, så kan det være rigtigt godt at læse om Array's på php.net, fordi der bliver vist meget omkring array's i det følgende :) På www.php.net skriver du blot array oppe i søge feltet og vælger Functions i dropdown til højre så skulle siden gerne komme frem.
Jeg vil se frem til i morgen, jeg har virkelig mod på at lave det nu. Mit eneste hul lige nu er, hvordan man laver relationen, som du også kom i tanke om midt i at du skrev din tekst :). Altså:
Men det glæder jeg mig til at finde ud af i morgen. Jeg gør det, at jeg sætter det op på en anden hjemmeside nu, og så kan jeg arbejde ud fra den, så det ikke forstyrrer den nuværende side.
Jeg er lige på et par minutter nu, og så kommer jeg sikkert tilbage omkring kl.22.
Jeg ved ikke om du har lavet begge tabeller, ellers må du godt lave de to mySQL tabeller jeg snakkede om tidligere og poste et SQL dump her, så er vi nemlig sikre på at vi arbejder med det samme udgangspunkt.
Turneringstabellen har jo ingen resultater eller hold for den sags skyld, så vi skal have lavet et eller andet som fylder turneringstabellen op, hvis den er tom, når turneringsplanen vises....
Du kan prøve at se om du kan få kodet noget der sørger for dette, jeg kunne forestille mig at vi lige før linjen $output="<h1>Kampoversigt</h1>\n"; laver et check af om der er nogle rækker i resultattabellen overhovedet, hvis der er sættes en variabel til true, hvis ikke sættes den til false.
Længere nede i koden hvor vi udskriver linjerne $output.=" <tr>\n <td><p class='black'>"....osv laver du så en if(!variabel) { så inserter den de to hold på de rigtige pladser i tabellen....
Men nu bliver jeg nød til at løbe, vi tales ved senere :)
$holdnavn=array(); $i=0; $q=mysql_query("SELECT holdnavn FROM liga1 ORDER BY id"); while($qr=mysql_fetch_assoc($q)) { $holdnavn[++$i]=$qr[holdnavn]; }
// Check her om der er noget i resultat/turnerings-tabellen. // Hvis der er sættes f.eks. $tabelEmpty=false; hvis ikke der er noget i tabellen sættes $tabelEmpty=true; // Du kan checke om der er indhold ved at lave en mysql query på alt. // Og endnu bedre checke om der er 120 rækker med mysql_num_rows, det er jo det antal kampe der er i turneringen.
// Her skrives kampene ud til 'skærmen'. // Hvis $tabelEmpty er true, skal vi have smidt kampene i turneringstabellen, // så her kan vi lave // if($tabelEmpty) { læg de to holdavne i tabellen }
F.eks. INSERT INTO turnering VALUES('', '".$holdnavn[$mTurn[$r][($k-1)]]."', '".$holdnavn[$mTurn[$r][$k]]."', '', '')
Men det er fint nok, hvis du ikke er med :), jeg må desværre slutte for i aften, så du kan prøve at se om du kan få hoved og hale på 'opgaven', hvis du ikke selv har fundet noget laver jeg et forslag til dig imorgen :)
Okay, jeg er her kun nogle minutter, får gæster om lidt :)...Jeg har lavet lidt ændringer til koden. Bl.a. det store array, har jeg istedet for 1-16, lavet 0-15...mere om det senere :)
Så har jeg tilføjet det vi snakkede om igår om at hvis turneringstabellen er tom tilføjer den turneringsplanen...
Jeg poster både kode og den struktur jeg har i min database, så kan du kigge på det, og skriv nu endelig hvis der er noget du er i tvivl om, eller vil have forklaret :)
<?php
include("connect.php");
// Her laves et multidimensionelt array, $mTurn, med turneringsplanen...altså hvem møder hvem. // Der er 15 spillerunder og hver linje svarer til en spillerunde. // Der er 16 deltagere og de er repræsenteret med tallene 0-15. // De to første 'tal' møder hinnanden, de to næste ligeså osv..... // Så i første spillerunde spiller 0 mod 1, i anden runde spiller 0 mod 3, i tredie runde spiller 0 mod 5 osv.
// Her laves to array's. // $hold_navn indeholder alle de hold der deltager i turneringen. // $hold_id indeholder holdenes id...dette array bruger vi ikke endnu, men muligvis senere...
$hold_navn=array(); $hold_id=array(); $ql=mysql_query("SELECT id, holdnavn FROM liga ORDER BY id"); while($qlr=mysql_fetch_assoc($ql)) { $hold_navn[]=$qlr[holdnavn]; $hold_id[]=$glr[id]; }
// Her checkes om der er noget i vores turneringstabel (mySQL)
$tur_empty=true; $qt=mysql_query("SELECT * FROM turnering"); if(mysql_num_rows($qt)==120) { $tur_empty=false; }
// Her sammensættes det output der skal vises hos klienten (browseren). // Alt output samles i variablen $output og sendes først til sidst. // Vi ved at der er 15 spillerunder, med 8 kampe i hver. // Derfor er der 2 'for' løkker i det følgende. // Den første tæller de 15 spillerunder fra 0-14. // Den starter på 0 fordi den første 'nøgle' i turneringsarray'et $mTurn, og maps // array'et $maps, er '0' (eksempel : $maps[0]="de_dust2";), og den sidste nøgle // er 14 (eksempel : $maps[14]="de_cpl_mill";) // Derfor laver vi ($r+1) når vi skal skrive hvilken spillerunde det er, der er jo ingen spillerunde 0. // Den næste løkke tæller de 8 kampe. Løkken tæller fra 0-16, men det er fordi der er 16 hold, selve // løkken løbes 'kun' igennem 8 gange, da 'tælleren' $k, stiger med 2 for hvert gennemløb. // Hvergang vi 'skriver' en kamp til turneringsskemaet, skrives kampen også ind i turneringstabellen (mySQL) // hvis variablen $tur_empty er true.
En lille ting, bare hvis du ikke ved det, i multidimensionelle array's, ligesom $mTurn, 'finder' man værdierne ved først at skrive reference nøgle i første dimension og så rference nøgle til anden dimension osv...
Eksempelvis $mTurn[0][3] vil være '3' i den kode jeg lige har postet og $mTurn[1][3] vil være '5'
Det mest nærliggende er jo via en form med nogle input felter, så det kan du jo prøve at lave. Nu udskrives tabel celler med indholdet i streng format. Istedet skal de så udskrives i tabel celler men i input felter, og så skal hele dynen ind i et form felt.
Kunne det ikke være noget i den stil? Og så skal der self. tildeles et ID for hver kamp! Men jeg kan ikke sætte mig ind i alle dine koder.. Så hvordan vi skal få det puttet ind, ved jeg ikke hvad vi skal gøre. Men umiddelbart ville det være bedst med noget i den stil.
Du behøver ikke lave <? echo ..noget.. ?> inde i denne del af koden, vi putter jo det hele i en variabel som vi echo'er til sidst...
Så <input name='hjemmehold' type='text' value='".$hjemmehold."'> er ganske fint, men vi får et problem da der laves 120 rækker af denne slags og de kommer alle sammen til at hedde 'hjemmehold'. Så på en eller anden måde skal vi have gjort rækkerne unikke...men jeg sidder lige på arbejde så jeg bliver nød til at vende tilbage senere :) Men det kunne være cool hvis du laver et seperat stykke kode, altså helt uafhængigt af den vi arbejder med, som kan lave 120 rækker i en tabel med 120 unikke input felter for det vil vi kunne overføre direkte til vores kode.
Du kan bruge f.eks.
for($i=0; $i<120; $i++) {
til at køre løkken med de 120 rækker.
Men altså det jeg gerne vil have...hvis det ikke er for meget at bede om :)..er et stykke kode der laver det her output -->
He he..nu kan jeg ikke se koden bagved men du skal jo lave et php script der benytter bl.a. denne 'funktion'..
for($i=0; $i<120; $i++) { ...alt hvad der står her bliver gentaget 120 gange og variablen $i stiger ved hver 'gennemløb' med 1, fra 0 til 119... }
Det må du kunne bruge til noget..det er jo ikke meningen at du blot skal lave de 120 linjer, du skal lave et stykke 'smart' kode der gør det for dig :)
Jeg har lavet et nyt spørgsmål, prøv at tage et kig på den. Jeg har lavet systemet (på en meget åndsvag måde), men den virker ikke optimalt, og jeg ved ikke hvad der er galt :)
Synes godt om
Ny brugerNybegynder
Din løsning...
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.