Avatar billede Slettet bruger
12. januar 2011 - 11:21 Der er 7 kommentarer og
1 løsning

Redigering af valg med radio input

Som nogen nok ved er jeg dårlig til at forklare mig selv. Så stil endeli spørgsmål.

Jeg har en database (valg) hvor en bruger har valgt hvilke af hans spiller der er inde og ude i den kommende runde.
Når brugeren har valgt sine spiller kommer han tilbage til siden hvor han praktisk talt kan vælge spiller igen.
Det vil jeg gerne have lavet om så han istedet kan rette sine valg.
FX er alle spiller markeret ude, dem han har valgt må gerne være markeret i inde. (vi snakker 2 radio input felter)
Og knappen i bunden skal opdatere data og ikke sende nyt.

Jeg vil lige beskrive hvordan systemet virker nu, vise koden, og vise et læsningsforslag som jeg har fået men ikke selv kan finde ud af at lave.

==============================================================

Funktion nu
Systemet fungere indtil vider med, at brugen får listede sine xT6 spiller på en side. Ud for hver spiller er der 2 radio inputs felter. (et for inde value=i og et for ude value="o")
Brugeren vælger nu 9 spiller som skal være inde.
Spillerne bliver kun godkendt og gemt i databasen hvis spillerne er valgt efter 2 bestemte kombinationer af pladser.
(1xGK, 1xA, 1xT, 2xF og 4xM) eller (1xGK, 1xA, 1xT, 3xF og 3xM)
Hvis spilleren har valgt følgende kombinationer som spiller der er inde. Bliver alle 16 spiller sendt til databasen, hvor dem der er inde er markeret med et "i" og dem der er ude med et "o" i fletet io i databasen. Så kan man kende forskel.

==============================================================

Kode som den er nu

<?
include('config.php');

$bruger = bruger1;

echo "<form name='form1' method='post' action=''>";
echo "<center><table border='1' class='sample'><tr bgcolor='#000000'><td colspan='5'><center>";
echo "<font color='#FC9801' face='Verdana, Arial, Helvetica, sans-serif'>Dine spillere</font></center></td></tr>";
echo "<tr bgcolor='#222222'><td><center><font color='#FC9801' size='2' face='Verdana, Arial, Helvetica, sans-serif'>Ude</font></center></td>";
echo "<td><center><font color='#FC9801' size='2' face='Verdana, Arial, Helvetica, sans-serif'>Inde</font></center></td>";
echo "<td><center><font color='#FC9801' size='2' face='Verdana, Arial, Helvetica, sans-serif'>Spiller</font></center></td>";
echo "<td><center><font color='#FC9801' size='2' face='Verdana, Arial, Helvetica, sans-serif'>Klub</font></center></td>";
echo "<td><center><font color='#FC9801' size='2' face='Verdana, Arial, Helvetica, sans-serif'>Placering</font></center></td></tr>";

$result = mysql_query("SELECT * from players WHERE bruger = '$bruger' ORDER BY find_in_set(plads, 'GK,F,M,A,T'), navn") or die(mysql_error());
while($row=mysql_fetch_array($result))
{
echo "<tr><td><input type='radio' name='io" .$row['id']. "' value='o' checked='checked'></td><td><input type='radio' name='io" .$row['id']. "' value='i'></td><td>" .$row['navn']. "</td><td>" .$row['klub']. "</td><td>" .$row['plads']. "</td></tr>";
$idarray[] = $row['id'];
}
echo "</table>";
echo "<center><input type='submit' name='submit' value='Send dit hold'></center></form>";

//Behandle resultatet af formen
if($_POST['submit'])

