Archief - meerdere checkboxen op formulier

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

DiTn

Legacy Member
Ik heb een formulier gemaakt waarbij enkele gegevens kunnen aangevinkt worden.
Ik had deze op één lijn, of tenminste gegroepeerd in het uiteindelijk mailformulier als resultaat gezien.

Code:
<input type="checkbox" name="donderdag[]" value="17-18u30">
      </div></td>
      <td width="50"><div align="center">
        <input type="checkbox" name="donderdag[]" value="18u30-20">
      </div></td>
      <td width="50"><div align="center">
        <input type="checkbox" name="donderdag[]" value="20-21u30">
      </div></td>
      <td width="50"><div align="center">
        <input type="checkbox" name="donderdag[]" value="21u30-23">
De volledige pagina kan je hier vinden


De php code is een kant en klaar script, gevonden op het net.

Code:
 <?php 
/* 
Script gemaakt door: Jordi Betting 
Script gemod    door: Bart  Reding 
*/ 
######################### 
#  Start Configuration  # 
######################### 

$sWebsitenaam = "www.tcdeschakel.be"; //vul hier de naam van jouw website in 

$sMail = "[email protected]"; //Het e-mailadres waarnaar de mail word gestuurd. Voor meerdere adressen, scheid de emailadressen met een comma. (je kan ook bv: $naarmail doen, dan moet je wel even dat form maken op je html pagina 
$bHTML = TRUE; //Bij TRUE word er een HTML-mail gestuurd. Bij FALSE een plain-text-mail 
$sOnderwerp = "Inschrijven"; //Vul hier een onderwerp in. Dit word het onderwerp wanneer er geen ondewerp is opgegeven of als $bOnderwerp op TRUE staat 
$bOnderwerp = FALSE; //TRUE als bovenstaand onderwerp altijd gebruikt zal worden. FALSE wordt er eerst gekeken of er een onderwerp in het formulier voor komt 

$bBedanktmail = TRUE; //Moet er een bedankt mailtje gestuurd worden aan die gene die verstuurde? (e-mail invoerveld is dan dus verplicht) 
 
$sBedanktfrom = "[email protected]"; //vanaf welk adres moet dit bedankmailtje vestuurd worden? 
$sBedanktsubj = "automatisch antwoord"; //dit is het ondewerp van het bedanktmailtje 

$bBedanktTxt = FALSE; //TRUE als onderstaande tekst als bedankje moet worden weergegeven, FALSE als er moet worden doorgestuurd naar de pagina welke hieronder is aangegeven 
$sBedanktTxt = "Uw inschrijving is verstuurd!"; //bedankt text 
$sBedanktURL = "http://www.tcdeschakel.be/bedankt_inschrijving.html"; //bedankt url 

######################### 
#   End Configuration   # 
######################### 

