Avatar billede mstorgaard Praktikant
14. juli 2007 - 23:22 Der er 4 kommentarer og
1 løsning

Script til speciel opdatering af MySQL-database

Hej eksperter

Jeg arbejder på at lave et lille system til en rangliste til tennis. Jeg arbejder i PHP med en MySQL-database. Jeg har bare et problem med at finde en metode til at få opdateret ranglisten automatisk.

Jeg har lavet det sådan at når en person har tilføjet en kamp, så skal medspilleren ind og godkende kampen, hvorefter kampen så bør opdateres på ranglisten, hvis det altså er udfordreren der vinder. Ranglisten opdateres sådan at vinderen (hvis det er udfordreren der vinder) overtager taberens plads, hvorefter alle mellem taberen og vinderen rykker et trin nedad på ranglisten.
Fx hvis nummer 5 vinder over nummer 2, bliver nummer 5 til nummer 2, og nummer 2, 3 og 4 bliver til henholdsvis 3, 4 og 5.

Jeg har tænkt på at lave det sådan, at når en kamp bliver godkendt, så ændrer systemet i tal i databasen hos de vedrørte personer, som gør at personerne rykker rundt, men det virker ret uoverskueligt at lave det på den måde, da der er mange variabler, som skal gå op. Yderligere skal der tages højde for at nogle nyere kampe måske godkendes hurtigere end ældre kamp, men så skal de gamle kampe stadig opdateres først, da der eller vil ske fejl på ranglisten.

Jeg forestiller mig, at der kan benyttes forskellige while-løkker til at få systemet til at opdatere ranglisten, men jeg kan ikke umiddelbart komme frem til en smart løsning.

Jeg ved ikke om 200 point er nok til at få nogen til at lave et lille script, som kan klare det, men ellers vil jeg med glæde give pointene for en beskrivelse af, hvordan det kan gøres, hvorefter jeg selv vil prøve at skrive scriptet.

På forhånd tak,
Michael Storgaard.

P.S. Spørg endelig, hvis I har brug for yderligere informationer.
Avatar billede lillebror Nybegynder
14. juli 2007 - 23:39 #1
Jeg tror jeg forstår din problemstilling.

Hele problemet ligger i at en modspiller kan godkende en kamp efter en stor mængde tid, hvor den spiller han har slået i mellemtiden er rykket meget rundt på listen.

Det giver ikke meget mening at opdatere gamle kampe først, da du i så fald skaber et system, der skal udføre en større og større arbejdsopgave for hver gang der registreres en kamp. Så ville du skulle gemme den helt originale placering og tage udgangspunkt i den hver eneste gang en kamp registreres.

Jeg foreslår i stedet for, at du baserer opdateringen på spillerens placering i det øjeblik kampen registreres. Dernæst kan du fremsætte krav om at spillere godkender kampene inden 1 uge. For at sikre at der ikke pludselig sker en stor forskydning.

EX:
Spiller med rang 5 udfordrer rang 2, rang 2 taber. Der går tid inden kampen registreres og rang 2 er nu = rang 1, når kampen godkendes bliver rang 5 derfor = rang 1 og rang 1 bliver rang 2, osv.

Men hvis du ikke regner med at have ret mange registreringer så kan det selvfølgelig lade sig gøre at lave en løsning der altid tager hensyn til tidspunktet kampen er spillet på.
Avatar billede mstorgaard Praktikant
14. juli 2007 - 23:52 #2
Som systemet ser ud nu og som den nok forbliver i et stykke tid, så vil der højst være omkring 35 tilmeldte.

Det vil være meget uhensigtsmæssigt, hvis en sen godkendelse laver rav i ranglisten, så jeg ser helst, at opdateringen foregår efter den besværlige metode.

Hvad vil være den bedste metode at lave det på, hvis den skal tage hensyn til tidspunktet? For mig virker det umiddelbart ret uoverskueligt.
Avatar billede lillebror Nybegynder
15. juli 2007 - 00:54 #3
Se du skal jo have et udgangspunkt for ranglisten, og lad os bare sige at det er oprettelsestidpunktet.

Du laver en tabel med spillerinfo
id int(8)
navn varchar(250)
osv.
----------------------------------
Vi antager at du har oprettet de 35 spillere, og nu har to spillere så spillet en kamp. du skal altså bruge en tabel, der kan holde info om kampen
tidspunkt datetime
forsvarer int(8)
udfordrer int(8)
udfordrervandt tinyint(1) //Til at registrere om udfordren vinder (det er jo kun i det tilfælde der skal ske rokeringer ikke?)
og nogle flere felter til score.
---------------------------------
Nu har du så både spillere og kampe, og for at kunne rangere dine spillere må du liste dem i rækkefølge fra 1 - N hvor N er antallet af registrerede spillere.

