Spelers toevoegen aan Wedstrijd

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

JunkieXP

JunkieXP

18/03/2008 12:03:00
Quote Anchor link
Ik ben bezig met een script waarin ik een Wedstrijd kan Selecteren en vervolgens rij voor rij spelers aan deze wedstrijd kan hangen welke ik vervolgens kan voorzien van doelpunten, de naam van het Input veld doelpunten is dan bijvoorbeeld goals_1 waar 1 staat voor het id van de betreffende speler.

Uiteindelijk haal ik dit door een While Loop welke ik echter niet werkend krijg, er gaat niet zo zeer iets mis, ik weet niet hoe ik eerst een MySQL query kan aanmaken voor alle Spelers samen welke vervolgens weggeschreven.

Of is het net zo optimaal om gewoon iedere speler los weg te schrijven naar de database met ieder zijn eigen query.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
    $i
= 1;
    //Get Array with Filled Checkboxes
    $arrPresent = $_POST['chkbx'];
    
    //Create Array for MySQL use
    $arrPost = array();
    
    while(count($arrPresent) >= $i){
     $PresentID = key($arrPresent);
     $PresentCheck = $arrPresent[key($arrPresent)];
    
     if(isset($PresentCheck)){
      $arrGoals = $_POST['goals'];
      $postGoals = $arrGoals[$PresentID];      
      $arrOwnGoals = $_POST['owngoals'];
      $postOwnGoals = $arrOwnGoals[$PresentID];      
      $arrPenalty = $_POST['penalty'];
      $postPenalty = $arrPenalty[$PresentID];
      $arrKeeper = $_POST['keeper'];
      $postKeeper = $arrKeeper[$PresentID];
      $arrWash = $_POST['wash'];
      $postWash = $arrWash[$PresentID];
      
      $postValues[$PresentID] = $postGoals.",".$postOwnGoals.",".$postPenalty.",".$postKeeper.",".$postWash;
     }
else{
      //No Action
     }
    
    next($arrPresent);
    $i++;
    }

?>


Deze maakt (heel omslachtig) een array aan welke alle waardes bevat en linkt deze aan de id. De weergave hiervan is gewoon tijdelijk, dit is niet op arrays gespecificeerd maar gewoon op weergave.
 
PHP hulp

PHP hulp

29/03/2024 01:34:10
 
Crispijn -

Crispijn -

18/03/2008 12:23:00
Quote Anchor link
Quote:
Of is het net zo optimaal om gewoon iedere speler los weg te schrijven naar de database met ieder zijn eigen query.


Wanneer je van te voren je database model hebt geoptimaliseerd denk ik dat je hier goed antwoord op kan geven. Hoe ziet je database structuur er nu uit? Ik denk namelijk dat uiteindelijk het antwoord op bovenstaande vraag 'ja' gaat luiden.
 
JunkieXP

JunkieXP

18/03/2008 12:40:00
Quote Anchor link
In het koort gaat het om de volgende tabelen en kolommen

[Tabel Players]
Player_ID
Name

[Tabel Matches]
Match_ID
Opponent

[Tabel Statics]
Statics_ID

Player_ID
Match_ID

Goals
OwnGoals
etc.
 
Crispijn -

Crispijn -

18/03/2008 12:42:00
Quote Anchor link
Player_ID
Match_ID

HIer heb je hem dus. Je hebt een koppeltabel tussen de spelers en de wedstrijden. Dit is de juiste manier van werken!

Dus: Voor elke speler een record in deze koppeltabel klussen.
 
JunkieXP

JunkieXP

18/03/2008 12:48:00
Quote Anchor link
Ja dat was idd mijn insteek, zo doe ik het momenteel ook (via PHPMyAdmin)

Echter genereer ik nu dus (geen SQL waardes gewoon voorbeeld)

INSERT INTO tabel (Statics_ID, Player_ID, Match_ID, goals)
VALUES ('', '2', '53', '1');
VALUES ('', '4', '53', '0');

Nu is mijn vraag dus welke optie het meest efficient is

1. kan ik het beste eerst een MySQL query opbouwen zoals bovenstaande (en zoja hoe maak ik efficient adh van de Loop een String aan welke de complete query bevat). En deze aan het eind van de Complete while (dus nadat alle Spelers in de "array" oid zijn toegevoegd in een keer uitvoeren.

2. of kan het geen kwaad om op het eind van de While steeds
INSERT INTO tabel (Statics_ID, Player_ID, Match_ID, goals)
VALUES ('', '2', '53', '1');

een rij toe te voegen, op die manier maak je meerdere malen een connectie met de database.

Snap je wat ik bedoel, alvast bedankt voor je hulp Crispijn
 
Crispijn -

Crispijn -

18/03/2008 12:55:00
Quote Anchor link
Ik zou alles verzamelen in 1 variabele en dan deze in één keer uitvoeren. Dat werkt wel zo lekker lijkt mij.

Maar wat sneller is weet ik niet, dat zou je eens moeten testen eigenlijk!
 
JunkieXP

JunkieXP

18/03/2008 12:57:00
Quote Anchor link
Daar heb ik dus het probleem, dit leek mij idd ook de netste methode, als het dan fout gaat gaat (meestal) alles fout, dat is beter als de helft wel en de andere helft niet te verwerken.

Maar hoe kun je efficient met het gegeven dat de while loop produceert omspringen, hoe verwerk je dus efficient de waardes per speler. Dat was mijn voornamelijke vraag.
 
Crispijn -

Crispijn -

18/03/2008 13:03:00
Quote Anchor link
Het is juist heel prettig in 1 keer de boel uit te voeren. Wanneer je gebruik maakt van pdo kan je eerst de boel uitvoeren, en wanneer de rest van de query fout gaat weer terughalen. Zo staat er nooit verkeerde data in je database.

Blanche heeft hier een mooie tut over geschreven. De zogenaamde transacties
 
JunkieXP

JunkieXP

18/03/2008 16:16:00
Quote Anchor link
Well, I guess this should do the trick, niet helemaal netjes maar het gaat denk wel werken op deze manier, Suggesties zijn uiteraard welkom.

het is nu gebouwd als Echo, dit dien ik dus nog om te zetten naar MySQL_Query maar wilde eerst Fysiek zien of hij de juiste Query genereerde.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php
        //Get Array with Filled Checkboxes
    $arrPresent = $_POST['chkbx'];
    
    for($i = 1; count($arrPresent) >= $i; $i++){
     $PresentID = key($arrPresent);
     $PresentCheck = $arrPresent[$PresentID];
    
     if(isset($PresentCheck)){
      $arrGoals = $_POST['goals'];
      $postGoals = $arrGoals[$PresentID];      
      $arrOwnGoals = $_POST['owngoals'];
      $postOwnGoals = $arrOwnGoals[$PresentID];      
      $arrPenalty = $_POST['penalty'];
      $postPenalty = $arrPenalty[$PresentID];
      $arrKeeper = $_POST['keeper'];
      $postKeeper = $arrKeeper[$PresentID];
      $arrWash = $_POST['wash'];
      $postWash = $arrWash[$PresentID];
      
      $arrPost[$PresentID] = "'".$postGoals."','".$postOwnGoals."','".$postPenalty."','".$postKeeper."','".$postWash."'";
     }
else{
      //No Action
     }
    
    next($arrPresent);
    }

    
    //Create MySQL Query
    echo("INSERT INTO statics<br>");
    
    for($i = 1; count($arrPost) >= $i; $i++){
     $PresentID = key($arrPost);
     $PresentScores = $arrPost[$PresentID];
    
     if($i == count($arrPost)){
      echo("VALUES('".$PresentID."','".$_POST['match_id']."','".$PresentScores.");<br>");
      break;
     }
else{
      echo("VALUES('".$PresentID."','".$_POST['match_id']."','".$PresentScores."),<br>");
     }

    
     next($arrPost);
    }

?>


Nu nog even controlleren of ik de Transacties dmv COMMIT en ROLLBACK (zonder PDO, daar waag ik me nog maar even niet aan) werkend krijg.

PS. Wanneer ik een Radio Button gebruik en geen Value instell geeft deze Standaard N als deze is aangevinkt, wanneer ik Value Pak geeft hij vaak een random waarde.

Nu maakt die N mij niet uit maar ben toch wel benieuwd waar deze voor staat.
Gewijzigd op 01/01/1970 01:00:00 door JunkieXP
 
Frank -

Frank -

18/03/2008 16:21:00
Quote Anchor link
Wat is nu de bedoeling? Regels 13 t/m 22 zijn overbodig, de ene variabele in de andere zetten zonder er verder iets mee te doen, is kansloos.

Regel 40 en 43 zijn ook hetzelfde, daar is dus ook iets niet helemaal in de haak.

Waarom je denkt dat echo een functie is (zie de haakjes () ), is me een raadsel, je kunt nu alleen maar méér fouten maken. Je moet er maar zin in hebben.
 
JunkieXP

JunkieXP

18/03/2008 16:42:00
Quote Anchor link
Ik heb echo al vanaf den beginnen met haken gebruikt geen idee waarom maar als je het eenmaal zo aangeleerd hebt blijf je er toch bij en vind het persoonlijk weer net wat meer overzicht scheppen.

Ik ben het echter niet eens betreffende de regels die hetzelfde zijn. Ik geloof dat mijn manier niet optimaal is maar zal de uitleg even kort uitleggen.

Zodra je op Post drukt worden er verschillende Arrays aangemaakt, de array Goals bevat het aantal goals dat per speler is gescoord etc. Dit zou bij nader inzien idd beter buiten de while kunnen gebeuren.

Vervolgens haal je adh van het spelers id op welk doelsaldo uit de array goals bij de betreffende speler hoort.

Wat jou vergelijking tussen regel 40 en 43 is ontgaat mij een beetje, regel 40 bevat namelijk de punt komma voor de laatste value terwijl regel 43 naar de volgende key springt in de array. ( zo heb je ook gelijk een beschrijving wanneer je wilde zeggen dat regel 37 en 40 gelijk zijn, 37 eindigt met een komma zodat hij nog opgevolgd kan worden en 40 sluit de query af, dit gaf anders problemen in MySQL wanneer je dit niet zou doen.)

(Mijn excuses voor het benoemen van while daar ik for loops gebruik, dit is mijn eerste scripts waarin ik een for loop gebruik dus vandaar dat ik het altijd nog over while heb).
 
Crispijn -

Crispijn -

18/03/2008 17:42:00
Quote Anchor link
Hmm, wil je niet te veel in 1 keer? Volgens mij kan je beter eerst eens een query opzetten voor het inserten van je wedstrijden-spelers. Je zet trouwens ook
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<br>


aan het eind van de regel. Waarom? Html in een sql query stoppen? Dat lijkt me geen goed idee. Wil ook niet geloven dat je dit al getest hebt.

Verder is het gebruik van next niet zo netjes. Waarom gebruik je dit zo veel?
 
JunkieXP

JunkieXP

18/03/2008 22:58:00
Quote Anchor link
Zoals ik al vermelde gebruik ik die echo's om een virtuele weergave van de Query te ontwikkelen zodat ik kan zien of de manier waarop hij het uiteindelijk uit zou gaan voeren correct is, dit was iets makkelijker testen dan direct met de database verbinden, alleen iets meer omzet werk.

Next gebruik ik om de volgende Key aan te roepen, kon namelijk niet vinden hoe ik adh van een waarde de key op kon halen dus heb ik dat op deze manier uitgevoerd, idd niet netjes omdat je zowel de $i als de array nu ophoogt maar ja.
 
Jurgen assaasas

Jurgen assaasas

18/03/2008 23:00:00
Quote Anchor link
Je kunt gewoon de array doorlopen met foreach()?
 
Frank -

Frank -

18/03/2008 23:14:00
Quote Anchor link
JunkieXP schreef op 18.03.2008 16:42:
Ik heb echo al vanaf den beginnen met haken gebruikt geen idee waarom maar als je het eenmaal zo aangeleerd hebt blijf je er toch bij en vind het persoonlijk weer net wat meer overzicht scheppen.
Het zorgt ook voor meer tikfouten, dus bugs.

Quote:
Wat jou vergelijking tussen regel 40 en 43 is ontgaat mij een beetje, regel 40 bevat namelijk de punt komma voor de laatste value terwijl regel 43 naar de volgende key springt in de array. ( zo heb je ook gelijk een beschrijving wanneer je wilde zeggen dat regel 37 en 40 gelijk zijn, 37 eindigt met een komma zodat hij nog opgevolgd kan worden en 40 sluit de query af, dit gaf anders problemen in MySQL wanneer je dit niet zou doen.)
Nu je het zegt, het verschil zit hem inderdaad tussen de ; en de , De if-else is er dus alleen maar om te bepalen of je een ; of een , wilt gebruiken, waarom staat de rest dan dubbelop in de if-else? Dat is volkomen overbodig.

Nogmaals, zorg voor eenvoudige code, dan kan er veel minder fout gaan en is het veel eenvoudiger te bouwen, testen en debuggen. Alles wat overbodig is, gooi je eruit, alles wat dubbel is, gooi je er eveneens uit. Keep it dry!

Waarbij DRY staat voor Don't Repeat Yourself.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.