Avatar billede kodak Mester
04. september 2013 - 19:01 Der er 6 kommentarer og
1 løsning

Bedste mysql opæstning

jeg har en liste med 96 spørgsmål & 9 øvrige oplysninger & 2 radiobutton

fordelt på 2 side og 15 emer, blandet input og checkbokse.

men istedet for at oprette 107 tabeller hvordan kan man så anrette det bedst?

her kan ses en rodet opsætning af spørgsmål listen:
http://line-web.dk/spm/
Avatar billede moddi100 Seniormester
04. september 2013 - 19:45 #1
Der er selvfølgelig lidt forskellige slags spørgsmål, men i princippet behøver du kun én tabel med 3 felter:

Spm  |  Svar    |  Bruger
------------------------------
  1    |  Ja      |    U1
  2    |  Nej    |    U1
  1    |  Ja      |    U2
  1    |  Ja      |    U3

Du gemmer altså bare brugerens svar - eller mangel på samme ved en checkbox sammen med et id for spørgsmålet. Hver bruger kommer så til at lave mange rækker, men det gør jo heller ikke noget. Princippet er, at det er nemt at udtrække statistik fra.

Nu ser det ud som om at du opstiller spørgsmålene helt statisk selv, men ellers kunne man jo have defineret dem i en tabel for sig selv, hvor Spm i ovenstående så blot henviser til deres ID.

Anyway, det smarte med at have én tabel til svarene er også, at du ikke skal bekymre dig om at indsætte svarene i den rigtige tabel. Navngiver du dine checkbokse som følger, er det ret nemt:

<input type='checkbox' name='spm[1]' value='ja' />
<input type='checkbox' name='spm[2]' value='ja' />
<input type='text' name='spm[3]' />
<input type='text' name='spm[4]' />
...


Så kan du gemme alt (du bør nok også have en form for validering):


// Validering af om tilstrækkeligt med felter er udfyldt



// Gem data
$sql = "INSERT INTO table_svar (Spm, Svar, Bruger) VALUES ";

for($i = 1; $i <= 107; $i++)
{
  $sql .= "(" . $i . ",'" . mysql_real_escape_string($_POST['spm'][$i]) . "','" . mysql_real_escape_string($bruger) . "'),";
}

$sql = rtrim($sql, ',');

// Udfør sql hvordan du nu normalt gør det
echo $sql;


Eneste du selvfølgelig skal huske er at brugeren skal tildeles et unikt ID så alle dennes svar grupperes.
Avatar billede kodak Mester
04. september 2013 - 22:08 #2
moddi100
din løsning ser god ud men er det ikke i overkanten at uploade dem alle. selv dem der ikke er besvaret
hvergang jeg submitter sender den jo 175 da jeg har checkbox og ikke radio.
Avatar billede moddi100 Seniormester
04. september 2013 - 22:18 #3
Jo men du kan jo sagtens vælge at sige at du kun sender dem, der har en værdig.



for($i = 1; $i <= 107; $i++)
{
  if(isset($_POST['spm'][$i]))
      $sql .= "(" . $i . ",'" . mysql_real_escape_string($_POST['spm'][$i]) . "','" . mysql_real_escape_string($bruger) . "'),";
}

Avatar billede kodak Mester
04. september 2013 - 22:39 #4
har du et bud på hvordan jeg kan formindske dette

<tr>
    <td class="underline" colspan="2" align="left">Spørgsmål 7</td>';
    if ($edit_news['7'] = "yes") {
        $yes == 'checked';
    } else if ($edit_news['7'] = "no") {
        $no == 'checked';
    } else if ($edit_news['7'] = "maby") {
        $maby == 'checked';
    }
    echo'
    <td class="underline" align="center"><input name="spm[7]" type="radio" value="maby" '.$yes.'></td>
    <td class="underline" align="center"><input name="spm[7]" type="radio" value="no" '.$no.'></td>
    <td class="underline" align="center"><input name="spm[7]" type="radio" value="maby" '.$maby.'></td>
  </tr>
  <tr>
    <td class="underline" colspan="2" align="left">Spørgsmål 8</td>';
    if ($edit_news['8'] = "yes") {
        $yes == 'checked';
    } else if ($edit_news['8'] = "no") {
        $no == 'checked';
    } else if ($edit_news['8'] = "maby") {
        $maby == 'checked';
    }
    echo'
    <td class="underline" align="center"><input name="spm[8]" type="radio" value="maby" '.$yes.'></td>
    <td class="underline" align="center"><input name="spm[8]" type="radio" value="no" '.$no.'></td>
    <td class="underline" align="center"><input name="spm[8]" type="radio" value="maby" '.$maby.'></td>
  </tr>
Avatar billede moddi100 Seniormester
04. september 2013 - 23:08 #5
Jeg er super glad for løkker, og det er netop i sådanne tilfælde at de er anvendelige. Du laver blot en løkke, der løber de tre muligheder igennem. Eks:

$muligheder = array("yes", "no", "maby");

foreach($muligheder as $mulighed)
{
  if($mulighed == $edit_news[7]) // Bemærk dobbelt lighedstegn
  {

    echo '<td class="underline" align="center"><input name="spm[7]" type="radio" checked="checked" value="' . $mulighed . '" />'. $mulighed . '></td>';

  } else {

    echo '<td class="underline" align="center"><input name="spm[7]" type="radio" value="' . $mulighed . '" />'. $mulighed . '></td>';

  } 
}


Det er også muligt at forkorte det endnu mere idet man kan benytte syntaksen:

$var = 5;

// Bemærk hvordan vi laver en if-sætning "indeni"
echo ($var == 12 ? 'Ja' : 'Nej');

// Der er det samme som

if($var == 12)
  echo 'Ja';
else
  echo 'Nej';



Udnytter vi det trick, kan vi få det samlede kode til at blive:
$muligheder = array("yes", "no", "maby");
$spm = array(7, 8);

// Da spørgsmålet står på præcis samme måde, kan vi også lave det i en løkke:
foreach($spm as $s)
{
  echo '<tr>
          <td class="underline" colspan="2" align="left">Spørgsmål ' . $s . '</td>'; 

  foreach($muligheder as $mulighed)
  {
      // Vi har nu slået det sammen til én linje
      echo '<td class="underline" align="center"><input name="spm[7]" type="radio"' . ($mulighed == $edit_news[7] ? ' checked="checked"' : '') . ' value="' . $mulighed . '" />'. $mulighed . '></td>';
  }

  echo '</tr>';
}
Avatar billede kodak Mester
05. september 2013 - 20:46 #6
Tusinde tak for hjælpen.
Avatar billede moddi100 Seniormester
05. september 2013 - 23:41 #7
Skulle det være en anden gang :)
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



IT-JOB

Cognizant Technology Solutions Denmark ApS

Senior Test Manager

Cognizant Technology Solutions Denmark ApS

Test Manager

Udviklings- og Forenklingsstyrelsen

Engageret platformsejer med flair for it-drift