php formulier met controle

Status
Niet open voor verdere reacties.

Fredemel

Gebruiker
Lid geworden
2 jun 2008
Berichten
114
Kan iemand mij hetlpen met dit php-vraagstuk?

Onderstaand heb ik ooit gebruikt voor een formulier in een pure-HTML/css website (deze bestaat niet meer).
Maar tegenwoordig is deze code onveilig en nu zoek ik én een (simpele) beveiliging (chapta..!) én een controle op "leeg gelaten" velden én code voor een juiste veld-invulling (emailadres, "foute" tekst) en... wat je als expert adviseert.... ;-)

In deze code zit een "loop" voor het aantal velden. Werkelijk (toen!) formidabel, vond/vind ik...
PHP:
<?PHP 
/* $to = "lexSpee@..??..";  */
$to = "mijnmailadres@ziggo.nl"; 
$subject = "Bericht via mijn website";
$headers = "Van: Mijn Mailformulier";
$forward = 0;
$location = "https://www.mijnwebsite.nl/bevestigingMail.html";

$date = date ("l, F jS, Y"); 
$time = date ("h:i A"); 



$msg = "Hieronder de gegevens van het verzonden formulier. Het is verzonden op $date at $time.\n\n"; 

if ($_SERVER['REQUEST_METHOD'] == "POST") {
	foreach ($_POST as $key => $value) { 
		$msg .= ucfirst ($key) ." : ". $value . "\n"; 
	}
}
else {
	foreach ($_GET as $key => $value) { 
		$msg .= ucfirst ($key) ." : ". $value . "\n"; 
	}
}

mail($to, $subject, $msg, $headers); 

if ($forward == 1) { 
    header ("Location:$location"); 
} 
else { 
    header ("Location:https://www.mijnwebsite.nl/foueMail.html");
} 

?>

Wie kan me helpen/adviseren... of.... met een betere oplossing komen...?

Bij voorbaat DANK.... namens een stichting die ik help........

Fred
 
Laatst bewerkt:
Recaptcha is niet gebruiksvriendelijk , het net als een cookiewall die chantage pleegt met toelatingen van externe bronnen.

Je vraagt ook niet iemand naakt over straat te lopen , je gaat ook digitaal geen lekken maken die niet nodig zijn.

recaptcha zegt aan hackers alleen dat uw site niet veilig gemaakt is en het binnendringen gemakkelijk zal verlopen.

stel je kijkt naar onderstaande code :
enkele validatiefuncties
PHP:
<?php
function check_input($data){
    $data = trim($data);
    $data = stripslashes($data);
    $data = htmlspecialchars($data);
    return $data;
}
function logicValidation($fieldtype , $value, &$errortxt=''){//LET OP HET & teken by reference gekend bij de beter programmeur.
    switch($fieldtype){
        case 'name':
          return (preg_match("/^[A-Za-z-' ]*$/",$value));break;
        case 'Gebruikersnaam':
          return (preg_match('/^[a-zA-Z0-9_]+$/',$value)||!($errortxt='Een Gebruikersnaam mag enkel kleine/grote letters getallen en/of _bevatten .'));break;
        case 'psw':
          return (strlen($value)>6||!($errortxt='Uw wachtwoord moet minimaal 6 karakters bevatten.'));break;
        case 'Email':
        case 'email':
          return (filter_var($value, FILTER_VALIDATE_EMAIL)||!($errortxt='Een email moet een @ en er na een . bevatten.'));
          break;
        case 'city':
          return (preg_match('/\w/',$value));  break;
        case 'state':
          return (preg_match('/\w/',$value));  break;
        case 'zip':
          return (preg_match('/^[0-9]{4}$/',$value)||!($errortxt='Een postcode moet 4 getallen bevatten.'));   break;
        case 'cardnr':
          return (preg_match('/^[0-9]{4}\-[0-9]{4}\-[0-9]{4}\-[0-9]{4}$/',$value)||!($errortxt='De Gegeven waarde zal volgens deze format ####-####-####-#### ingegeven dienen te worden.'));
          break;
        case 'cardname':
          return (preg_match('/^[A-Za-z]*$/',$value));   break;
        case 'expmonth':
          return (preg_match('/^[A-Za-z]*$/',$value)||!($errortxt='Moet voluit geschreven worden .'));   break;
        case 'expyear':
          return (preg_match('/^[0-9]{4}$/',$value)||!($errortxt='Moet vier cijfers bevaten .'));    break;
        case 'cvv':
          return (preg_match('/^[0-9]{3}$/',$value));    break;
        default:
          return true;
        }
  }