jeg forestiller mig en while loop.
$query = mysql_query("select id from spillere order by oprettelsestidspunkt");
$rang = array();
while ($data = mysql_fetch_array($query)) {
$rang[] = $data['id']
}

Nu har du så tidligste oprettede spiller på plads 1, og seneste på plads N.

herefter skal alle kampe behandles, for at finde den nuværende placering. (jeg antager at udfordren altid er ham der er dårligst placeret)
$query = mysql_query("SELECT forsvarer,udfordrer FROM kampe WHERE udfordrervandt=1 ORDER BY tidspunkt");
while ($data = mysql_fetch_array($query)) {
  $udfordrerRang = array_search ($data['udfordrer'], $rang);
  $forsvarerRang = array_search ($data['forsvarer'], $rang);
  //så kommer der noget array håndtering
  $uberoerte = array();
  $skifterang = array();
  $uberoerte = array_slice($rang, 0, $forsvarerRang); //Find placeringer over forsvaren
  $skifterang = array_slice($rang, $forsvarerRang); //Tager alle under forsvareren
 
  $uberoerte[] = $data['udfordrer'];
  $uberoerte[] = $data['forsvarer'];

  foreach($skifterang as $value) {
if ($value != $data['udfordrer'] && $value != $data['forsvarer']) {
$uberoerte[] = $value;
}
}

$rang = array();
$rang = $uberoerte;
}

Når den while er færdig med at køre har du den nye rangliste.

Hvis du så vil lave noget sofistikeret, som kan spare computerkræfter, så laver du en tabel, der indeholder hver kørsel. Dvs. en ny række for hver gang ranglisten er opdateret. Når nogen så tilføjer en kamp, der er ældre end nyeste kørsel, så skal den bare tage udgangspunkt i den nyeste kørsel, der dog er ældre end kampen. Og kun analysere de kampe, der er spillet siden sidste kørsel.
Avatar billede lillebror Nybegynder
15. juli 2007 - 00:54 #4
Det skal lige siges at jeg overhovedet ikke har testet det, jeg har hverken lavet tabellerne eller kørt koden. Der kan være parseerrors
Avatar billede lillebror Nybegynder
15. juli 2007 - 01:11 #5
Ved du hvad...

Jeg kunne ikke lade være. Jeg har lavet noget "proof of concept". Jeg kan sige at det jeg tidligere har postet virker, der skulle ikke være parse errors i. Jeg var nødt til at omskrive det lidt, for at teste at det faktisk giver det ønskede resultat uden MySQL database (gad ikke oprette tabeller og forbindelser osv.)

$rang[0] = "Spiller 1";
$rang[1] = "Spiller 2";
$rang[2] = "Spiller 3";
$rang[3] = "Spiller 4";
$rang[4] = "Spiller 5";
$rang[5] = "Spiller 6";
$rang[6] = "Spiller 7";
$rang[7] = "Spiller 8";
$rang[8] = "Spiller 9";
$rang[9] = "Spiller 10";

$kamp[1]['udfordrer'] = "Spiller 6";
$kamp[1]['forsvarer'] = "Spiller 4";
$kamp[2]['udfordrer'] = "Spiller 3";
$kamp[2]['forsvarer'] = "Spiller 1";
$kamp[3]['udfordrer'] = "Spiller 10";
$kamp[3]['forsvarer'] = "Spiller 9";
$kamp[4]['udfordrer'] = "Spiller 1";
$kamp[4]['forsvarer'] = "Spiller 3";

$n = 1;
while (is_array($kamp[$n])) {
    $data = $kamp[$n];
  $udfordrerRang = array_search ($data['udfordrer'], $rang);
  $forsvarerRang = array_search ($data['forsvarer'], $rang);
  //så kommer der noget array håndtering
  $uberoerte = array();
  $skifterang = array();
  $uberoerte = array_slice($rang, 0, $forsvarerRang); //Find placeringer over forsvaren
  $skifterang = array_slice($rang, $forsvarerRang); //Tager alle under forsvareren
 
  $uberoerte[] = $data['udfordrer'];
  $uberoerte[] = $data['forsvarer'];

  foreach($skifterang as $value) {
if ($value != $data['udfordrer'] && $value != $data['forsvarer']) {
$uberoerte[] = $value;
}
}

$rang = array();
$rang = $uberoerte;
$n += 1;
}

echo '<pre>';
print_r($rang);
echo '</pre>';

Det her virker som det skal.
Igen skal jeg lige sige, at det er meget vigtigt, at udfordren er ham der har lavest rang, ellers går scriptet i kage. Såfremt du ikke stoler på at brugerne kan indtaste det korrekt, må du have en kontrolstruktur, der sammenligner dem inden rangen påvirkes, for at finde ud af hvem der er udfordrer. God fornøjelse.

Mere kan jeg desværre ikke give når betalingen er point.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester