Avatar billede blackscorpion Nybegynder
15. august 2005 - 11:57 Der er 33 kommentarer og
3 løsninger

Validering af form input.

Hej Eksperter.

For noget tid tilbage lavede jeg en side for en kammi til brug i hans vikar firma.

har lige kigget databasen igennem, da jeg er ved at lave ny side til ham, og jeg har fundet ud af følgende:

1. Den lægger brugeren dobbelt ind ved hver tilmelding.

2. Nogle brugere klikker Submit flere gange.

3. nogle skriver ikke hele deres CPR nummer, og nogle skriver det med mellemrum og bindestreg. (har gjort brugeren opmærksom på at det skal være hele cpr nummeret uden bindestreg.

4. Selv om der er validering på, er det stadig lykkes nogle at sende tomme tilmeldinger.

5. Ikke alle felter bliver udfyldt som er krævet.

Dette er ting jeg så vidt muligt gerne vil have elimineret.

---------

3'eren er ret nem, det er bare at begrænse feltet til 10 tegn.
Men ved ikke helt hvordan jeg i php tjekker at der er skrevet 10 tegn ind.

5'eren er også ret nem.

---------

har tænkt mig at omskrive det hele, da tilmeldingen skal splittes op på flere siger, så er åben for forslag.
Avatar billede jakobdo Ekspert
15. august 2005 - 12:01 #1
I php kan du tjekke længden med strlen($tekst).
Og hvis du så vil have det til at være tal, kan du bruge:
if(preg_match('/\\d{10}/', $tekst))
{
echo "De er tal og vi har 10 og kun 10";
}
Avatar billede blackscorpion Nybegynder
15. august 2005 - 12:01 #2
okey det var 3'eren, tak for et hurtigt svar. ;)

nogle bud på de andre?
Avatar billede erikjacobsen Ekspert
15. august 2005 - 12:02 #3
Skal vi ikke lige gøre det korrekt:

if(preg_match('/^\d{10}$/', $tekst))
Avatar billede jakobdo Ekspert
15. august 2005 - 12:06 #4
Erik: Det gik lidt stærkt jo! :o)

BlackScorpion: For at løse resten skal vi se noget kode.
Avatar billede blackscorpion Nybegynder
15. august 2005 - 12:07 #5
jamen jeg genbruger ikke noget af den gamle kode.

Det er mere for at elimenere forkomsten af f.eks. dobbelt klik på submit, tomme tilmeldinger osv.
Avatar billede blackscorpion Nybegynder
15. august 2005 - 12:12 #6
men min gamle kode ser sådan her ud.

-----------

<?php

// Vigtige infos for at det hele virker. :)