standaart checks van form
PHP:
function checkform($fields,$fieldsEmptyOrOk,&$formdata,&$formcontentok,&$err,&$formok){
    showinsideinfo('CHECK INPUT');
    foreach($fields as $fieldname){
        if(!array_key_exists($fieldname,$_POST)){
            $formok=false;
        }else{
            if(empty($_POST[$fieldname])){
                $err[$fieldname][]= 'De '.$fieldname.' mag net niet leeg zijn';
                $formcontentok = $formcontentok && in_array($fieldname,$fieldsEmptyOrOk);
            }else{
                $errortxt='Het veld voldoet niet aan de controle';
                if(!logicValidation($fieldname , check_input($_POST[$fieldname]),$errortxt)){
                  $err[$fieldname][]= $errortxt;
                  $formcontentok = false;
                }else{
                  $formdata[$fieldname]=check_input($_POST[$fieldname]);
                }
            }
        }
    }
  }
function showfielderror($fieldname,$err){
    if(array_key_exists($fieldname,$err)){
        print '<span class="error" >'.implode('\n',$err[$fieldname]).'</span>';
    }
}
function showvalue($fieldname,&$formdata){
      return (array_key_exists($fieldname, $formdata))?$formdata[$fieldname]:'';
}
function showinsideinfo($info,$ok=true){
      if(true==true){
        print'<div class="'.(($ok)?'OK':'error').'" >'.$info.'</div>';
      }
}
?>

en hieronder een sample hoe je het kan bebruiken door fields die binnen komen aan te passen
en door de fields die empty mogen zijn aan te geven en vervolgens te controleren

indien er iets wijzigt moet je de functies "validatie controle" aanpassen en door het gebruik van includes zou je het over de volledige site kunnen gebruiken.
PHP:
$fields=['answer','question_id'];
		$fieldsEmptyOrOk=[];
		$err = [];
		$formok= true;
		$formcontentok= true;
		$formdata =[]; 
			if(key_exists('pollanswersended',$_POST)){
                showinsideinfo('antwoord verzonden :',false);
				foreach($fields as $fieldname){
					if(!array_key_exists($fieldname,$_POST)){
						//print$fieldname;
						$formok=false;
					}else{
						if(empty($_POST[$fieldname])){
							$err[$fieldname][]= 'De '.$fieldname.' mag net niet leeg zijn';
							$formcontentok = in_array($fieldname,$fieldsEmptyOrOk);
						}else{
							$errortxt='Het veld voldoet niet aan de controle';
							if(!logicValidation($fieldname , check_input($_POST[$fieldname]),$errortxt)){
							  $err[$fieldname][]= $errortxt;
							  $formcontentok = false;
							}else{
							  $formdata[$fieldname]=check_input($_POST[$fieldname]);
							}
						}
					}
				}
                function saveanswers($tblAnswers,$conn,$data){
                    if(in_array('id',$data)&&$data['id']>0){
                        $sql = "UPDATE `'.$tblAnswers.'` SET `answer`='".$data['answer']."' WHERE id=".$data['id'];
                    }else{
                        $sql = 'INSERT INTO `'.$tblAnswers.'`(`id`,`answer`,`question_id`) '."VALUES(NULL, '".$data['answer']."', ".$data['question_id'].")";
                    } 
                    print $sql;
                    print mysqli_error($conn);
                    $ret = $conn->query($sql);
                    header('location: ./?Polls&Summary');
                    return $ret;
                }
				if($formok && $formcontentok){ // SAVE DATA
					if(in_array('id',$_POST)){
						if(is_numeric($_POST['id'])){
							$formdata['id']=$_POST['id'];
						}
					}else{
						saveanswers($tblAnswers,$conn,$formdata);	
					}
			   }else{
					print '<span class="error">Input kan niet opgeslagen worden door: aangeduide fouten formulier'.(($formok)?'[ok]':'[nok]').'content'.(($formcontentok)?'[ok]':'[nok]').'</span><br><br>';
			   }
 
Laatst bewerkt:
Recaptcha is niet gebruiksvriendelijk , het net als een cookiewall die chantage pleegt met toelatingen van externe bronnen.

Niet mee eens. Ik zie nergens een chantage.
Enige is dat je gebruik maakt van een externe partij, maar je deelt er verder niks spannends extra's mee. Maar er wordt zoveel extern gebruikt.
Of ga je ook klagen als iemand de Bootstrap CDN gebruikt?

En kan je je script ook wat kleiner maken? Ik lees niks over poll's van de topicstarter.
Geef a.u.b. relevante code, wat al vaker gezegd is :).