{
  $selection = array("GK"=>0,"F"=>0,"M"=>0,"A"=>0,"T"=>0);
  $players = array();

  $result = mysql_query("SELECT * from players WHERE bruger = '$bruger' ORDER BY navn");
  while($row=mysql_fetch_array($result))
  {
    if (!isset($_REQUEST['io'.$row['id']])) exit("Invalid input.");
    if ($_REQUEST['io'.$row['id']] == "i")
    {
      $selection[$row['plads']]++;
      $players[$row['id']] = $row['id'];
    }
  }

  $ok = false;
  $validSelections[] = array("GK"=>1,"F"=>2,"M"=>4,"A"=>1,"T"=>1);
  $validSelections[] = array("GK"=>1,"F"=>3,"M"=>3,"A"=>1,"T"=>1);
  foreach ($validSelections as $sel)
  {
    $valid = true;
    foreach ($sel as $plads => $num)
    {
      if ( $selection[$plads] != $num) $valid = false;
    }
    if ($valid==true) $ok = true;
  }

  if (!$ok) exit("Ugyldigt valg..");
  if ($ok)
  {
  echo "Dine spiller blev nu gem";
    $result = mysql_query("SELECT * FROM players WHERE bruger = '$bruger'")or die(mysql_error());
    while($row=mysql_fetch_array($result))
    {
      $io = (array_key_exists($row["id"], $players)) ? "i" : "o" ;
      mysql_query("INSERT INTO valg (navn, klub, plads, bruger, io, runde) VALUES('".$row['navn']."', '".$row['klub']."', '".$row['plads']."', '".$row['bruger']."', '$io', '$runde')")or die(mysql_error());
    }
  }
}

?>


==============================================================

Løsnings foslag

if(tabellen allerede indeholder spillere for $runde) $mode = 'rediger'