if (count($_POST) > 0) 
{ 
  //controleer of de $bHTML wel fatsoenlijk is ingesteld 
  if(!is_bool($bHTML)) 
  { 
    print("De configuratie is onjuist. Zorg dat je bij <font color=blue><i>$bHTML</i></font> een booleaanse waarde (TRUE of FALSE) hebt ingevuld. Letop: Hier moeten geen quotes ( \" of ') omheen!"); 
    exit; 
  } 
  $errors = array();//definieer arrray voor de errormeldingen 
  $aKeys = array_keys($_POST); //pak alle arraykeys in een arraytje 
  foreach($_POST as $key=>$value) 
  { 
    $_POST[$key] = trim($value); //maak alle waarden netjes 
  } 
  foreach($aKeys as $key=>$value) 
  { 
    $aKeys[$key]=strtolower($value);//maak alle waarden in kleine letters 
  } 
  
  $aMail = explode(",",$sMail); 
  $aDomein = explode("@",$sMail[0]);   
  $sDomein = $aMail[1];   
  $naam = $_POST["naam"];
    
  //mail detectie 
      if (in_array("mail",$aKeys)) { $sFrom = $_POST['mail']; } 
  elseif (in_array("email",$aKeys)) { $sFrom = $_POST['email']; } 
  elseif (in_array("e-mail",$aKeys)) { $sFrom = $_POST['e-mail']; } 
  elseif (in_array("1mail",$aKeys)) { $sFrom = $_POST['1mail']; } 
  elseif (in_array("1email",$aKeys)) { $sFrom = $_POST['1email']; } 
  elseif (in_array("1e-mail",$aKeys)) { $sFrom = $_POST['1e-mail']; } 
  else     
  {   
    $sFrom = "[email protected]"; 
    $bBedanktmail = TRUE; 
  } 
    
  if ($bOnderwerp) 
  { 
    $sSubject = $sOnderwerp; 
  } 
  else 
  { 
        if (in_array("onderwerp",$aKeys)) { $sSubject = $_POST['onderwerp']; } 
    elseif (in_array("subject",$aKeys)) { $sSubject = $_POST['subject']; } 
    elseif (in_array("1onderwerp",$aKeys)) { $sSubject = $_POST['1onderwerp']; } 
    elseif (in_array("1subject",$aKeys)) { $sSubject = $_POST['1subject']; } 
    else { $sSubject = $sOnderwerp; } 
  } 
    
  //check alle verplichte velden 
  foreach($_POST AS $key => $value) 
  { 
    if(substr($key,0,1) == 1) 
    { 
      if (empty($_POST[$key])) 
      { 
        $name = substr($key,1); 
        $error[] = "Het veld <i>'".$name."'</i> is verplicht en moet worden ingevuld."; 
      } 
    } 
  } 
    
  //als er een error was 
  if (isset($error) && count($error) > 0) 
  { 
    //poep alle errors uit 
    print("<ul style=\"list-style: none; color: red;\">\n"); 
    foreach($error as $value) 
    { 
      print("\t<li>".$value."</li>\n"); 
    } 
    print("</ul>"); 
  } 
  else 
  { 
    $headers  = "MIME-Version: 1.0\n";   
    $headers .= "From: ".$naam." <".$sFrom.">\n"; 
    $headers .= "Reply-to: ".$naam." <".$sFrom.">\n"; 
    $headers .= ($bHTML) ? "Content-Type: text/html; charset=iso-8859-1\n" : "Content-Type: text/plain; charset=iso-8859-1\n"; 

    $headers2  = "MIME-Version: 1.0\n";   
    $headers2 .= "From: ".$sBedanktfrom." <".$sBedanktfrom.">\n"; 
    $headers2 .= "Reply-to: ".$naam." <[email protected]>\n"; 
    $headers2 .= ($bHTML) ? "Content-Type: text/html; charset=iso-8859-1\n" : "Content-Type: text/plain; charset=iso-8859-1\n";
	  
    $sContent = ""; 
    foreach($_POST as $key => $value) 
    { 
      if (substr($key,0,1) == 1) { $key = substr($key,1); } 
      $sContent .= ucfirst(strtolower($key)).": ".$value."\n\n"; 
    } 
      
    $enter = " 
"; 
    $sContent = ($bHTML) ? nl2br(htmlspecialchars($sContent)) : str_replace("\n",$enter,$sContent) ; 
      
    foreach ($aMail as $sMailAdress) 
    { 
      mail(trim($sMailAdress),$sSubject,$sContent,$headers);    
    }   
    $sBedanktmail = "Beste ".$naam.",

Bedankt voor uw inschrijving. Het werd aan de tornooileiding doorgestuurd.
Gelieve niet te reageren op deze mail.


mvg,
TC de Schakel"; //de tekst van het bedank mailtje
	  
    if ($bBedanktmail) 
    { 
      $sBedanktmail = ($bHTML) ? nl2br(htmlspecialchars($sBedanktmail)) : str_replace("\n",$enter,$sBedanktmail) ; 
       mail($sFrom,$sBedanktsubj,$sBedanktmail,$headers2); 
    }   
         

                 
    if (isset($bBedanktTxt) && $bBedanktTxt == TRUE) 
    {              
      print($sBedanktTxt); 
    } 
    else 
    { 
      ob_clean(); 
      header("location: $sBedanktURL"); 
      print('<meta http-equiv=refresh content="0; url='.$sBedanktURL.'">'); 
    } 
  } 
} 
else 
{ 
  print("<form action=\"".$_SERVER['REQUEST_URI']."\" METHOD=\"POST\">\n"); ?> 
<!-- Zet hieronder je formulier neer -->

Als ik het goed begrijp, moet ik dus een array maken van de checkboxen
In bovenstaande code staat deze regel
Code:
  $aKeys = array_keys($_POST); //pak alle arraykeys in een arraytje
Heeft deze daarmee dan te maken?

Ik heb het script al uitgebreid met stukjes code, maar geen enkel werkt.

Iemand een oplossing hiervoor?

De Wouter

Legacy Member
Je hebt overal hetzelfde 'name' attribuut maar met verschillende waardes. $_POST["donderdag[]"] kan maar 1 value hebben zou ik denken? Je stuurt normaal enkel Strings door met POST, er objecten en arrays e.d. van maken moet je zelf doen.

Probeer eens print_r($_POST); als je formulier verstuurt om te kijken wat je effectief aankrijgt op de server.

Tyfius

Legacy Member
De invulling van het name attribuut is goed. Dat moet een array zijn. In je $_POST array zal dit dan een sub-array zijn.

Bijvoorbeeld:

PHP:
<?php

foreach ($_POST['donderdag'] as $donderdag) {
  print $donderdag;
}

Nu, array_keys haalt alle keys van je $_POST op. Voor jouw situatie heeft dat geen belang.

Wat echter wel een probleem kan opleveren is de trim() die er onder gebeurd. Het script gaat er namelijk van uit dat alle values in de $_POST van het type string zijn, en dat is niet het geval. De donderdag value is een array. Daar ga je normaal een warning op krijgen, maar verder niets meer. Je gaat echter wel zelf die array moeten verwerken, zoals ik in bovenstaand stukje code gedemonstreerd heb.

dJeez

Legacy Member
De Wouter zei:
Je hebt overal hetzelfde 'name' attribuut maar met verschillende waardes. $_POST["donderdag[]"] kan maar 1 value hebben zou ik denken?
Je zou dat denken, maar dat is een handigheidje in PHP om direct een array binnen te krijgen. Alleen moet je die dan wel uitlezen zonder de array marker(s), dus via $_POST['donderdag'] in je voorbeeld.

Maar de issue is niet zozeer de array_keys call, die geeft nl. - zoals de naam van de functie al impliceert - gewoon de keys van de array terug (dus in dit geval een array met alle veldnamen). Wat echter veel schadelijker is, zijn de foreach lussen die er op volgen (en dan zeker het trimmen van de waardes in $_POST). Dat gaat sowieso problemen opleveren als je daar een array aan doorgeeft (conversie naar de string "Array()" en byebye origineel geposte data).

Conclusie : *nooit* de originele waarden in $_POST aanpassen (dat is sowieso bad practice), maar de "opgekuiste" waardes desnoods tijdelijk in een andere array steken (of beter de hele logica van het sanitizen in 1 functie zetten - of per type van veld uiteraard, afhankelijk van de use case - en die gebruiken als je de veldwaardes effectief gaat gebruiken in je script).

En dus beter ook niet zomaar klakkeloos random scripts liggen gebruiken, maar eerst de basis begrijpen alvorens je dingen online zet... Dit is echt geen rocket science, je moet er gewoon wat tijd en moeite in steken om het aan te leren. En dat kan je perfect offline.

Ofwel ga je de easy way (nu ja, die instapdrempel ligt wel hoger dan plain old PHP), en gebruik je een framework dat alle lastigheidjes al voor jou oplost, zodat je je kan concentreren op jouw probleem (een mailtje samenstellen en versturen van geposte data) en al de rest (afhandeling van de geposte data, valideren, het formulier tonen, ...) kan overlaten aan het framework in kwestie...

DiTn

Legacy Member
Tyfius zei:
De invulling van het name attribuut is goed. Dat moet een array zijn. In je $_POST array zal dit dan een sub-array zijn.

Bijvoorbeeld:

PHP:
<?php

foreach ($_POST['donderdag'] as $donderdag) {
  print $donderdag;
}

Nu, array_keys haalt alle keys van je $_POST op. Voor jouw situatie heeft dat geen belang.

Wat echter wel een probleem kan opleveren is de trim() die er onder gebeurd. Het script gaat er namelijk van uit dat alle values in de $_POST van het type string zijn, en dat is niet het geval. De donderdag value is een array. Daar ga je normaal een warning op krijgen, maar verder niets meer. Je gaat echter wel zelf die array moeten verwerken, zoals ik in bovenstaand stukje code gedemonstreerd heb.

Maar dat stukje code kan ik dus niet gewoon in de oorspronkelijke code plakken. Ik heb al verschillende varianten hierop geprobeerd, maar steeds is het resultaat niet juist. Er word geen enkele value weergegeven.
Of moet dat stukje code op een specifieke plaats staan?

En dus beter ook niet zomaar klakkeloos random scripts liggen gebruiken, maar eerst de basis begrijpen alvorens je dingen online zet... Dit is echt geen rocket science, je moet er gewoon wat tijd en moeite in steken om het aan te leren. En dat kan je perfect offline.
Dat is nu juist de reden dat ik een bestaand script gebruik. Ik vind gewoon de tijd niet om me erin te verdiepen. Eerlijk gezegd, denk ik niet dat ik er veel succes mee zou hebben ook. De site is gemaakt met een boek over dreamweaver naast mij en van daaruit heb ik dan wel nog één en ander aangepast, maar ook zaken die te vinden zijn op het net.
Het script gebruik ik nu al 2 jaar zonder problemen, het is enkel nu met die 'array' dat ik problemen ondervind.

dJeez

Legacy Member
DiTn zei:
Dat is nu juist de reden dat ik een bestaand script gebruik. Ik vind gewoon de tijd niet om me erin te verdiepen. Eerlijk gezegd, denk ik niet dat ik er veel succes mee zou hebben ook. De site is gemaakt met een boek over dreamweaver naast mij en van daaruit heb ik dan wel nog één en ander aangepast, maar ook zaken die te vinden zijn op het net.
Dan doe je het dus beter niet en zou je eerder voor een CMS moeten kiezen dat kan doen wat je wil. Drupal met de Webform module kan je ook als leek perfect instellen, en is - mits je de security updates installeert - een pak minder gevaarlijk.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan