indtastningen kunne være som forslået i http://www.eksperten.dk/spm/943853 #7 2 forslag eller #9 om du vælger jquery datapicker eller ren js er hvad du syntes bedst om
du bør selvføgelig gemme fødselsdata som et timestamp i DB, men TOM er inde på noget interessant, hvordan sikre du at brugeren giver sandfærdige oplysninger ??
Men jeg har ikke sat nogle kontrol på, så når man fx indtaster en fødselsdagen og man ikke er 18 år (hvor grænsen går), så skal der en spærre, på så brugerne ikke kan kommer til næste side.
og den grænse skal jo hele tiden skifte pr. dag der går. - Hvis i forstår?
Men jeg har ikke sat nogle kontrol på, så når man fx indtaster en fødselsdagen og man ikke er 18 år (hvor grænsen går), så skal der en spærre, på så brugerne ikke kan kommer til næste side. så er det ikke JS det skal laves i, men derimod serverside (.aspx) jeg vil anbefale dig at lukke dette spm og stille spørgsmålet over i ASPNET gruppen http://www.eksperten.dk/spm/Programmering/Script/ASPNET/, da siden er lavet med aspnet
troede man kunne lave det med Java, ligesom i dit eksempel. Hvor den regner alderen ud. Så skal den bare spærres hvis den er mindre end 18 år.
Det det skal ikke laves på serveren.
Jeg beder nemlig om nogle forskellige informationer på 3 sider, og på hver af de tre sider, er der nogle krav (som fx her hvor man skal være 18 år.). Den nye bruger skal leve op til kravene for at komme videre til næste side.
Til sidst på side 4. ser brugeren alle informationerne og skal accepter dem. først når brugeren har accepteret bliver han/hun oprettet på serveren.
Jeg har styre på alt det andet undtagen. Med kontrol af alderen
du skal under alle omstændigheder have fat i dagsdato serverside, brugeren kan sagtens have ændret datoen på egen PC og så vil udregningen være i skorven.
stol aldrig på at brugerens ur går rigtigt
når data submittes skal du kontrollere dem serverside, og hvis de er ok sende brugeren vidre til næste side eller retur til sammen side med en fejlbesked.
1. Så længe at man taster en fødselsdag, som giver 18+ skal man kunne komme videre. for på side 4, accpeter man at alle informationer er rigtige. O.S.V.
2. Jeg kan ikke se hvad jeg skal bruge brugernes PC'eres tid til. Da han bare skal angive hans fødselsdag. fx 02 02 1990 også trækker vi dagsdato fra, så vi finder ud af at han/hun er 21 år. og må derfor kommer videre til næste side.
Jeg har lavet en opret bruger menu, som består af 4 sider. på side 1: der skal brugeren angive NAVN, KØN, FØDSELSDAG OG EMAIL. Så trykker brugeren videre, og informationer kommer til side 2.
når brugeren trykker vidre her sender du data til serveren, og her checker du på serveren om brugeren er fyldt 18, og evt også "valid" email hvis ikke retur til side 1, og ellers vidre til side 2 det eneste js check du skal lave på side 1 er om felterne er udfyldt, men de skal også checkes serverside
2. Jeg kan ikke se hvad jeg skal bruge brugernes PC'eres tid til du skal have fat i dags dato alder = dagsdato - indtastede FØDSELSDAG
Ret dit PC-ur til samme dag og tid for en måned siden. Gå så ind på de to sider, du linker til ovenfor. Så vil du se, at det (populært sagt) er uret på din PC, JavaScript spørger
du kunne evt skrive BeregnAlder om så den anvender AJAX, så selve beregningen forgår serverside, sender fødselsdagsdato som parameter til server og denne anvender serverdato, beregner alderen og sender den retur til clienten, så er vi ude om clientens ur men du har stadig ikke nogle sikkerhed for hvis 10-årige Flemming-Bent vælger at være 18 år?
men som jeg ser det, sender du allerede data når du forlader sde 1. som jeg skrev i #13, og bør lave beregningen før du sender side 2
Orv, det er dæleme smart! Hvis man ikke ved, hvor gammel man er, kan man gå ind på din side og få at vide, om man er over eller under 18. Flot! *LoL*
Nej, du behøver ikke lave det i ASP.NET. Du kan lave det i hvad somhelst. Det er rystende ligegyldigt, for du foretager under alle omstændigheder evalueringen på fuldstændig tilfældige data.
Alle sprog kan afgøre om et tilfældigt tal (timestamp udfra brugerens indtastning) er større eller mindre end et andet tal (timestamp på dags dato minus 18 år). Set i det lys kan det være bedøvende ligegyldigt, hvilken tidsangivelse du tager udgangspunkt i - og hvor nøjagtig den er.
Din model kan med andre ord intet sige om brugerens alder, hvorfor det er noget vrøvl at tale om, hvad der kan komme til at virke.
Hvis du skal bruge det til noget seriøst, bør du finde en helt anden tilgang til problemet (f.eks. NemID) - for så skal det virke.
Hvis du derimod bare skal lege med noget kode, kan du lave det client- eller serverside, som du ønsker. Med et helt tilfældigt udgangspunk vil resultatet under alle omstændigheder være helt tilfældigt - og dermed ubrugeligt til noget seriøst.
>At jeg skal have lavet det her med ASP.NET i stedet for, før at det kan virke? grunden til at jeg omtalte ASPNET var at den side du referarede til kørte aspx, men har senere set du også har spm åbent i PHP (http://www.eksperten.dk/spm/945041), om muligvis sammen project, og der kan du ikke kører asp, du kan ikke blande de 2 serverside sprog.
>Hvis jeg ligger det i JS, vil brugeren så få besked hvis han ikke er over 18 år? det kan han godt, men der skal følges op med serverside validering, du kan have fejl i din js code der slår js fra, brugeren kan slå det fra, og avancerede brugere kan manipulerer med det. men dette fra BeregnAlder() skal settes server side var now = new Date(); tday=now.getDate(); tmo=(now.getMonth()); tyr=(now.getFullYear());
måneds og års selectboxene skal også laves serverside.
men som tidliger nævnt du har ikke nogle sikkerhed for at brugeren indtaster korrekte data (10-årige Flemming-Bent kan sagtens vælger at være 18 år?)
Jeg her ligeglad med om brugeren, indtaster de rigtige eller forkerte oplysninger. Da jeg går ud fra at alle er ærlige.
Men Ronols, har du et link til nogle sidder, hvor jeg kan gør det med js? og serverside, så jeg for dagsdato til at være rigtig. Så det ikke er brugerens computer der bliver brugt?
i js function beregn: slet det der er udkommenteret, og erstat det med php coden der er vist neden under
function BeregnAlder(){ var bday=parseInt(document.getElementById("dato").value); var bmo=parseInt(document.getElementById("maaned").value); var byr=parseInt(document.getElementById("Aar").value); var byr; var age; /* var now = new Date(); */ <?php $now = date("Y-n-j"); $data = explode("-",$now); echo "var now = new Date(".$data[0].", ".($data[1]-1) .", ".$data[2].");"; ?> tday=now.getDate(); tmo=(now.getMonth()); tyr=(now.getFullYear()); if((tmo > bmo)||(tmo==bmo & tday>=bday)) {age=byr} else {age=byr+1} alert("As of today, "+now+' \n'+", you are:"+(tyr-age)+ " years old"); }
#24 I øvrigt viser al erfaring, at webbrugere er alt andet end ærlige =) ja desværre :(
>2) DATE.getMonth returnerer et månedsindeks, begyndende med 0 i js er januar måned 0, :(, hvorimod i andre sprog feks PHP er januar måned 1 det var jo derfor jeg var nød til at trække 1 fra her ($data[1]-1) da jeg gik fra PHP til JS http://www.w3schools.com/jsref/jsref_getmonth.asp
1) Ja, der skrives meget 'derude' 2) Jeg havde noteret mig, du gjorde det rigtige den ene vej, så jeg gik også udfra, det var en tankefisk af en art *o)
kan jeg umildbart se følgende fejl: du har kun givet dine select boxe et navn ikke et id, og vi henter værdien med getElementById du har lavet navnet om i forholdt til det der kaldes i scriptet
var bday=parseInt(document.getElementById("dato").value); var bmo=parseInt(document.getElementById("maaned").value); var byr=parseInt(document.getElementById("Aar").value);
skal så hedde
var bday=parseInt(document.getElementById("txtBday").value); var bmo=parseInt(document.getElementById("txtBmo").value); var byr=parseInt(document.getElementById("txtByr").value);
hvis du har januar som 1 i value i din maaend.php selectbox skal
var bmo=parseInt(document.getElementById("txtBmo").value); se sådan ud: var bmo=parseInt(document.getElementById("txtBmo").value) -1;
i JusterDage() select.setAttribute("id", "dato"); skal hedde select.setAttribute("id", "txtBday");
hvis ovenstående stadig skal vi se coden til aar.php
du har glemt at læse det ole skriver i #26 1) Du erklærer to variabler med navnet byr. Begge eksisterer i hukommelsen, men JS vil kun se den sidste - og den er undefined. den ignorer tilsynaladende bare anden gang den bliver erklæret, for værdien bliver ikke ændret, men det er ikke god codesstil linjen var byr; skal slettes
dette var en tanke fejl jeg ikke havde lavet det, jeg har nemlig value = 1 for januar måned i min select box var bmo=parseInt(document.getElementById("txtBmo").value) -1;
function BeregnAlder(){ var bday=parseInt(document.getElementById("txtBday").value); var bmo=parseInt(document.getElementById("txtBmo").value) -1; var byr=parseInt(document.getElementById("txtByr").value);
var age; /* var now = new Date(); */ <?php $now = date("Y-n-j"); $data = explode("-",$now); echo "var now = new Date(".$data[0].", ".($data[1]-1) .", ".$data[2].");"; ?> tday=now.getDate(); tmo=(now.getMonth()); tyr=(now.getFullYear()); if((tmo > bmo)||(tmo==bmo & tday>=bday)) {age=byr} else {age=byr+1} alert("As of today, "+now+' \n'+", you are:"+(tyr-age)+ " years old"); } //--> </script> </head> <body> <form action="../../sider/opret_brugere/opret_bruger2.php" method="post" name="frm" id="frm" onsubmit="return validate()">
slet det udkommenteret og indsæt det fremhævet istedet function JusterDage(){ var fragment = document.createDocumentFragment(); /* var daglisteelm = document.getElementById("dato"); var aarvalue = document.getElementById("Aar").value; var md = document.getElementById("maaned").value; */ var daglisteelm = document.getElementById("txtBday"); var aarvalue = document.getElementById("txtByr").value; var md = document.getElementById("txtBmo").value; var dage = Dage(md, aarvalue); var select = document.createElement('select'); /* select.setAttribute("id", "dato"); */ select.setAttribute("id", "txtBday"); select.setAttribute("onchange", "BeregnAlder()"); for( var i = 1; i <= dage; i++ ) { var option = document.createElement('option'); option.setAttribute("value",i); var text = document.createTextNode(i); option.appendChild(text); select.appendChild(option); } fragment.appendChild(select); daglisteelm.parentNode.replaceChild(fragment, daglisteelm); }
>Min måend se følgende ud: jeg syntes ikke jeg ser noget echo jeg syntes ikke jeg ser noget <options>
slet det udkommenteret og indsæt det fremhævet istedet function JusterDage(){ var fragment = document.createDocumentFragment(); /* var daglisteelm = document.getElementById("dato"); var aarvalue = document.getElementById("Aar").value; var md = document.getElementById("maaned").value; */ var daglisteelm = document.getElementById("txtBday"); var aarvalue = document.getElementById("txtByr").value; var md = document.getElementById("txtBmo").value; var dage = Dage(md, aarvalue); var select = document.createElement('select'); /* select.setAttribute("id", "dato"); */ select.setAttribute("id", "txtBday"); select.setAttribute("onchange", "BeregnAlder()"); for( var i = 1; i <= dage; i++ ) { var option = document.createElement('option'); option.setAttribute("value",i); var text = document.createTextNode(i); option.appendChild(text); select.appendChild(option); } fragment.appendChild(select); daglisteelm.parentNode.replaceChild(fragment, daglisteelm); }
Jeg ved desværre ikke helt hvad du mener, med det udkommeenteret.?
Vil det sige at jeg skal gør sådan her?
<script language="javascript"> <!-- function BeregnAlder(){ var bday=parseInt(document.getElementById("txtBday").value); var bmo=parseInt(document.getElementById("txtBmo").value) -1; var byr=parseInt(document.getElementById("txtByr").value);
var age; slet det udkommenteret og indsæt det fremhævet istedet function JusterDage(){ var fragment = document.createDocumentFragment(); /* var daglisteelm = document.getElementById("dato"); var aarvalue = document.getElementById("Aar").value; var md = document.getElementById("maaned").value; */ var daglisteelm = document.getElementById("txtBday"); var aarvalue = document.getElementById("txtByr").value; var md = document.getElementById("txtBmo").value; var dage = Dage(md, aarvalue); var select = document.createElement('select'); /* select.setAttribute("id", "dato"); */ select.setAttribute("id", "txtBday"); select.setAttribute("onchange", "BeregnAlder()"); for( var i = 1; i <= dage; i++ ) { var option = document.createElement('option'); option.setAttribute("value",i); var text = document.createTextNode(i); option.appendChild(text); select.appendChild(option); } fragment.appendChild(select); daglisteelm.parentNode.replaceChild(fragment, daglisteelm); }
<?php $now = date("Y-n-j"); $data = explode("-",$now); echo "var now = new Date(".$data[0].", ".($data[1]-1) .", ".$data[2].");"; ?> tday=now.getDate(); tmo=(now.getMonth()); tyr=(now.getFullYear()); if((tmo > bmo)||(tmo==bmo & tday>=bday)) {age=byr} else {age=byr+1} alert("As of today, "+now+' \n'+", you are:"+(tyr-age)+ " years old"); } //--> </script>
eller hvad?
Jeg har ændret det nede i body, som du har lavet. Men jeg kan ikke vælger nogen dag på siden, der står bare nul.?
>Jeg ved desværre ikke helt hvad du mener, med det udkommeenteret.? alt det der står fra og med /* til og med */ samt fra og med // og resten af linjen
>Jeg har ændret det nede i body, som du har lavet sikkert ikke helt som jeg har skrevet, når man ændre navne et sted skal man huske at rette de affødte steder også
komplet code ser nu sådan ud med dine navne:
<!DOCTYPE html> <html> <head> <title> test </title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <script type="text/javascript"> function isLeapYear(Year){ return ((Year % 4 == 0 && Year % 100 != 0) || Year % 400 == 0) ? true : false; } function Dage(md, Year){ return [31,(isLeapYear(Year) ? 29:28),31,30,31,30,31,31,30,31,30,31][md-1]; } function JusterDage(){ var fragment = document.createDocumentFragment(); var daglisteelm = document.getElementById("txtBday"); var aarvalue = document.getElementById("txtByr").value; var md = document.getElementById("txtBmo").value; var dage = Dage(md, aarvalue); var select = document.createElement('select'); select.setAttribute("id", "txtBday"); select.setAttribute("onchange", "BeregnAlder()"); for( var i = 1; i <= dage; i++ ) { var option = document.createElement('option'); option.setAttribute("value",i); var text = document.createTextNode(i); option.appendChild(text); select.appendChild(option); } fragment.appendChild(select); daglisteelm.parentNode.replaceChild(fragment, daglisteelm); } function BeregnAlder(){ var bday=parseInt(document.getElementById("txtBday").value); var bmo=parseInt(document.getElementById("txtBmo").value) -1; var byr=parseInt(document.getElementById("txtByr").value); var age; <?php $now = date("Y-n-j"); $data = explode("-",$now); echo "var now = new Date(".$data[0].", ".($data[1]-1) .", ".$data[2].");"; ?> tday=now.getDate(); tmo=(now.getMonth()); tyr=(now.getFullYear()); if((tmo > bmo)||(tmo==bmo & tday>=bday)) {age=byr} else {age=byr+1}
okay kanon, men nu kan man jo bare ændre sin tid, for at snyde. du snakket om en måde hvor man kunne undgå det. Det var lidt det jeg troede du viste mig hvordan man gjorde.
kan man i stedet for alert boksen. for følgende tekste med rød, oven over de fletter hvor man vælger sin fødselsdag i?
hvis personen er 18+ "Du har XX år gammel"
under 18 år "Man skal desværre være 18 år, for at oprette sig"
alert("As of today, "+now+' \n'+", you are:"+(tyr-age)+ " years old");
med
if(tyr-age < 18){ document.getElementById("tt").innerHTML = "Man skal desværre være 18 år, for at oprette sig"; } else{ document.getElementById("tt").innerHTML = "du er : "+(tyr-age)+ " år gammel"; }
Men nu kan bruger stadigvæk kommer videre, uden at han/hun bliver stoppet og en advarsel som at de skal huske at udfylde fødselsdag.
Jeg ved ikke hvordan man ligger det op på serven? det har jeg ikke sat mig ind i endnu. jeg har bare oprette en phpmyadmin mysql server. Men jeg ved overhovedet ikkee om det er sikkert eller noget
Jeg tror, du bliver nødt til at forklare, hvad en "phpmyadmin mysql server". Sådan en er der vist ikke mange, der har hørt om - så om det er sikkert eller ej, er ikke til at sige =)
Men nu kan bruger stadigvæk kommer videre, uden at han/hun bliver stoppet og en advarsel som at de skal huske at udfylde fødselsdag. når du går fra side 1 til side 2 trykker du vel på en knap, og det skal du så kalde en form validation (http://www.w3schools.com/js/js_form_validation.asp) du kunne jo rette BeregnAlder så den bare retunerer alderen og så udskrive teksten ifm form validering, og form validering retunerer true/false, hvilke er beskrevet oppe i linket til w3schools men du skal selvføgelig følge op med serverside validering, for som olebole skriver til TumseMM i http://www.eksperten.dk/spm/943633 #8 Brug JavaScript for brugerens skyld og PHP for din og din servers sikkerheds skyld
efterhånden tror jeg der er behov for at se hele coden til din side ??, derved kan vi se hvordan den kommer vidre til side 2 smid den på pastebin.com og læg linket herind...
får styr på din HTML og valider din side, jeg kan se du har et nogle problemer med dit tegn sæt linje 9 + 10 + 13 + 57 har du <meta http-equiv="content-type" content="text/html; charset slet linje 9+10 + 57
jquery: linje 20, og nedaf kalder du en jquery funtion, men du har ikke loadet jquery lib, medmindre det er det i linje 17, som jeg ser det loader du først jquery i linje 53 linje 20 jQuery.extend(Drupal.settings, { "basePath hvad bruger du drupal til ??
i din validate() har du en fejl
if (!IsValidEmailAddress(frm.mail.value) ){ err_fld.firstChild.nodeValue = "Email er ikke udfyldt."; frm.mail.focus(); return false; }
skal se sådan ud
if (!IsValidEmailAddress(document.frm.mail.value) ){ err_fld.firstChild.nodeValue = "Email er ikke udfyldt."; document.frm.mail.focus(); error = 1; }
og så ville jeg validerer alderen ifm form submit der som bekendt kalder validate(). så ændre beregnalder() så den setter en global variabel med alderen / retunerer alderen, og test i validate(), om alderen er mindre end 18. jeg ville vælge at retunerer alderen, jeg kan ikke lide globale variable
>Jeg kan da ikke valider den, når den ikke er online? du kan da sagtens trykke submit, og dermed kalde functionen validate(), din egen PC er jo selv server
>men den bremser ikke ind, hvis man ikke udfylder noget? hvad tror du dette gør ??, den tester netop på om fornavn er blankt
if (frm1.fornavn.value == '' || frm1.fornavn.value == null || frm1.fornavn.value== 'Fornavn:'){ err_fld.firstChild.nodeValue = "Fornavn er ikke udfyldt."; frm1.fornavn.style.backgroundColor = errorcolor; error = 1; }
du har et tilsvarende på efternavn
>og man kan bare ændre sin egen tid på computeren? det vil kun virker sålænge du anvende localhost som server, når den kommer op en server ude i byen kan du ændre dine locale ids instillinger lige så tosset du vil, scriptet vil stadig regne rigtigt
prøv igen, jeg havde lige lagt noget test på select boxen, men glemt en parantes :)
function validateForm(){ var error = 0; var bday=document.getElementById("txtBday").value if(bday==0){ document.getElementById("tt").innerHTML = "De har ikke valgt noget i dato feltet"; error=1; } var alder = BeregnAlder(); if(alder<18){ document.getElementById("tt").innerHTML = "Man skal desværre være 18 år, for at oprette sig"; error=1; } return (error)? false : true; }
Men jeg har lige en skønhedsfejl, jeg vil høre om du kan hjælpe med.
Hvis jeg taster at jeg er under 18 år. fx 1995 marts 04. Så kommer teksten også rigtig fint frem. Men når jeg efterfølgende taster en rigtig ind som fx 1990 marts 04. forsvinder fejlteksten ikke. (forudsætter at jeg ikke har udfyldt de andre emner, så jeg ikke kan komme videre til næste side).
>Men når jeg efterfølgende taster en rigtig ind som fx 1990 marts 04. forsvinder fejlteksten ikke det er jo meget nemt, indsæt den fremhævet linje i functionen validate()
document.getElementById("err_tt").innerHTML = ""; var bday=document.getElementById("txtBday").value if(bday==0){ document.getElementById("err_tt").innerHTML = "De har ikke valgt noget i dato feltet"; error=1; }
som du nok kan se i functionen validate skrives fejl beskeden for både dato og alder i sammen felt, det bør nok være i hvert sit felt,
document.getElementById("err_tt").innerHTML = ""; var bday=document.getElementById("txtBday").value if(bday==0){ document.getElementById("err_tt").innerHTML = "De har ikke valgt noget i dato feltet"; error=1; }
document.getElementById("err_tt").innerHTML = ""; var alder = BeregnAlder(); if(alder<18){ document.getElementById("err_tt").innerHTML = "Man skal være 18 år, for at oprette sig"; error = 1; }
ved nærmerer eftertanke de kan jo godt bruge sammen felt, de 2 fejl kan jo ikke forekome samtidig, men en lille optimering, så du kun henter feltet "err_tt" 1 gang
var html =""; var alder = BeregnAlder(); if(alder<18){ html += "Man skal være 18 år, for at oprette sig"; error = 1; }
var bday=document.getElementById("txtBday").value; if(bday==0){ html += "De har ikke valgt noget i dato feltet"; error=1; } document.getElementById("err_tt").innerHTML = html;
ved #55 kommer jeg da også til at slette dato fejl beskeden :( ups, lidt for hurtig, glem indlæg #55
Men hvis jeg nu ændre min tid på min computer og der med snyde mig vej igennem..
Hvis jeg nu skal undgå det skal jeg vel have sat den op på min server, det her jeg desværre endnu ikke forstået hvordan det gøres? så mine bruger ikke kan snyde på den møde?
>Hvis jeg nu skal undgå det skal jeg vel have sat den op på min server Ja
>det her jeg desværre endnu ikke forstået hvordan det gøres? find en udbyder, og køb et domain (domain kan ofte testes og købes direkte hos udbyder). billige udbydere http://www.eksperten.dk/spm/942955 #8
>så mine bruger ikke kan snyde på den møde? så længe brugeren sidder fysisk på din server (pc), vil de altid kunne snyde, ved at ændre uret, hvis de tilgå via nettet kan de ikke snyde
Ja, det kan den godt, men det kan absolut ikke anbefales
Synes godt om
Ny brugerNybegynder
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.