Hej Jeg er igang med at lave en side hvor der er login-mulighed og dertil hører der en mulighed for at oprette sig som bruger. Problemet er dog at på en sådan side dur det ikke at der findes flere brugere med samme brugernavn og det har jeg fikset ved at lade mig PHP-script tjekke om det eksisterer i forvejen. Læste så et par tutorials omkring AJAX her sidste dag og tænkte at jeg måske kunne drage nytte af dette. så brugerne slap for først at blive sendt til mit script, få tjekket om brugernavn findes og dernæst blive sendt til en side hvor de får besked om at brugernavnet allerede er i brug. Hvis jeg bruger AJAX kan jeg få den til at tjekke om brugernavnet eksisterer så snart brugeren forlader feltet hvor de skriver brugernavn. Det kan jeg også sagtens lave koden til, men vil det fungere på mit site, da jeg har login i en skjult div, som kan vises ved tryk på et link, via fancybox. Kan jeg godt have en div inde i min skjulte div, således at når jeg åbner min div med fancybox, skriver et brugernavn og så går videre til næste felt, så tjekker den om brugernavnet findes og så sender den svar tilbage, som vises med det samme(forbehold for et lille delay mens scriptet loades ind i siden)?
Den leteste løsning kræver du lægger en lille transparent gif (t.gif) på serveren:
<script type="text/javascript"> function showWarning() { alert("Navnet er allerede i anvendelse.") } function checkUser(sUserName) { var oIm = new Image(); oIm.onerror = showWarning; oIm.src = "check_user.php?user="+encodeURIComponent(sUserName)+"&u="+new Date().getTime(); }
checkUser("olebole"); </script>
- og serverkoden:
<?php if (!empty($_GET)) { // Check user in DB
if ([USER_EXISTS]) { header('Status: 404 Not Found'); exit(); } header('Location: t.gif'); exit(); } ?>
Så skifter du bare ditscript ud med stien til det script der tjekker om brugernavnet er ledigt, og det som der bliver echo'et i det script vil blive smidt tilbage og ind i variablen data i Javascript funktionen.
Så kalder du bare validateUsername("brugernavnher") når brugeren forlader feltet.
Tak for jeres svar. Enig med olebole i at jeg ikke skal bruge jquery, hvis det ikke allerede bliver brugt. Dog benytter fancybox og diverse andre ting på siden jquery, så derfor ville det jo være muligt. Lige nu ser min loginside således ud:
Så tilføjer jeg <div id="check"></div> lige efter feltet for brugernavn. Så ved brugeren med det samme at de ikke kan bruge det ønskede brugernavn. Havde som sådan regnet med at det ville virke, men ville lige være helt sikker, det kunne jo være at man skulle gøre noget specielt for at den ville virke inde i fancybox.
Generelt skal du være overordentlig forsigtig med innerHTML, som har nogle fatale bivirkninger, hvis du ikke har helt styr på, hvad den faktisk gør - og det har du overvejende sandsynligt ikke. Brug i stedet DOM, når du kan slippe afsted med det.
I den forbindelse er det også vigtigt at fremhæve det tåbelige i at HTML-formatere data på serveren og indsætte dem med innerHTML. Det er en skræmmende udbredt praksis, men det gør den ikke mindre tosset.
At HTML-formatere data på serveren tager mange gange den tid, det tager at XML- eller JSON-formatere dem - og bruger oceaner af unødige serverressourcer.
Hold dig til at formatere som XML eller JSON (til nød som ren tekst) og sæt data/elementer ind med DOM. Så koder du effektivt og undgår de værste 'fælder' *o)
Og lad os så sige du har en test.php som kun indeholder <code> Hello World! </code>
Smider du det første javascript i en html fil og besøger den i din browser, vil javascriptet forrespørge din test.php fil som returnerer "Hello World!", for derefter at vise en alert med det.
#9: Jeg tror nu nok, jeg ville lægge koden på onchange i stedet. Validering virker sjældent ret brugervenlig, når den køres realtime - mens der skrives =)
onchange ? afvikles først onblur() altså når du forlader det - Med undtagelse for radio, select og textarea, til input type=text vil jeg altid holde mig til keypress?
Jeg ville blive irriteret over først at få svaret efter jeg forlader feltet.. og sådan vil scenariet se ud med jquery's change på et input[text].
Alternativ skulle man flytte fokus til #username, hvis det allerede er optaget.
Skulle jeg lave det ville jeg benytte en jquery autocomplete, skjule lortet, og tælle antal forekomster, herved drager jeg endnu mere udnyttelse af jquery, når det nu alligevel er smidt på. Så sikre den at brugeren ikke skriver 10 tegn i sekundet samt tager sig af alle de andre problemer man kunne løbe ind i.
Jokke, jeg har stor respekt for, at du føler anderledes for dette end flertallet, men det er næppe din brugertype, jeg ville designe efter =)
Hvis du tester brugere med eye- og mousetracking - evt. støttet af videoovervågning og efterfølgende interview - viser det sig ikke altid at fungere særlig godt.
Der findes en udmærket AListApart artikel, som meget godt passer på de erfaringer, jeg har set gjort i de firmaer, jeg har arbejdet. Specielt det ene var nærmest 'hysterisk' med hensyn til tæt overvågede brugertest, og det var faktisk overordentlig lærerigt at se, hvor ofte grafiske designere og frontend udviklere tog fejl i, hvad der er mest brugervenligt =)
Nu har jeg fået kigget de forskellige løsningsforslag igennem og samtidig fået testet det jeg selv havde foreslået, som så ikke lige viste sig at virke, også selvom jeg burde have gjort tingene rigtigt. Jeg prøvede endda, eftersom at onchange og onblur ikke ville vise noget, at benytte onkeyup i stedet, fordi så skulle den jo vise det når jeg har trykket på en tast, men jeg får hverken be- eller afkræftet om brugernavnet findes i systemet. Mit usercheck.php script virker fint. Tjekkede endda for en sikkerheds skyld at den del virkede, så derfor forsøgte jeg at gå til filen via min browser og skrive ?username=webmaster efter filnavnet, så havde jeg jo min $_GET['username']. Og brugeren webmaster eksisterer i systemet, og ganske rigtigt, så får jeg også at vide at brugeren allerede findes. udskifter jeg username med khhp i stedet for webmaster, som ikke findes i db, så siger den at brugernavnet kan bruges. Blot for god ordens skyld, så kunne det jo være at der er et eller andet med mit php-script der gør at jeg ikke kan få output via AJAX, så I får lige koden her(og ved godt at det stadig bruger MySQL-API, men det er en af de få sider jeg ikke har fået konverteret til MySQLi endnu):
<?php include '../includes/connect.php'; $bruger = $_GET['username']; $tjek = mysql_query("SELECT * FROM users WHERE username='$bruger'"); if ($kontrol = mysql_num_rows($tjek) !=0) { echo 'Det valgte brugernavn er desværre allerede i brug. Vælg venligst et andet.'; } else { echo 'Brugernavnet er ok.'; } ?>
Din PHP-kode ser rigtig ud - og som du siger, fungerer den fint - så du må jo lave en eller anden fejl et sted i din frontend kode. Prøv at vise, hvad du præcist har prøvet med =)
PS: Koden i #6 må du ikke forveksle med Ajax. Det er en skidt og misforstået kode, som du har kopieret fra en, der ikke kan skrive JavaScript - og tydeligvis ikke har opnået dybere forståelse af browseres virkemåde. Undlad at spilde tid med den =)
Filen til login er indsat med php include, fordi den skal bruges over flere filer og derfor er det jo smart at gøre det på den måde. Mit "AJAX"-script er indsat lige ovenover den formular med brugeroprettelse:
SCRIPT FORM
Oprindelsen af det frontend-script var egentlig et forsøg på at vise hvordan google's auto suggestions fungerer, og det var jo næsten det samme jeg skulle bruge og derfor kunne jeg med relativt få rettelser, såsom stien til mit php-script og navnet på funktionen.
Ja, det er nogle INPUT elementer, men hvordan ser din JS-kode ud?
Har du prøvet at lave et fuldstændig 'nøgent' script, hvor det kun er denne funktion, du tester - helt barberet og uden includes? Jo flere muligheder for fejl, der er, jo vanskeligere er det for dig at finde en fejl
Lidt længere nede på siden bruger jeg <?php include 'inc/login.php'; ?> til at indsætte login og brugeroprettelse. Det er bare frontend-scriptet og så de to forms jeg postede i #6 & #7. Det er som sådan det eneste jeg ikke indsætter med php.
Altså min php-kode som kører en forespørgsel til mysql-serveren for at finde ud af om brugernavnet findes eller ikke findes? Hvis ja, så kig i #15, der har jeg allerede postet koden.
Nej, det er JavaScript koden, som sender forespørgslen til serveren, jeg efterlyser. Der har været givet flere forslag i tråden, så ingen kan vide, hvad det er, du forsøger dig med
Har ikke forsøgt nogle af forslagene endnu, fordi det kunne jo være at jeg kunne lære noget ved at få den "uduelige" kode, jeg selv foreslog, til at virke. Men kan da godt prøve med en af de forslag der er givet og så vende tilbage når jeg har forsøgt.
Ok. Nu har jeg forsøgt at lave en helt clean fil, hvor jeg så forsøger at tjekke brugernavnet med et af de andre scripts. Og med det fra #10 skulle jeg jo få en alert-box med resultatet i, men intet sker. Prøvede så at indsætte den fra #9, men min editor laver rigtig mange sorte streger, i form af syntax errors. Prøvede dernæst at genopbygge hans script ved at tage linjerne en efter en og indsætte alle if/else-statements og funktioner, og så lave parenteser og {} selv, for at være sikker på at der var nok, men fik ikke udryddet de syntax-errors.
@jokke: Det gav heller ikke noget, men den skal jo have værdien af data retur fra php, men det er jo ikke noget den får. Jeg beder php om at echo resultatet ud:
<?php include '../includes/connect.php'; $bruger = $_GET['username']; $tjek = mysql_query("SELECT * FROM users WHERE username='$bruger'"); if ($kontrol = mysql_num_rows($tjek) !=0) { echo 'Det valgte brugernavn er desværre allerede i brug. Vælg venligst et andet.'; } else { echo 'Brugernavnet er ok.'; } ?>
Men jeg skal vel have et eller andet onchange/onblur for at kalde funktionen, eller tjekker den selv automatisk(hvilket jeg tolker det som om den gør)? Lige nu ser feltet til brugernavn således ud:
Der er jo noget der, et eller andet sted, går galt, fordi når jeg har en helt ren test-fil, så burde der ikke være noget der kan forvirre den. Jeg har i min test-fil husket at linke til jquery og her kan jeg få den fra #10 til at virke, men den tjekker når siden loades og så er der ingen værdi i mit felt.
Ad #9 "Hvis vi antager at inc/usercheck.php?username=XXXX svarer "optaget" ellers intet i ren text/plain mime. "
Og så vælger du at returnere:
echo 'Det valgte brugernavn er desværre allerede i brug. Vælg venligst et andet.';
eller
echo 'Brugernavnet er ok.';
Jeg siger heller ikke at mit eksempel vil virke 100%, det var blot inspiration.
- Jeg er ude
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.