Avatar billede quercus Nybegynder
28. maj 2008 - 10:50 Der er 15 kommentarer og
1 løsning

name vs. id i HTML form og hent værdi

Hey!
Jeg har en for-løkke der henter nogle værdier i en database. For hvert nummer i DB, sættes en input checkbox til enten on eller off.
Det kunne se ud som følger:
if (preg_match('/1/',.....){
echo '<input type="checkbox" name="logstatus[]" id="' . $values[0] . '" checked>';
} else {
echo '<input type="checkbox" name="logstatus[]" id="' . $values[0] . '">';
}

$values[0] vil udskrive et nummer, f.eks. 80102030.

Jeg får derfor et antal rækker med numre, hvor en checkbox er enten sat eller ikke sat og hvor name=logstatus[] og id=80102030.

I en anden forløkke vil jeg så gerne ved submit af form, update logstatus for hvert id.

if($_POST['form_action']=="update_numbers"){
foreach ($_POST['logstatus'] as $key => $value) {
  // For test, udskriv
  echo "key: $key; Value: $value<br>";
  // Gør noget
  update_logstatus($number,$logstatus)
}                   
}

Mit spørgsmål er så, hvordan får jeg fat i id= ?

Jeg ønsker altså, at min funktion for hvert nummer f.eks. 80102030 updater med værdien fra checkboxen fra logstatus.

Er det fremgangsmåden eller hvordan?

Quercus
Avatar billede erikjacobsen Ekspert
28. maj 2008 - 11:01 #1
Alle dine id-er skal være indbyrdes forskellige. Du skal nok sørge for de ikke begynder med et ciffer (kald dem bare id="x80102030")

Kender du id-et bruger du document.getElementById-funktionen

Kender du ikke id-et, kan du løbe en række tags igennem med document.getElementByTagName, her "input", og se på id for hver.
Avatar billede erikjacobsen Ekspert
28. maj 2008 - 11:02 #2
Men det er så i Javascript i browseren, du kan se det id. Skal du se det på serveren, skal du putte det i value-attributten.
Avatar billede sylvesternielsen Nybegynder
28. maj 2008 - 11:06 #3
Du kan blot navnegive dine name="logstatus[]" tags. Så burde du få ønsket resultat. :-)

echo '<input type="checkbox" name="logstatus['. $values[0] .']" id="' . $values[0] . '">';

Din $key variabel burde så indeholde samme værdi som i dit id= tag.
Avatar billede quercus Nybegynder
28. maj 2008 - 11:37 #4
Uha, helst ikke noget med for meget java-script :-)

Sylvester: Simpelt og lige hvad jeg skulle bruge! Hvorfor havde jeg dog ikke tænkt på det?! :-)
Så skal jeg bare lige have skrevet funktionen og kalde den for hvert gennemløb. Lækkert!

Smider du lige et "svar" :-)
Avatar billede sylvesternielsen Nybegynder
28. maj 2008 - 11:41 #5
Det kan du tro. =)
Avatar billede quercus Nybegynder
28. maj 2008 - 13:26 #6
Hmmm... hvorfor løber min foreach ($_POST['logstatus'] as $key => $value) ikke de checkbox igennem, der ikke er sat?
Det bevirker, at min funktion ikke køres, på de checkbox hvor jeg fjerne flueben?

if($_POST['form_action']=="update_numbers"){
foreach ($_POST['logstatus'] as $key => $value) {
  $hgmnum = $key;
 
  if (preg_match('/on/', $value)){
  $logstatus = 1;
  } else {
  $logstatus = 0;
  }
  // TEST
  echo " hgnum: ".$hgmnum;
  echo " logstatus: ".$logstatus."<br>";

  myFunction($hgmnum,$logstatus);

}
}
Avatar billede olebole Juniormester
28. maj 2008 - 13:52 #7
<ole>

"Det bevirker, at min funktion ikke køres, på de checkbox hvor jeg fjerne flueben" >> Præcis! Det er sådan checkbox'e skal fungere. Alt virker altså, som det skal. Er det ikke brugbart for dig, er det nok din struktur og dit elementvalg, du skal se på  ;o)

/mvh
</bole>
Avatar billede erikjacobsen Ekspert
28. maj 2008 - 13:53 #8
Og det Ole mener, men det er nu aldrig til at vide, er at du fx kunne bruge to radioknapper, ja/nej, for hver checkbox du har nu. Så vil de komme med over hver gang.

Alternativt kan du måske udtrække de manglende numre et andet sted fra.
Avatar billede sylvesternielsen Nybegynder
28. maj 2008 - 14:11 #9
Jeg ville som erik skriver, gemme alle numrene. Eventuelt i en session, eller i en hidden input box.

I din foreach fjerner du de keys du opdaterer fra dit array og laver til sidst en sql som opdaterer de resterende elementer.

F.eks. kan din SQL se sådan ud:
$sql = "UPDATE `table` SET `data`='off' WHERE `number` NOT IN(". implode(",", $numbers) .")";

