Avatar billede Calle5463 Forsker
28. april 2012 - 21:29 Der er 25 kommentarer og
1 løsning

Checkbox, vis data så jeg kan ændre dem

Jeg har søgt både her og der men ikke fundet noget jeg kan forstå (og derfor bruge - det bliver lidt langhåret især når det ikke er på dansk):

Hvordan viser jeg på skærmen hvad der står i tabellen - altså hvilke opgaver der er valgt og så jeg kan ændre/tilføje?

Jeg mener at være nogenlunde med så langt som nedenstående - er dog i tvivl om hvad datatypen i tabellen kan/skal være (og hvor lang). Men jeg får da gemt data i tabellen:

Tabel: sag
---------------------
sagnr : int(11)
opgave : Binary(??) (har også prøvet bolean men det bliver ændret til tinyint!! Måske det samme?)


InsertData.php
------------------
<?PHP
include "conn.php";
mysql_query("INSERT INTO tjekbox(sagnr, opgave) VALUES('$_POST[sagnr]', $opgave) ");
?>


TjekboxForm.php
----------------------
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">

<html>
<head>
<title>Test tjekbox</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
</head>

<body bgcolor=#d0d0d0>

<?PHP
if (isset($_POST['submit']) && $_POST['submit'] =='Send') {
    $opgave = array_sum($_POST['opgave']);
    echo $opgave;
    include "InsertData.php";
   
}   
?>

<FORM method="post" action='#'>
    Sagnr: <input type="text" name="sagnr" ><br><br>
    <input type="hidden" name="opgave[]" value="0">  <!-- kvikfix: hvis ingen valgt -->
    Opgave 1: <input type="checkbox" name="opgave[]" value="1"><br>
    Opgave 2: <input type="checkbox" name="opgave[]" value="2"><br>
    Opgave 3: <input type="checkbox" name="opgave[]" value="4"><br>
    Opgave 4: <input type="checkbox" name="opgave[]" value="8"><br>
    Opgave 5: <input type="checkbox" name="opgave[]" value="16"><br>
    Andet: <input type="checkbox" name="opgave[]" value="32"><br><br>
    <input type="submit" name="submit" value="Send">
</FORM>
</body>
</html>
Avatar billede timpet Novice
28. april 2012 - 21:50 #1
Jeg er ikke helt med på hvad det er du gerne vil, skal du checke en box, som så hente noget frem på skærmen til dig?
Avatar billede Calle5463 Forsker
28. april 2012 - 22:37 #2
Nej - når jeg har gemt indholdet af checkboxene fra formen hvor jeg opretter dem, skal jeg senere i en anden form have mulighed for at se og ændre dem.
Avatar billede timpet Novice
28. april 2012 - 22:46 #3
Hmm, med chance for at jeg svare på noget andet så sætter du output fra databasen som value på form felterne. Fx. <input type="text" name="name1" value="'.$output_fra_aktuel_opgave.'">

Er du med på hvor jeg vil hen og er det rigtigt forstået at du vælger opgaverne og trykker submit, på næste side er de så hentet frem og lagt i input felter?
Avatar billede Calle5463 Forsker
29. april 2012 - 00:06 #4
#3: Du behøver ikke prøve at fortolke så meget.

Opgaven er lige ud af landevejen, drejer sig kun om at vise "status" på den aktuelle checkbox i en form så jeg kan ændre dem. Principielt som du beskriver - jeg mangler bare lidt kode som jeg ikke selv kan "opfinde" da jeg ikke er hardcore programmør. Men jeg er rimelig go' til copy/paste og ekstrapolation.
Avatar billede vagnk Juniormester
29. april 2012 - 09:13 #5
Kære Calle5463
Du behøver ikke at blive snerpet, fordi timpet spørger lidt ind til din formulering.

Dit spørgsmål er: Hvad skal jeg bruge som datatype når den værdi der skal ind er numerisk og højst kan have værdien 31 (summen af checkboxe)?