$email_field_names = array(1 => "Cpr Nr", "Fornavn", "Efternavn", "Adresse", "Postnr & By", "Telefon", "Mobil", "Email", "Kørekort", "Disp. Bil", "Ønsket Arbejdstid", "Job Situation", "Job Ønske", "Forventet Løn i Fast Job", "Forventet Løn i Vikariat", "Til Rådighed Fra", "Medlem af A-Kasse", "Hvis Ja, Hvilken", "Evt. Opsigelsesvarsel", "Ryger", "Ren Straffeattest", "Registreret I Andre Bureauer", "Hvis Ja, Hvilke", "Evt. Bemærkninger");
$mysql_field_names = array(1 => "cprnr", "fornavn", "efternavn", "adresse", "postnr_by", "telefon", "mobil", "email", "kørekort", "bil", "arbejdstid", "job_situation", "job_ønske", "løn_fast", "løn_vikariat", "rådighed", "akasse", "ja_akasse", "opsigelse", "ryger", "straffeattest", "bureauer", "ja_bureauer", "bemærkninger");
$required_fields =  array(1 => "cprnr", "fornavn", "efternavn", "adresse", "portnr_by", "telefon",'', "email",'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'');

$filename = $_SERVER['REMOTE_ADDR']."_".time();

// LAD VÆRE MED AT PILLE VED NOGET SOM HELST UNDER HER!!

function check_required_fields() {
global $mysql_field_names, $required_fields, $email_field_names;
$n = 1;
$field_name = "";

foreach($_REQUEST as $key=>$val) {
  $req_key = $required_fields[$n];

  if($req_key) {
  if(!$val) {
    $field_name .= "Feltet " . $email_field_names[$n] . " er ikke udfyldt.<br \>\n";
  }
  }
  $n++;
}
return $field_name;
}

function email_msg() {
global $email_field_names;
$email_msg = "<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n";
$email_msg .= "<html>\n";
$email_msg .= "<head>\n";
$email_msg .= "<meta http-equiv=\"Content-Language\" content=\"da\">\n";
$email_msg .= "<title>Tilmeldning Til *****</title>\n";
$email_msg .= "</head>\n";
$email_msg .= "<center><img src='http://www.*****.dk/gfx/email_logo.jpg' alt='' border='0'></center>";
$email_msg .= "<table cellpadding='0' cellspacing='0' width='600' align='center' bgcolor='#EAEEF0' style='border: 1px solid black'>\n";
$n = 1;
$field_bgcolor = "C7D1DB";
  foreach($_REQUEST as $key=>$val) {

  if($email_field_names[$n] == "Evt. Bemærkninger") {
    $val = ereg_replace("\n","<br>\n", $val);
  }

    $email_msg .= "<tr bgcolor='".$field_bgcolor."'><td valign='top'>&nbsp;".$email_field_names[$n] . ":</td><td width='380' valign='top'>".$val."</td></tr>\n";
    $n++;

    if($field_bgcolor == "C7D1DB") {
    $field_bgcolor = "";
    }
    else {
    $field_bgcolor = "C7D1DB";
    }
  }
  $email_msg .= "</table>\n</body>\n</html>";
  return $email_msg;
}

function file_msg() {
global $mysql_field_names;
$file_msg = "";
$n = 1;
  foreach($_REQUEST as $key=>$val) {
  $file_msg .= $val . ";";
  $n++;
  }
  $file_msg = substr_replace($file_msg, '', -1);
  $file_msg .= "\n";

  return $file_msg;
}

function mysql_sql() {
global $mysql_field_names;
$n = 1;
$mysql_db_table = "sv_users";

$sql = "insert into $mysql_db_table SET ";

foreach($_REQUEST as $key=>$val) {

  $sql .= "`$mysql_field_names[$n]` = '" . $val . "', ";
    $n++;
}

$sql .= "`created` = '" . time() . "'";
return $sql;
}

function save_and_mail($file_msg, $email_msg, $mysql_sql) {
global $filename;

$handle = fopen("tmp/".$filename.".txt", "w"); // Opretter tmp filen.
fwrite($handle, $file_msg); // Skriver til temp filen.
fclose($handle);

$mail_file_stuff = "tmp/".$filename.".txt";
$full_name = $_REQUEST['Fornavn'] . " " . $_REQUEST['Efternavn'];

require("class.phpmailer.php");

$mail = new phpmailer();

$mail->From    = "*****";
$mail->FromName = "*****";
$mail->Host    = "*****";
$mail->Mailer  = "smtp";
$mail->ContentType  = "text/html";
$mail->Subject = "Tilmelding til *****";
$mail->Body    = $email_msg;

$modtager = "*****";

for($i = 1; $i <= 2; $i++) {

if($modtager == "*****")  {
  $mail->AddAddress("*****", "*****");
  $mail->AddAttachment($mail_file_stuff, "tilmeldning.txt", "base64", "application/octet-stream");
  $modtager = "1";
}
else {
  $mail->AddAddress($_REQUEST['E-mail'], "$full_name (".$_REQUEST['E-mail'].")");
}

  if(!$mail->Send())
    echo "There has been a mail error sending to " . $_REQUEST['E-mail'] . "<br>";

  // Clear all addresses and attachments for next loop
  $mail->ClearAddresses();
  $mail->ClearAttachments();
}

$mail->AddAddress($_REQUEST['email'], $full_name);

unlink("tmp/".$filename.".txt"); // Sletter temp filen.

$handle2 = fopen("admin/tmp_dl/brugere.txt", "a"); // Opretter tmp filen.
fwrite($handle2, $file_msg); // Skriver til temp filen.
fclose($handle2);

  if(!mysql_connect("localhost","*****","*****")) {
  echo mysql_error();
  exit;
  }

  if(!mysql_select_db("*****")) {
  echo mysql_error();
  exit;
}

if(!mysql_query($mysql_sql)) {
  echo mysql_error();
  exit;
}
else {
  $email = $_REQUEST['E-mail'];
  header("Location: completed.php?navn=$full_name&email=$email");
}
}

if(check_required_fields()) {
printf(check_required_fields());
exit;
}

printf(save_and_mail(file_msg(), email_msg(), mysql_sql()));

?>
Avatar billede jaw Nybegynder
15. august 2005 - 12:13 #7
For at fjerne dobbeltklik på submit, så mener jeg den bedste løsning er at sende brugeren til en anden side der indsætter, og f.eks. skriver "tak for din tilmelding". På den måde får brugeren slet ikke muligheden for at klikke 2 gange.

Du kan jo også lave feltet med cpr-nr. unikt i tabellen, der skulle jo ikke gerne være 2 personer med samme cpr-nr. ?!
Avatar billede blackscorpion Nybegynder
15. august 2005 - 12:17 #8
jaw -> header("Location: completed.php?navn=$full_name&email=$email"); <-- sender skam brugeren videre.

Men hvis brugeren har en langsom forbindelse tager det lidt tid før den ryger videre.
dette kode du ser på her, er en helt ny side, så hvis brugeren er langsom, burde det resultere i en hvid side mens den indsætter.
Avatar billede blackscorpion Nybegynder
15. august 2005 - 12:24 #9
lige et side spørgsmål.

Er der ikke en nem måde at tælle antal tegn i en streng??
har prøvet:  $result = count_chars($cprnr, 0);

men får bare "Array" og det er det. :(
Avatar billede jaw Nybegynder
15. august 2005 - 12:25 #10
strlen($cprnr);
Avatar billede blackscorpion Nybegynder
15. august 2005 - 12:29 #11
tak :)
Avatar billede roenving Novice
15. august 2005 - 12:40 #12
Måske kan du bruge noget fra den måde Eksperten (såvidt jeg ved !-) gør det på:

Hver gang der udsendes en form (til kommentarer og svar) tildeles den form et unikt nummer, dette checkes så, så der ikke indsættes to gange (evt. overskrivning, hvis den kommer igen !-)

Desuden sendes man via et selvstændigt script, så selve siden ikke kan findes ved at navigere i historien, da scriptet replace den gamle udgave med en ny ...

-- og hvis I behandler cpr-numre har i forhåbentlig et SSL-certifikat, så det ikke sendes over en almindelig forbindelse !o]
Avatar billede blackscorpion Nybegynder
15. august 2005 - 13:03 #13
desværre intet SSL (tror jeg ikke, men vil lige tjekke op på det)