@kenikanbis: Als je nog een makkelijkere formulierafhandeling zoekt:
https://github.com/SandroMiguel/verum-php

Thanks to me voor de Nederlandse vertaling. Vlaams mag jezelf doen als je wilt. :p
 
Laatst bewerkt:
@kenikavanbis Het is geen antwoord op de vraag van TS.
Vraagje aan jou, hoe verstuur je berichtje 3 als je geen internet provider hebt?
 
Laatst bewerkt:
@kenikavanbis Het is geen antwoord op de vraag van TS.
Vraagje aan jou, hoe verstuur je berichtje 3 als je geen internet provider hebt?

Bedoel je zijn IP-adres die hij hier gebruikt? (die ik uiteraard niet zie).
Kan je dat niet uit Ripe.net opmaken dan?
 
Ik bedoel dat z'n provider alles aan hackers en google en rusland en microsoft en de overheid doorgeeft :p :p

Dat zeggen ze op facebook :d
 
@kenikavanbis Het is geen antwoord op de vraag van TS.
Vraagje aan jou, hoe verstuur je berichtje 3 als je geen internet provider hebt?
Das een goede vraag , het andwoord is topsecret ;)

Waarom een poll script, ik had een simpeler voorbeeldje van een poll script op de plank liggen ergens onder het stof.
En het is een forum geen opdrachtgever die een kant en klaartje koopt dus ik ga ervanuit dat hij er wel iets van leert als hij het bekijkt en de functies gewoon kan copyeren en gebruiken . Als je op internet een sample ziet ga je ook niet zeggen het is net niet wat ik wil kan je een beter voorbeeld op de samplesite zetten. En daarom heb ik er sample bij gezet.
Ik zie wel als de ts (topicstarter met een vraag komt het nader uit te leggen)

ps . Aan het exponentieel verloop van de download van mijn cms lijkt mij dat mensen mijn scripts nog niet zo slecht vinden en bovenstaand voorbeeld staat er los van.
 
Waarom een poll script, ik had een simpeler voorbeeldje van een poll script op de plank liggen ergens onder het stof.
En het is een forum geen opdrachtgever die een kant en klaartje koopt dus ik ga ervanuit dat hij er wel iets van leert als hij het bekijkt en de functies gewoon kan copyeren en gebruiken .

Nice try, maar als je je een beetje verdiept in de kennis van de TopicStarter (die blijkbaar weinig tot geen ervaring heeft) dan ga je toch geen hele lap niet-relevante code serveren? :shocked:
Daar leert diegene niks, nada en noppes van, en vooral omdat het ook nog niet eens gedocumenteerd is.

Zeg nu zelf: Iemand die zijn eerste dag met zijn opleiding tot automonteur gaat starten, die geef je toch ook niet meteen een hele motor mee met de opdracht om uit te zoeken hoe het werkt?
 
@kenikavanbis Lees eerst de vraag nog eens bij #1.
Het is geen poll, en er is geen database opslag gevraagd..
 
@aar Dat is zeer juist tegen iemand die antwoord zonder ook maar één regel code te schrijven,daar kan ik niet op.
Nu eerlijk het is basis en iets complexer als je een functie niet begrijpt wil niet zeggen dat je deze niet kan gebruiken.
Blackbox principe .
 
@aar Dat is zeer juist tegen iemand die antwoord zonder ook maar één regel code te schrijven,daar kan ik niet op.
Nu eerlijk het is basis en iets complexer als je een functie niet begrijpt wil niet zeggen dat je deze niet kan gebruiken.
Blackbox principe .
Zal je best kunnen vinden. Maar geef voortaan gewoon relevante code. Hier kan een beginner gewoon niets mee!
Ik denk eerder dat je iemand ermee wegjaagt, of demotiveert.
 