Hvis du selv havde formuleret spørgsmålet sådan og undladt en masse kode og forvirrende mubojumbo, havde du sikkert fået svaret: tinyint og med length=3, hvis det skal være fornemt.
Avatar billede Calle5463 Forsker
29. april 2012 - 10:26 #6
Undskyld, Timpet, hvis du læser det som #5 antyder - det var OVERHOVEDET ikke ment som andet end en nøgtern hjælp til hvor "dybt" mine skriblerier skulle fortolkes. (Hvis mit sprog har en "tone", som er det min frustration over egne manglende kvalifikationer der skinner igennem)

Til gengæld, vagnk, så synes jeg det var nødvendigt for at antyde hvad jeg kan og ikke kan finde ud af - jeg er ikke programmør som mange af i andre herinde. I øvrigt, tak for Typen.
Avatar billede Calle5463 Forsker
29. april 2012 - 20:45 #7
Nu har jeg prøvet med forskellige ting. Jeg må erkende, at jeg ikke kan decifrere hvad kode der skal stå i stedet for hmmm.


(uddrag)
<?PHP
$sagnr='14';
$result=mysql_query("SELECT * FROM tjekbox WHERE sagnr=$sagnr");
$post=mysql_fetch_array($result);
$opg=$post['opgave'];

echo "Opgave 1: <input type='checkbox' name='opgave[]' value=hmmm >  <br>";


echo "Komment 3: Opgaveværdi $opg for sagnr $post[sagnr]";   
?>

Resultat: "Komment 3: Opgaveværdi 8 for sagnr 14" - men ingen flueben.
Avatar billede vagnk Juniormester
30. april 2012 - 09:43 #8
Nu forstår jeg. Du har en decimal værdi i tabellen som er dannet ved sammenlægge binære værdier 0, 1, 2, 4...

Den decimale værdi vil du have splittet op i 1'er og 0'er, så du kan markere dine checkboxe som "checked" eller "". Den er nu (indrømmet) heller ikke helt nem at formulere, hvis kendskabet begrænset. Og lidt tricky fordi man skal køre loopet igennem i den ene retning og udskrive værdierne i den anden retning (highorder/loworder for at være bare en lille smule teknisk).


$opg = 23; #er fundet med en SELECT.

$bin = decbin($opg);
$lgd = strlen($bin);
for($i = $lgd - 1; $i > 0; $i--){  #Køres baglæns men vises forlæns
  if($bin[$i] == 0)
    $chked = "";
  else
    $chked = "checked";
  $opgnr = $lgd - $i;
  echo "Opgave $opgnr: <input type='checkbox' name='opgave[]' ";
  echo "value=hmmm $chked >  <br>";
}
Avatar billede vagnk Juniormester
30. april 2012 - 09:58 #9
Overså lige den med value=

Slet efter "$opgnr = $lgd - $i;"
og indsæt:

$pow = pow(2, $opgnr - 1);
echo "Opgave $opgnr: <input type='checkbox' name='opgave[]' ";
echo "value=$pow $chked >  <br>";
Avatar billede Calle5463 Forsker
30. april 2012 - 16:16 #10
- så er vi på vej :-)

Jeg har nu flg lidt forkortede kode:

$sagnr='9'; // sagnr 9 giver $opg=9, som skulle give flueben i OP 1 og 4, hvilket nedenstående selvsagt ikke gør, da værdierne ikke bliver tildelt de respektive boxe (id'er) - kan det flettes med ind i for-løkken?

Har det betydning, at jeg vælger at tildele $opg værdien 0 (ikke NULL) hvis alle boxe er tomme (det er en tilladt mulighed) eller skal jeg lade $opg være NULL og give den første box værdien 0?

Jeg vil godt (skal) have, at alle checkboxe vises, så jeg har flg lidt forkortede kode:

$bin = decbin($opg);
$lgd = strlen($bin);

for($i = $lgd - 1; $i > 0; $i--){  // Køres baglæns men vises forlæns
    if($bin[$i] == 0) $chked = "";
        else $chked = "checked";
$opgnr = $lgd - $i;

$pow = pow(2, $opgnr - 1);
}

echo "<table width='600'>";
echo "<tr>";
echo "<td> OP1: <input type='checkbox' name='opgave[]' id='$opgnr' value=$pow $chked ></td>";
echo "<td> OP2: <input type='chckbox' name='opgave[]' id='$opgnr' value=$pow $chked ></td>";
echo "<td> OP3: <input type='checkbox' name='opgave[]' id='$opgnr' value=$pow $chked ></td>";
echo "</tr>";
echo "<tr>";
echo "<td> OP4: <input type='checkbox' name='opgave[]' id='$opgnr' value=$pow $chked ></td>";
echo "<td> Op5: <input type='checkbox' name='opgave[]' id='$opgnr' value=$pow $chked ></td>";
echo "<td> OP6: <input type='checkbox' name='opgave[]' id='$opgnr' value=$pow $chked ></td>";
echo "</tr>";
echo "</table>";
Avatar billede vagnk Juniormester
30. april 2012 - 18:19 #11
$sagnr='9'; // sagnr 9 giver $opg=9, som skulle give flueben i OP 1 og 4, hvilket nedenstående selvsagt ikke gør, da værdierne ikke bliver tildelt de respektive boxe (id'er) - kan det flettes med ind i for-løkken?
Hvad mener du? Er min algoritme forkert?

Har det betydning, at jeg vælger at tildele $opg værdien 0 (ikke NULL) hvis alle boxe er tomme (det er en tilladt mulighed) eller skal jeg lade $opg være NULL og give den første box værdien 0?
Kommer helt an på hvad du vil bruge værdierne til. Du laver en array_sum på dine POST-variabler. Hvad tror du den giver hvis alle boxe er tomme eller med 0?

Fortsætter senere...
Avatar billede Calle5463 Forsker
30. april 2012 - 18:44 #12
#11, første del: njaaeeehh, jeg vil helst ikke være overdommer på den, men JEG fik ikke helt det ud jeg regnede med = indsat i tabellen. Prøver lige igen med din kode om jeg kan se og beskrive hvad der forskellen.

#11, anden del: I den kode jeg bruger (se kode og fejl nedenfor) til at sætte data i tabellen får jeg en fejlmelding hvis alle 6 checkboxe er un-checked = "" = NULL. Det lavede jeg så et kvikfix til at afhjælpe (Jeg har i øvrigt tilladt NULL-værdier i tabellen.):

<input type="hidden" name="opgave[]" value="0"> <!-- kvikfix --> -->

Kode:
<?PHP
if (isset($_POST['submit']) && $_POST['submit'] =='Send') {
    $opgave = array_sum($_POST['opgave']);
    include "InsertData.php";
}
?>

Fejl:
Notice: Undefined index: opgave in C:\Program Files (x86)\EasyPHP-5.3.9\www\Test-tjekbox\tjek-box.php on line 12

Warning: array_sum() expects parameter 1 to be array, null given in C:\Program Files (x86)\EasyPHP-5.3.9\www\Test-tjekbox\tjek-box.php on line 12
Avatar billede Calle5463 Forsker
30. april 2012 - 18:48 #13
Har gang i noget i den her stil, men det virker (sfl) ikke:


$nr=0;
for($j=1;$j<7;$j++) $chked[$j]=""; // un-checker alle for god ordens skyld

$nr=0;
for($i = $lgd - 1; $i > 0; $i--){  // Køres baglæns men vises forlæns
    $nr++;
    if($bin[$i] == 0) {$chked[$nr] = ""; } else { $chked[$nr] = "checked"; }
   
}

echo "<table width='600'>";
echo "<tr>";
echo "<td> Opgave 1: <input type='checkbox' name='opgave[]' value=$chked[1] ></td>";
echo "<td> Opgave 2: <input type='checkbox' name='opgave[]' value=$chked[2] ></td>";
echo "<td> Opgave 3: <input type='checkbox' name='opgave[]' value=$chked[3] ></td>";
echo "</tr>";
echo "<tr>";
echo "<td> Opgave 4: <input type='checkbox' name='opgave[]' value=$chked[4] ></td>";
echo "<td> Opgave 5: <input type='checkbox' name='opgave[]' value=$chked[5] ></td>";
echo "<td> Opgave 6: <input type='checkbox' name='opgave[]' value=$chked[6] ></td>";
echo "</tr>";
echo "</table>";
Avatar billede Calle5463 Forsker
30. april 2012 - 19:06 #14
Med kode fra #8 og #9:

Hvis værdi i tabel er 0, viser den ingen checkboxe
Hvis værdi i tabel er 1, viser den ingen checkboxe
Hvis værdi i tabel er 2, viser den 1 unchked box
Hvis værdi i tabel er 3, viser den 1 chked box

Hvis værdi i tabel er 9, viser den checkbox nr 1,2 og 3 og sætter flueben i nr 1
Avatar billede Calle5463 Forsker
30. april 2012 - 22:07 #15
Den her ser ud til at gøre det korrekt, bortset fra at den "kun" viser til-og-med "lgd".

for($i = $lgd; $i > 0; $i--){  #Køres baglæns men vises forlæns
  if($bin[$i-1] == 0)
    $chked = "";
  else
    $chked = "checked";
  $opgnr = $lgd - $i +1;
  $pow = pow(2, $opgnr);
echo "Opgave $opgnr: <input type='checkbox' name='opgave[]' ";
echo "value=$pow $chked >  <br>";
Avatar billede Calle5463 Forsker
30. april 2012 - 22:08 #16
Der står "checked" i $chked[1] - hvorfor sætter den ikke fluebenet??

<td> Opgave 1: <input type="checkbox" name="opgave[]" value=<?PHP echo "$chked[1]"; ?> ></td>
Avatar billede olsensweb.dk Ekspert
01. maj 2012 - 00:15 #17
>Der står "checked" i $chked[1] - hvorfor sætter den ikke fluebenet??
pga attributten ikke hedder value med checked

ret
Opgave 1: <input type="checkbox" name="opgave[]" value=<?PHP echo "$chked[1]"; ?> >
til dette
Opgave 1: <input type="checkbox" name="opgave[]" checked=<?php echo "$chked[1]"; ?> >
Avatar billede olsensweb.dk Ekspert
01. maj 2012 - 00:19 #18
og så manglede der self nogle " omkring checked
Opgave 1: <input type="checkbox" name="opgave[]" checked="<?php echo "$chked[1]"; ?>" >

så output i html er
Opgave 1: <input type="checkbox" name="opgave[]" checked="checked" >
Avatar billede Calle5463 Forsker
01. maj 2012 - 00:38 #19
Dec værdi = 9
Binær værdi = 1001

Komment 3: 1: checked
Komment 3: 2:
Komment 3: 3:
Komment 3: 4: checked
Komment 3: 5:
Komment 3: 6:

Opgave 1: v    Opgave 2: v    Opgave 3: v
Opgave 4: v     Opgave 5: v    Opgave 6: v

- det er ligeved og næsten og sikkert bare et par '' eller "" som jeg ikke kan se mig ud af. Nu sætter den flueben i alle boxe:

for($i=$lgd; $i > 0; $i--){  // Køres baglæns men vises forlæns
    $nr++;
    $s=$lgd-$i;
    if($bin[$s] == 0) {$chked[$nr]=""; } else { $chked[$nr]="checked"; }
}
$nr++;
for($j=$nr;$j<7;$j++) {    $chked[$j]=""; }

for($t=1; $t<7; $t++) { echo "Komment 3: $t: $chked[$t] <br>"; }
?>

<table width='600'>
<tr>
<td>Op 1: <input type="checkbox" name="opgave[]" checked="<?php echo "$chked[1]"; ?>" ></td>
<td>Op 2: <input type="checkbox" name="opgave[]" checked="<?php echo "$chked[2]"; ?>" ></td>   
<td>Op 3: <input type="checkbox" name="opgave[]" checked="<?php echo "$chked[3]"; ?>" ></td>   
</tr>
<tr>
<td>Op 4: <input type="checkbox" name="opgave[]" checked="<?php echo "$chked[4]"; ?>" ></td>
<td>Op 5: <input type="checkbox" name="opgave[]" checked="<?php echo "$chked[5]"; ?>" ></td>
<td>Op 6: <input type="checkbox" name="opgave[]" checked="<?php echo "$chked[6]"; ?>" ></td>
</tr>
</table>
Avatar billede vagnk Juniormester
01. maj 2012 - 04:07 #20
Tilbage til #15, som ved et hurtigt kig ligner den jeg oprindeligt lagde ud med - bortset fra at den "kun" viser til-og-med "lgd".

Det er svagheden ved min løsning. Hvis $opg=31 får man 5 <INPUT> og hvis $opg=3 får man 2 <INPUT>. Men man kan heller ikke få det hele på en gang.

Uden at jeg helt skal overtage din kodning er løsningen at lægge disse par linjer ind foran loopet:
$maxlgd = 6;
$bin = str_pad(decbin($opg), $maxlgd, "0", STR_PAD_LEFT);

Og tag lige for en anden gangs skyld at kigge på de to funktioner i http://www.php.net/manual/en/
Avatar billede Calle5463 Forsker
01. maj 2012 - 08:41 #21
#20
Det er en lidt "kønnere" måde at gøre det på, i stedet for mit lidt low-tech kvik-fix
Avatar billede vagnk Juniormester
01. maj 2012 - 09:41 #22
Den sidste med at sætte dem op i 3 kolonner, kan du sagtens selv klare.

Ideen med at bruge binære værdier er rigtig smart og kan bruges hvis man f.eks. skal tildele forskellige privilegier til brugere. Hvis man er bestyrelsesmedlem er man osse medlem og hvis man er gruppe administrator er man osse medlem af gruppen. Den kunne jeg godt have brugt for et par år siden, hvor jeg lavede noget "olebole" eller "ronols" garanteret ville klappe sig på lårene af grin over.
Avatar billede Calle5463 Forsker
01. maj 2012 - 10:18 #23
#22: layoutet er til at klare, dog kæmper jeg fortsat med at få checkboxene til at vise korrekt - lige nu er der sat flueben i alle uanset den binære værdi...


.... vender tilbage om 1 times tid
Avatar billede Calle5463 Forsker
01. maj 2012 - 13:35 #24
Det her virker:

$result=mysql_query("SELECT * FROM tjekbox WHERE sagnr=$sagnr");
$post=mysql_fetch_array($result);
   
$maxlgd = 6;
$bin = str_pad(decbin($post['opgave']), $maxlgd, "0", STR_PAD_LEFT);
$lgd = strlen($bin); //hvad nr har første ciffer, 0 eller 1?

$t=$lgd-1;
for($i=$t; $i >= 0; $i--){  // Køres baglæns men vises forlæns
    $nr=$lgd-$i;
    if($bin[$i] > 0) {$chked[$nr]="checked"; } else { $chked[$nr]="unchecked"; }
}

echo "<table width='600'>";
echo "    <tr>";
echo "        <td>Opgave 1: <input type='checkbox' name='opgave[]' $chked[1] ></td>";
echo "        <td>Opgave 2: <input type='checkbox' name='opgave[]' $chked[2] ></td>";   
echo "        <td>Opgave 3: <input type='checkbox' name='opgave[]' $chked[3] ></td>";
echo "    </tr>";
echo "    <tr>";
echo "        <td>Opgave 4: <input type='checkbox' name='opgave[]' $chked[4] ></td>";
echo "        <td>Opgave 5: <input type='checkbox' name='opgave[]' $chked[5] ></td>";
echo "        <td>Opgave 6: <input type='checkbox' name='opgave[]' $chked[6] ></td>";
echo "    </tr>";
echo "</table>";
?>

vagnk, læg et svar, du var den mest vedholdende og den der fik mig i gang med logikken
Avatar billede vagnk Juniormester
02. maj 2012 - 09:30 #25
Godt du kom igennem
Vagn
Avatar billede Calle5463 Forsker
02. maj 2012 - 09:37 #26
Ja, nu skal jeg bare have det implementeret i mit sagsstyring .... :-)
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