men hvordan pokker laver man det med formen osv?
Avatar billede roenving Novice
15. august 2005 - 13:19 #14
Jeg betragter det som en art forbrydelse at bede om at følsomme oplysninger sendes, hvis man ikke bruger SSL !-)
Avatar billede blackscorpion Nybegynder
15. august 2005 - 13:23 #15
enig, men havde jeg ikke lige spekuleret på.

men tilbage til det oprindelige spørgsmål. ;)
Avatar billede blackscorpion Nybegynder
15. august 2005 - 14:09 #16
hmmm så gik det dødt. :(
Avatar billede jakobdo Ekspert
15. august 2005 - 14:46 #17
Folk står som regel af når de skal til at kigge for meget kode igennem! :o) (incl. mig selv)
Avatar billede blackscorpion Nybegynder
15. august 2005 - 14:49 #18
jamen for pokker, jeg har jo hele tiden sagt at jeg ikke genbruger noget af den gamle kode. ;)

skal have bare en effektiv måde at sikre tingene på osv. ;)

Det var dig selv der spurgte efter kode. :P
Avatar billede jakobdo Ekspert
15. august 2005 - 15:06 #19
1. Den lægger brugeren dobbelt ind ved hver tilmelding.
(som der er forslået: Lav CPR som primær nøgle i din bruger-tabel)

2. Nogle brugere klikker Submit flere gange.
Roenving er inde på noget, som jeg ikke lige kan guide dig i.

3. nogle skriver ikke hele deres CPR nummer, og nogle skriver det med mellemrum og bindestreg. (har gjort brugeren opmærksom på at det skal være hele cpr nummeret uden bindestreg.
Brug preg_match fra mig eller ericjacobsen

4. Selv om der er validering på, er det stadig lykkes nogle at sende tomme tilmeldinger.
Tjek alt med javascript samt php.

5. Ikke alle felter bliver udfyldt som er krævet.
Tjek alt med javascript samt php.
Avatar billede blackscorpion Nybegynder
15. august 2005 - 15:11 #20
jakobdo -> cpr delen er sådan set løst. ;)

$cpr_removes = array ('-', '.', ':', ';', '_', ' ', '\'', '*', '"');

$cprnr = "1234567890";
$cprnr = str_replace($cpr_removes, "", $cprnr);
$error_level = 0;

if(!preg_match('/^\d{10}$/', $cprnr)) {
$result = strlen($cprnr);
$error_level = 1;
echo "Fejl:<br>\n";
echo "1.) Du har indtastet $result tegn i dit cpr nummer.";
echo " (Et cpr nummer består af 10 tal, indtast venligst dit fulde cpr nummer)<br>\n";
}

$std_ok_string = "/[^0-9]/i" ;
if (preg_match($std_ok_string, $cprnr)) {
$error_level = 1;
echo "2.) Du har indtastet et eller flere bogstaver i dit cpr nummer<br>\n";
}

function gyldig($cpr)
{
if ((4*$cpr[0]
  + 3*$cpr[1]
  + 2*$cpr[2]
  + 7*$cpr[3]
  + 6*$cpr[4]
  + 5*$cpr[5]
  + 4*$cpr[6]
  + 3*$cpr[7]
  + 2*$cpr[8]
  + 1*$cpr[9]) % 11 == 0) return 1;
else return 0;
}

if($error_level == 0) {
if(gyldig($cprnr) == 0) {
  $error_level = 1;
  echo "Fejl: Det indtastede cpr nummer er ugyldigt.";
}
}

if($error_level == 0) {
echo "Ingen fejl fundet.<br>\n";
}

men så vil jeg da hoppe over i javascript afdelingen, og plage dem, men trust me.

I'll be back. ;)

smid et svar. :)
Avatar billede jakobdo Ekspert
15. august 2005 - 15:21 #21
Svar. :o)
Avatar billede blackscorpion Nybegynder
15. august 2005 - 15:22 #22
erik, jaw og roen.

smid et svar. ;)
Avatar billede jaw Nybegynder
15. august 2005 - 15:23 #23
Hvis du siger det, så værsgo' :)
Avatar billede blackscorpion Nybegynder
15. august 2005 - 15:26 #24
jaw -> well, du hjælp med længden af cpr nummeret, som var ret kritisk for mig. ;)
Avatar billede blackscorpion Nybegynder
15. august 2005 - 15:27 #25
så mangler vi bare lige de 2 tunge herrer med de mange point. ;)
Avatar billede erikjacobsen Ekspert
15. august 2005 - 15:28 #26
Ingen point til mig, tak.
Avatar billede blackscorpion Nybegynder
15. august 2005 - 15:29 #27
har btw fundet en fed måde at lave random numre på til de forskellige forms. ;)

function make_seed()
{
  list($usec, $sec) = explode(' ', microtime());
  return (float) $sec + ((float) $usec * time());
}
srand(make_seed());
$randval = rand();

echo "<br>\n" . time() . "_" . mt_rand(1, time()) . $randval;

bruger unix timestamp som det første, så en _ og derefter et random tal på 14 tal. ;)

Det må da være random nok, da time() skifter hvert sekund. ;)
Avatar billede blackscorpion Nybegynder
15. august 2005 - 15:29 #28
okey jakob, som altid. ;)

roenving? ;)
Avatar billede blackscorpion Nybegynder
15. august 2005 - 15:30 #29
okey den hopper mellem en 12/13 stykker og så et par tal op. *G* men det virker (håber jeg) ;)
Avatar billede roenving Novice
15. august 2005 - 15:32 #30
Oki, så velbekomme '-)
Avatar billede blackscorpion Nybegynder
15. august 2005 - 15:34 #31
here you go guys. ;)

Tak for hjælpen. ;)
Avatar billede jaw Nybegynder
15. august 2005 - 15:36 #32
Takker og velbekomme da :)
Avatar billede roenving Novice
15. august 2005 - 15:42 #33
Også jeg takker for point ;~}
Avatar billede blackscorpion Nybegynder
15. august 2005 - 15:48 #34
:D
Avatar billede blackscorpion Nybegynder
15. august 2005 - 15:49 #35
lige en sidste hurtig ting.

lad os nu sige at jeg samler alle påkrævede felter i et array.

er der en måde hvorpå jeg kan tjekke et array op mod et andet, for at se om de er udfyldt, uden at skulle tjekke hver eneste array værdi seperat?
Avatar billede blackscorpion Nybegynder
15. august 2005 - 15:52 #36
spekulere på noget ala.

1. tælle antal påkrævet felter i tjek_arrayet.
2. lave en foreach eller for med det nummer fra 1.
3. lave en if, array_felt = tjek_array.
4. lave noget error snask?

håber i forstår.
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