if(mode = 'rediger')
{
  mysql_query("select spillerne og deres prikker fra valg...

else mysql_query(..select spillerne fra players

if($_POST['submit'])
  if($mode == 'rediger') mysql_query(update valg set....)
  else mysql_query(insert into valg ....)


Løsningsforslaget er meget logisk og det forstår jeg 100% ideen i.

Mit problem med forslaget er at jeg ikke kan finde ud af hvordan man indsætter tabellen (valg) som indholder spillere fra brugerne og for alle runderne.
Her skal der nok lige være både "where bruger=$bruger1 og runde=$runde".

Og ved jeg ikke lige hvordan man får inputfelterne fyldt ud efter hvad der før er valgt.

Hvis nogen kan hjælpe mig ud af denne her sag vil jeg være meget glad.
12. januar 2011 - 22:52 #1
Til din orientering saa er jeg begyndt at udarbejde et loesningsforslag, men det er komplekst og jeg fik travlt med noget andet og i morgen tidlig tager jeg paa skiferie i fjorten dage.  Held og lykke med at faa andre indlaeg, men hvis jeg ser at du ingen faar er det muligt at jeg faar lidt tid i det fremmede til at gaa videre med det.
Avatar billede Slettet bruger
12. januar 2011 - 22:59 #2
Bare iorden.. Du har været en fantastisk hjælp. Og rigtigt god ferie.
Avatar billede Slettet bruger
16. januar 2011 - 12:22 #3
Slet ikke andre der kan hjælpe mig?
17. januar 2011 - 07:40 #4
Saa er den vist ved at vaere der.  Det tog laengere og var mere kompliceret end jeg havde troet (eller maaske var jeg blevet sneblind.)  Men nu virker det som foelger.  Jeg maa lige sige at jeg i min testsite har kaldt de to tabeller ddd_player og ddd_valg for.  Du kan se testsiden paa http://christianjorgensen.be/ddd.php

a.  Naar brugeren aabner siden vises alle brugerens spillere med prik i o.
b.  Hvis brugeren foretager et ugyldigt valg kommer der en fejlmelding og prikkerne forbliver i o.  Intet bliver bevaret i ddd_valg.
c.  Hvis brugeren saa foretager et gyldigt valg bliver det opbevaret i ddd_valg og prikkerne er i o eller i som der er valgt.  Teksten paa knappen skifter til 'Rediger dit hold.'
d.  Brugeren kan saa aendre sit valg.  Hvis hans aendrede valg er ugyldigt faar han igen en fejlmelding og prikkerne forbliver paa o og i efter det oprindelige valg.
e.  Hvis brugerens aendrede valg er gyldigt bliver i ddd_valg det forige valg overskrevet med det nye valg.

Jeg har forstaaet at det var de funktionaliteter du var ude efter.

Jeg gaar ud fra at vaerdierne i $bruger og $runde kommer udefra, for eksempel naar en bruger logger ind saa dannes der en $_SESSION['bruger'] og naar en runde aabnes saa dannes der en $_SESSION['runde'].  For test har jeg indsat vaerdierne bruger1 og runde1.

Jeg boevlede laenge med at lave to queries, det foerste "INSERT INTO ddd_valg ....." og saa hvis valget var lavet om "UPDATE ddd_valg SET ....", men det ville ikke virke.  Saa kom jeg i tanker om hver gang foerst at slette alt i ddd_valg for den paagaeldende bruger og runde og derefter inserte valget.  Hvis det er det foerste valg saa er der ikke noget at slette, hvis det er et aendret valg saa bliver kun det nye valg bevaret.

Jeg har maattet flytte om paa koden saa sektionen med if($_POST['submit'] kommer foerst saaledes at sektionen der danner tabellen kan tage hoejde for hvad der blev submittet.

Saa har jeg yderligere, for min egen forstaaelse, gjort det saaledes at naar jeg efter en query har en while-loekke saa starter jeg med at udtraekke et antal variable som jeg saa kan bruge direkte i det foelgende.  For eksempel:

while($row=mysql_fetch_array($result)
{
$id = $row['id']
$navn = $row['navn']
...

fordi jeg saa kan kode saaledes:

mysql_query("INSERT INTO ddd_valg VALUES('$id', '$navn', ....)")

i stedet for

mysql_query("INSERT INTO ddd_valg VALUES('" . $row['id'] . "', '" . $row['navn'] . ", ....)")

og det finder jeg mere oversigteligt.

Her er koden:

<?
[..connect til database..]

//$bruger = $_SESSION['bruger'];
$bruger = bruger1;
//$runde = $_SESSION['runde'];
$runde = 1;

//Behandle resultatet af formen
if($_POST['submit'])
{
  //Modtag picks:
  $selection = array("GK"=>0,"F"=>0,"M"=>0,"A"=>0,"T"=>0);
  $players = array();

  $result = mysql_query("SELECT * from ddd_player WHERE bruger = '$bruger' ORDER BY navn");
  while($row=mysql_fetch_array($result))
  {
    if (!isset($_REQUEST['io'.$row['id']])) exit("Invalid input.");
    if ($_REQUEST['io'.$row['id']] == "i")
    {
      $selection[$row['plads']]++;
      $players[$row['id']] = $row['id'];
    }
  }

  //Tests picks
  $ok = false;
  $validSelections[] = array("GK"=>1,"F"=>2,"M"=>4,"A"=>1,"T"=>1);
  $validSelections[] = array("GK"=>1,"F"=>3,"M"=>3,"A"=>1,"T"=>1);
  foreach ($validSelections as $sel)
  {
    $valid = true;
    foreach ($sel as $plads => $num)
    {
      if ( $selection[$plads] != $num) $valid = false;
    }
    if($valid == true) $ok = true;
  }

  if(!$ok) echo "Ugyldigt valg..$mode";
  else
  {
    $rediger1 = true;
    mysql_query("DELETE FROM ddd_valg WHERE bruger = '$bruger' AND runde = '$runde'")or die(mysql_error());
    $result = mysql_query("SELECT * FROM ddd_player WHERE bruger = '$bruger'")or die(mysql_error());
    while($row=mysql_fetch_array($result)) 
    {
      $id = $row['id'];
      $navn = $row['navn'];
      $klub = $row['klub'];
      $plads = $row['plads'];
      $io = (array_key_exists($row["id"], $players)) ? "i" : "o" ;

      mysql_query("INSERT INTO ddd_valg (id, navn, klub, plads, bruger, io, runde) VALUES('$id', '$navn', '$klub', '$plads', '$bruger', '$io', '$runde')") or die(mysql_error());
    }
  }
}

if(mysql_num_rows(mysql_query("SELECT * FROM ddd_valg WHERE bruger = '$bruger' AND runde = '$runde'")) > 0) $rediger2 = true;
if($rediger1 || $rediger2) $rediger = true;

echo "<form name='form1' method='post' action=''>";
echo "<center><table border='1' class='sample'><tr bgcolor='#000000'><td colspan='5'><center>";
echo "<font color='#FC9801' face='Verdana, Arial, Helvetica, sans-serif'>Dine spillere</font></center></td></tr>";
echo "<tr bgcolor='#222222'><td><center><font color='#FC9801' size='2' face='Verdana, Arial, Helvetica, sans-serif'>Ude</font></center></td>";
echo "<td><center><font color='#FC9801' size='2' face='Verdana, Arial, Helvetica, sans-serif'>Inde</font></center></td>";
echo "<td><center><font color='#FC9801' size='2' face='Verdana, Arial, Helvetica, sans-serif'>Spiller</font></center></td>";
echo "<td><center><font color='#FC9801' size='2' face='Verdana, Arial, Helvetica, sans-serif'>Klub</font></center></td>";
echo "<td><center><font color='#FC9801' size='2' face='Verdana, Arial, Helvetica, sans-serif'>Placering</font></center></td></tr>";

$query = "SELECT p.*";
if($rediger) $query .= " , v.io, v.runde";
$query .= " FROM ddd_player p";
if($rediger) $query .= " LEFT JOIN ddd_valg v ON p.id = v.id";
$query .= " WHERE p.bruger = '$bruger'";
if($rediger) $query .= " AND v.runde = '$runde'";
$query .= " ORDER BY find_in_set(p.plads, 'GK,F,M,A,T'), p.navn";

$result = mysql_query($query) or die(mysql_error());

while($row=mysql_fetch_array($result))
{
  $id = $row['id'];
  $io = $row['io'];
  $navn = $row['navn'];
  $klub = $row['klub'];
  $plads = $row['plads'];

  echo "<tr><td><input type='radio' name='io$id' value='o'";
  //echo " checked = 'checked'";
  if(!$rediger || $rediger && $io == 'o') echo " checked = 'checked'>";
  echo "</td><td><input type='radio' name='io$id' value='i'";
  if($rediger && $io == 'i') echo " checked = 'checked'";
  echo "></td><td>$navn</td><td>$klub</td><td>$plads</td></tr>";
  $idarray[] = $id;
}

echo "</table>";
echo "<center><input type='submit' name='submit' value='";
if($mode == 'rediger') echo "Rediger dit hold";
else echo "Send dit hold";
echo "'></center></form>";


mysql_close($link); 
?>
Avatar billede Slettet bruger
17. januar 2011 - 17:47 #5
1000 tak er bare så glad. Det virker helt perfekt på min test side.

Men har lidt problemer med at overføre det til der hvor der virkelig skal bruges.

Jeg har her de sidste par dage leget lidt med databaserne.
Min database orden har ikke været særlig god så derfor har jeg ændret lidt på navne osv. for at gøre det bedre for mig selv.

Det har vidst givet mig lidt problemer. Men det er helt sikkert lidt sjovt at lege med :)
Det giver også en bedre forståelse for hvad det er der sker :)

Kigger på det i aften når jeg kommer hjem, ellers må jeg lige vente til engang onsdag. Jeg skal nemlig op til en 24 timers eksamen tirsdag, så ved ikke om jeg får kigget på det der.

Men så længe test siden virker skal det andet nok også komme til at virke. :)
Avatar billede Slettet bruger
17. januar 2011 - 23:00 #6
Sådan.. Efter lidt leg med det lykkes det.
Dog virker det med knappen ikke. Men det er jo en bi ting :)

Har bare lige et spørgsmål.
Er det nemt at smide en besked ind.
FX: "Dit hold er sendt" Og "Dit hold er opdateret".

Du har også løst et problem jeg havde før.
Så det er jeg fri for at spørger om.
Før hen når der bliver lavet en fejl. Og teksten "Ugyldigt valg" Så forsvandt halvdelen af mit design, og det gør det ikke mere.
Så super fedt...
18. januar 2011 - 07:21 #7
Med denne kodeaendring:

  if(!$ok) echo "Ugyldigt valg..$mode <br>";
  else
  {
    echo "Dit hold er sendt med nedenstaaende valg <br>";
    ........

kommer der en besked naar holdet er sendt.  Men det med at lave en anden besked om opdatering bliver svaerere.  Koden goer egenlig ingen forskel paa det at sende et valgt hold foerste gang og det at opdatere det.  Det var den loesning der omsider 'aabenbarede sig' for mig - hver gang et hold bliver sendt slettes det tidligere hold (for samme bruger og runde) og det nye hold indsaettes.  Naar et valgt hold sendes foerste gang slettes der nul og niks.  Hvis der rettes i holdet (saaledes at holdet stadig er gyldigt, for ellers kommer der en fejlmelding) saa slettes det hold der netop var sendt og det nye hold bevares. o.s.v.

Det med ikke at slette designet naar der kommer en fejlmelding var en af de ting der tog lidt tid at faa paa plads, men isaer hvis en bruger har sendt et gyldigt hold og saa vil rette det men laver en fejl saa syntes jeg at brugeren skulle kunne se det hold der lige var sendt.

Saa siger du at du arbejder med databasen.  Jeg undlod at kommentere om det foelgende fordi det laa udenfor spoergsmaalet og maaske har du nu allerede rettet det.  Men nogle af de oplysninger du har i tabellen Player duplikerer du i tabellen Valg.  Det kan lede til problemer paa laengere sigt.  Jeg gaar ud fra at spillerne i Players har unikke id'er saaledes at naar man har en spiller-id saa kender man ogsaa brugeren.  Saa de eneste kolonner du behoever i Valg er id, io, og runde.  Du lagde maaske maerke til at skoent jeg i min kode, ifoelge dit oplaeg, bevarede det hele i Valg, saa brugte jeg kun id, io, og runde i de videre queries.
Avatar billede Slettet bruger
18. januar 2011 - 07:38 #8
Jeps det med at jeg havde lavet om i mine databaser var nemlig min egen "fejl" også derfor jeg selv ville lave det. Hvilket også lykkes helt fint til sidst.
Du har nemlig ret med at mine tabeller i databasen var meget ens. Og det er derfor jeg lavede dem om så nu hedder valg fx v_navn og player hedder det p_navn. Så kan man se forskel. H
Jeg ville bare lige skrive at jeg havde set dit svar og ellers gode arbejde, så du ikke følte at det var spildt. Men at jeg ikke lige havde nået at få det til at virke inden jeg skulle af sted.

Det med at at samme besked kommer frem ved rettelse eller oprettelse, det er helt ok. Kan jeg sagtens leve med.

Jeg takker rigtigt mange gange for en meget stor hjælp.
Kan ikke beskrive hvor glad jeg er. Jeg har også lært en masse på at se dine koder. Dermed ikke sagt at jeg selv kan sætte mig ned og strikke sådan noget sammen. Men man får en bedre fornemmelse af hvad det er der sker og hvordan man kan gøre tingene.

Er da ked af du bruger en ferie på mig, men du skal vide der er sat stort pris på det. Og du må nyde resten af den.
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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