Her er de resterende numre i et array som hedder $numbers.
Avatar billede quercus Nybegynder
30. maj 2008 - 10:18 #10
Hey!

Klart! har forstået at checkbox fungere sådan med $_POST :-)
Vil bare så gerne bruge dem, som man bruger dem i et program. Radiobuttons i web-siden med ja/nej, ser ikke så pænt ud når man har 50 rækker :-(

Burde starte en ny tråd :-)

Det der med hidden input og session lyder interessant! :-)
Nevermind the SQL... Det er noget CGI jeg sammen med Curl afvikler og updater. Og det fungere altså fint med at "slå til", men ikke "slå fra".

Så jeg henter status i DB og skriver ud:
echo '<input type="checkbox" name="logstatus['. $values[0] .']" id="' . $values[0] . '" checked>';
echo '<input type="hidden" name="h_logstatus['. $values[0] .']" id="' . $values[0] . '" value="1">';

Og hvad så? Noget java-script hajs, der onClick updater value i hidden field? Og så løber jeg mine h_logstatus[] igennem i forløkke og sætter ind i DB?
Avatar billede sylvesternielsen Nybegynder
30. maj 2008 - 10:45 #11
Det kunne sagtens lade sig gøre. Det ville være en simpel løsning ihvert fald. =)
Avatar billede quercus Nybegynder
30. maj 2008 - 13:38 #12
Men er ikke så stiv i java-script :-)

                                              echo '<input type="checkbox" name="logstatus['.$values[0].']" id="'. $values[0] .'" onClick="java script:frm_hg_members.logstatus['.$values[0].'].value=frm_hg_members.h_logstatus['. $values[0] .'].unchecked;">';
                                              echo '<input type="text" name="h_logstatus['. $values[0] .']" id="'. $values[0] .'" value="">';

Vil gerne lave en toggle knap der updater value i h_logstatus. Så kan jeg med min for-løkke rende dem igennem. Men får fejl?

Error:'frm_hg_members.logstatus.11223344' is null or not an object

Hvad gør jeg galt?
Avatar billede sylvesternielsen Nybegynder
30. maj 2008 - 14:45 #13
Som det første, så skal alle id= tags være unikke. Hvilket betyder at du ikke må bruge værdien i både den checkbox og input box.

Som det andet, så lav en javascript funktion..

Noget ala. denne funktion. Den forventer 1 parameter, som i dette tilfælde er id'et på  feltet.

<script type="text/javascript">
function updateHidden(fieldId){
    var checkboxField = document.getElementById(fieldId);
    var hiddenField = document.getElementById('h'+ fieldId);
    (checkboxField.checked == true?hiddenField.value = "y":hiddenField.value = "n");
}
</script>

Når du laver din PHP skal du prefixe dit hidden field id med h, da javascriptet forventer dette.

echo '<input type="checkbox" name="logstatus['.$values[0].']" id="'. $values[0] .'" onClick="updateHidden(\''. $values[0] .')\'">';
echo '<input type="text" name="h_logstatus['. $values[0] .']" id="h'. $values[0] .'" value="">';
Avatar billede olebole Juniormester
02. juni 2008 - 01:14 #14
sylvesternielsen >> Du har da vist rod i dine gåseøjne  ;o)

En anden metode kunne være:

<script type="text/javascript">
function setChecks(oF) {
    var aElms = oF.elements;
    for (var i=0,j=aElms.length; i<j; i++) {
        if (aElms[i].type=="checkbox" && !aElms[i].checked) {
            aElms[i].checked = true;
            aElms[i].value = "false";
        }
    }
}
</script>

<form .......... onsubmit="setChecks(this)">

- men det kræver, at dine checkboxe ikke som udgangspunkt kan have en boolsk værdi  =)
Avatar billede erikjacobsen Ekspert
02. juni 2008 - 08:50 #15
Sådan må du da ikke bruge onsubmit, Ole. Prøv lige igen, du...
Avatar billede quercus Nybegynder
02. juni 2008 - 10:45 #16
Hey!

Kunne ikke rigtig lige få det til at virke, men fandt frem til denne løsning:

function updateLogStatus(checkbox_logstatus,hidden_logstatus) {
    field = document.getElementById(hidden_logstatus);
    field.value = checkbox_logstatus;
}



foreach ($_POST['h_logstatus'] as $key => $value) {
  GØR NOGET... ;-)
}


                                          if (preg_match('/1/', $values[3])) {
  echo '<input type="checkbox" name="logstatus" onClick="updateLogStatus(this.checked,\''.$values[0].'\');" checked>';
  echo '<input type="hidden" name="h_logstatus['.$values[0].']" id="'.$values[0].'" value="true">';
} else {
  echo '<input type="checkbox" name="logstatus" onClick="updateLogStatus(this.checked,\''.$values[0].'\');">';
  echo '<input type="hidden" name="h_logstatus['.$values[0].']" id="'.$values[0].'" value="false">';

Tusind tak for hjælpen alle! Burde næsten oprette en ren point tråd :-)
                                          }
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