@Fredeme Lukt het met het linkje wat Aar gaf. Dat werkt goed.
Lees alle berichtjes die bij dat linkje eronder staan ook even om alles compleet te krijgen.
 
:(....
Ik heb wat los gemaakt zo te lezen....
Tja,.... PHP is een taal met ongelofelijk veel oplossingen...
In ieder geval bedankt voor de reactie.
Ik ben nog steeds bezig met de oplossing van Aar....
Duurt nog effe.... Ik kan een beetje code HTML5/CSS en daar houdt het een beetje op.
Javascript kan ik "lezen" en soms de logica er uit halen, maar PHP..... Pffff is een "vette kluif"...
Als ik er niet uitkom.... Wil ik weer GRAAG hulp van "Helpmij", jullie dus :) ....
En als ik er zelf uit kom, geef ik de link waarin het gebruikt gaat worden en.....
bedankt ik jullie voor de hulp aan mij! :thumb:

Zoals ik al schreef.... BEDANKT voor jullie reactie!!!
 
Laat maar weten of het wel of niet lukt. En als je ergens op vastloopt, laat maar weten waarop en wat je hebt gedaan.

Opsich is PHP qua stijl niet echt veel anders dan JavaScript. Het werkt verder met functies, en de logica in de opbouw is niet veel anders.
Wees blij ik het lekker procedureel houd, en dus niet in classes en objects :)
 
Besta Aar,

bedankt voor jouw hulp.... Ik kan alle (extra) velden laten controleren als ze leeg blijven. Mooi....!
Alleen......
1) Na eerste veld invoer en ik druk dan op "enter".... activeer je "submit"... da's minder....
> Hoe kan ik dat verplicht met de muis laten doen?
2) Als ik een foute postcode invoer is er geen foutcontrole
> Kan dat opgelost worden door bijv de opmaak: 4x cijfer,2 x letter te verplichten (Géén spatie)...
3) Geldt ook voor Telefoonnummer (min 10 cijfers)

Graag jouw hulp

O ja,... dit is de website (deels "under construction"...) https://www.stichting4en5meiweert.nl
 
Dit is antwoord op nr. 2
PHP:
if (preg_match("/^[0-9]{4}\s*[A-Z]{2}$/i", $_POST['postcode'])) {
    // postcode is ok
}

Verplicht 4 cijfers, dan 0 of meer spaties, dan verplicht 2 letters ( de /i aan het eind betekent hoofdletter ongevoelig ).

Vraag: al ik als telef.nr. wil invullen "012-3456789 toestel 12" of iets als "06 1234 5678 na 12 uur". Dit hoort te kunnen...
 
Laatst bewerkt:
1) Met welke reden?
3) kijk naar php.net/strlen
 
1) Na eerste veld invoer en ik druk dan op "enter".... activeer je "submit"... da's minder....
Voor zover ik weet is de TAB toets bedoeld om van veld naar veld te gaan, ook in andere programma's ;)
Een andere reden is dat de Enter toets goed moet werken in het "Bericht" veld.
 
Laatst bewerkt:
@Aar:
1) Als men per ongeluk de entertoets indruk, wordt submit geactiveerd.
Kan dat met een boulean tegen gehouden worden
Bijv: "Weet je zeker dat je het formulier wilt verzenden?"

3) Mag ik de code van "bron" veranderen in:
PHP:
if (preg_match("/^[0-9]{10}", $_POST['telefoonnummer'])) {
    // telefoonnummer is ok
} en....
WAAR moet ik dat tussenvoegen....???/

Ik ben erg geholpen met de oplossing Aar!!!

Het formulier werkt bijna 100%.
De RAW-gegevens zet ik in een excel doc met een macro om de
gegevens te filteren en in een excellijst te zetten d.m.v. 1 klik..
De belangrijkste formule is deze:
(De gegevens rechts vanaf de dubbele punt te filteren.
Code:
=ALS(A2="";"";DEEL(E2;VIND.SPEC(":";E2)+1;100))

Mvg Fred
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan