Avatar billede TumseMM Nybegynder
12. juli 2011 - 12:41 Der er 17 kommentarer og
1 løsning

brugersystem help

Hej Eksperten.dk

Jeg er igang med at lave et brugersystem til min hjemmeside. Jeg kan bare ikke finde ud af:

- Hvordan man sørger for at passwordsene er ens når brugerne skal registrere sig på hjemmesiden.
- Og hvordan man sikrer sig at der ikke kan være brugere med det samme 'username'.
- Samt når brugeren er registreret hvordan han ved at han er logget ind. Ville gerne have sådan en lysende knap et eller andet sted, der viste folk at de er logget ind.

Koden til register.php:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<body>

<form action='<?=$_SERVER['PHP_SELF']?>' method='POST'>
<table>
    <tr>
        <td>Brugernavn: </td>
        <td><input type='text' name='username'><br></td>
    </tr>
    <tr>
        <td>Password: </td>
        <td><input type='password' name='password1'><br></td>
    </tr>
    <tr>
        <td>Gentag password: </td>
        <td><input type='password' name='password2'><br></td>
    </tr>
    <tr>
        <td><input name="register" type="submit" value="Registrer"></td>
    </tr>
</table>
</form>
<?php
include('connect.php');

$submit= $_POST['register'];
$username = mysql_real_escape_string(strip_tags(htmlspecialchars($_POST['username']
)));
$password1 = md5($_POST['password1']);
$password2 = $_POST['password2'];

if($submit){
   

if(($username) and ($password1) and ($username!==NULL) and ($password1!==NULL)){
$sql="INSERT INTO `users` (`id`,`username`,`password`) VALUES ('NULL','".$username."','".$password1."')"
;
mysql_query($sql) or die(mysql_error());
echo "Tillykke! Du er nu registreret!<br><a href='Website.php'>Log in</a>";
}
}
?>
</body>
</html>


Tak på forhånd!
Sætter pris på alt form for hjælp!

mvh TumseMM
Avatar billede majbom Novice
12. juli 2011 - 12:56 #1
if($password1 != $password2)
{
  echo "De 2 kodeord er ikke ens!";
}


og så kan du jo lave en søgning i din bruger-tabel hvor den søger efter det indtastede (ønskede) brugernavn - hvis den returnerer noget, er brugernavnet optaget...
Avatar billede olsensweb.dk Ekspert
12. juli 2011 - 13:05 #2
første trin lav noget js validering og serverside

http://www.w3schools.com/js/js_form_validation.asp
pw check js
if (document.testfrm.password1.value == document.testfrm.password2.value && document.testfrm.password1.value !="") {
          alert("pw felt ikke korrekt udfyldt");     
}


pw check serverside
if($_POST['password1'] == $_POST['password2'] && (strlen($_POST['password1'])>1)){ $password = $_POST['password1'];}
else{
echo "fejl i pw";

}



andet trin check brugernavn via AJAX
http://www.eksperten.dk/spm/941830 #8 og #15
Avatar billede vagnk Juniormester
12. juli 2011 - 14:18 #3
Mit forslag er at sætte UNIQUE INDEX på kolonne 'username' i tabellen 'users'.

ALTER TABLE  users ADD UNIQUE INDEX(
  `username`
)
Avatar billede TumseMM Nybegynder
12. juli 2011 - 17:30 #4
#1 og #2
Hvor skal jeg indsætte:

if($password1 != $password2)
{
  echo "De 2 kodeord er ikke ens!";
}

eller:

if (document.testfrm.password1.value == document.testfrm.password2.value && document.testfrm.password1.value !="") {
          alert("pw felt ikke korrekt udfyldt");     
}

og

if($_POST['password1'] == $_POST['password2'] && (strlen($_POST['password1'])>1)){ $password = $_POST['password1'];}
else{
echo "fejl i pw";

}

??
Avatar billede vagnk Juniormester
12. juli 2011 - 18:29 #5
Den må ronols hellere svare på.

Mit forslag er stadig at lade databasen lave alt det besværlige med et index. Hvis du har phpMyAdmin er det lige ud af landevejen  at lave det i fanen Structure. Ellers må du lave en mysql_query med det jeg har skrevet.
Avatar billede TumseMM Nybegynder
12. juli 2011 - 19:21 #6
det var jo genialt det der vagnk :)
Tusinde tak for det!

Kan du svare mig på, hvordan jeg selv kan skrive hvad der skal stå når brugernavnet allerede er optaget? Nu står der bare "Duplicate entry 'TumseMM' for key 'username'". Kan man ikke gøre så man selv kan skrive hvad der skal stå?
Avatar billede majbom Novice
12. juli 2011 - 19:39 #7
SELECT id FROM users WHERE username='" . $username . "'


hvis den returnerer noget, er brugernavnet optaget
Avatar billede vagnk Juniormester
13. juli 2011 - 07:37 #8
Kan man ikke gøre så man selv kan skrive hvad der skal stå?
Det kan du godt. Hvis du vil oversætte alle MySQLs fejltekster er det adskillige tusind og der er sikkert ingen der vil bruge din oversættelse.

Du får en melding ("Duplicate entry") fra MySQL eller en fejlkode med mysql_errno(), og den må du oversætte til noget forståeligt. Ikke en gang en US-boy ville sende en mysql_error ud til brugeren.

Og så ville jeg lave en "$chk = mysql_query($sql)" uden "or die(mysql_error())" og bagefter finde ud af hvad MySQL returnerer.
Avatar billede TumseMM Nybegynder
13. juli 2011 - 17:00 #9
Vagnk:
Jeg forstår ikke helt hvad du mener. Hvor skal jeg indsætte: "$chk = mysql_query($sql)"?

Splazz:
Hej igen.
Hvor skal jeg indsætte:

if($password1 != $password2)
{
  echo "De 2 kodeord er ikke ens!";
}

hvor i min formel skal jeg sætte det script, det kan jeg ikke lige finde ud af, den bliver ved med at lave errors?
Avatar billede majbom Novice
13. juli 2011 - 20:09 #10
du kunne jo indsætte det efter den linje hvor du tjekker om felterne indeholder noget...

if(($username) and ($password1) and ($username!==NULL) and ($password1!==NULL)){
Avatar billede TumseMM Nybegynder
17. juli 2011 - 12:38 #11
Nu siger den ligemeget hvad:

"De 2 kodeord er ikke ens!Tillykke! Du er nu klar til at afslutte sætninger!"

Hvad gør man ved det?
Avatar billede olsensweb.dk Ekspert
17. juli 2011 - 12:53 #12
hvordan ser din nuværende code ud ??
du må have lavet en del om siden #0, og dine test virker ikke siden du bliver logge på uanset hvad.
Avatar billede TumseMM Nybegynder
17. juli 2011 - 13:10 #13
<form action='<?=$_SERVER['PHP_SELF']?>' method='POST'>
<table>
    <tr>
        <td>Brugernavn: </td>
        <td><input type='text' name="username"><br></td>
    </tr>
    <tr>
        <td>Password: </td>
        <td><input type='password' name="password1"><br></td>
    </tr>
    <tr>
        <td>Gentag password: </td>
        <td><input type='password' name="password2"><br></td>
    </tr>
    <tr>
        <td><input name="register" type="submit" value="Registrer"></td>
    </tr>
</table>
</form>
<script type="text/javascript">
if($_POST['password1'] == $_POST['password2'] && (strlen($_POST['password1'])>1)){ $password = $_POST['password1'];}
else{
echo "fejl i pw";
</script>
<?php
include('connect.php');

    if($password1 != $password2)
    {
      echo "De 2 kodeord er ikke ens!";
    }

$submit= $_POST['register'];
$username = mysql_real_escape_string(strip_tags(htmlspecialchars($_POST['username']
)));
$password1 = md5($_POST['password1']);
$password2 = $_POST['password2'];

if($submit){


if(($username) and ($password1) and ($username!==NULL) and ($password1!==NULL)){
$sql="INSERT INTO `users` (`id`,`username`,`password`) VALUES ('NULL','".$username."','".$password1."')"
;     if($password1 != $password2)
    {
      echo "De 2 kodeord er ikke ens!";
    }
    die (mysql_error());
mysql_query($sql) or die(mysql_error());
echo "Tillykke! Du er nu klar til at afslutte sætninger!<br><a href='Website.php'>Tilbage</a>";
}
}
?>
Avatar billede TumseMM Nybegynder
17. juli 2011 - 13:12 #14
Har glemt nogle linjer kode. Du får lige en ny:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<meta http-equiv="content-type" content="text/html/; charset=UTF-8" />
<html>
<body>
    <script type="text/javascript">
    if (document.testfrm.password1.value == document.testfrm.password2.value && document.testfrm.password1.value !="") {
              alert("pw felt ikke korrekt udfyldt");     
    }
   
</script>

}
<form action='<?=$_SERVER['PHP_SELF']?>' method='POST'>
<table>
    <tr>
        <td>Brugernavn: </td>
        <td><input type='text' name="username"><br></td>
    </tr>
    <tr>
        <td>Password: </td>
        <td><input type='password' name="password1"><br></td>
    </tr>
    <tr>
        <td>Gentag password: </td>
        <td><input type='password' name="password2"><br></td>
    </tr>
    <tr>
        <td><input name="register" type="submit" value="Registrer"></td>
    </tr>
</table>
</form>
<script type="text/javascript">
if($_POST['password1'] == $_POST['password2'] && (strlen($_POST['password1'])>1)){ $password = $_POST['password1'];}
else{
echo "fejl i pw";
</script>
<?php
include('connect.php');

    if($password1 != $password2)
    {
      echo "De 2 kodeord er ikke ens!";
    }

$submit= $_POST['register'];
$username = mysql_real_escape_string(strip_tags(htmlspecialchars($_POST['username']
)));
$password1 = md5($_POST['password1']);
$password2 = $_POST['password2'];

if($submit){


if(($username) and ($password1) and ($username!==NULL) and ($password1!==NULL)){
$sql="INSERT INTO `users` (`id`,`username`,`password`) VALUES ('NULL','".$username."','".$password1."')"
;     if($password1 != $password2)
    {
      echo "De 2 kodeord er ikke ens!";
    }
    die (mysql_error());
mysql_query($sql) or die(mysql_error());
echo "Tillykke! Du er nu klar til at afslutte sætninger!<br><a href='Website.php'>Tilbage</a>";
}
}
?>
<script type="text/javascript">
  function tjekFelter(form)
  {
      if(form.username.value == "")
      {
        alert("Husk at afslutte sætningen!");
        return false;
      }
      if(form.password1.value == "")
      {
        alert("Du skal indtaste et navn!");
        return false;
      }
      return true;
  }
</script>
<form action="answer.php" method="post" onsubmit="return tjekFelter(this)">
<form action="Website.php" method="post" onsubmit="return tjekFelter(this)">
</body>
</html>
Avatar billede olsensweb.dk Ekspert
17. juli 2011 - 16:39 #15
du har blandet serverside (php) og clientside (js) validering godt og grunddigt sammen, mixet flere personers svar sammen, og blandet php code ind i js code, i første omgang droppe vi alt der hedder clientside validering.

istedet for
if(($username) and ($password1) and ($username!==NULL) and ($password1!==NULL)){

ville jeg sette et flag hvis der er en fejl, og bare teste på om flaget er sat
if(!$error)


jeg har renset grundigt ud i den og omskrevet den lidt.
dette burde værer tæt på:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
    <title></title>
    <style type="text/css">
    </style>
    <script type="text/javascript">
    </script>
</head>
<body>
<?php
$submit= $_POST['register'];
if($submit=="Registrer")
{
    include('connect.php');
    $username = mysql_real_escape_string(strip_tags(htmlspecialchars($_POST['username'])));
    $password1 = md5($_POST['password1']); // $password1 kan aldrig blive blank,
    $pw1 = $_POST['password1'];
    $pw2 = $_POST['password2'];
    $error=0;
   
    if($pw1 != $pw2)
    {
        echo "De 2 kodeord er ikke ens!";
        $error=1;
    }
    if($pw1 == "")
    {
        echo "De har ikke indtastet et kodeord!";
        $error=1;
    }
    if($username == "")
    {
        echo "De har ikke indtastet et brugernavn!";
        $error=1;
    }   
    if(!$error)
    {       
        $sql="INSERT INTO `users` (`username`,`password`) VALUES ('".$username."','".$password1."')";
        mysql_query($sql) or die(mysql_error());
        echo "Tillykke! Du er nu klar til at afslutte sætninger!<br><a href='Website.php'>Tilbage</a>";       
       
        echo "</body></html>";     // afslutter siden html mæssigt, så den også validerer
        exit; // visser ikke resten af siden,
    }
}
?>

<form action='<?php echo $_SERVER['PHP_SELF']?>' method='POST'>
<table>
    <tr>
        <td>Brugernavn: </td>
        <td><input type='text' name="username"><br></td>
    </tr>
    <tr>
        <td>Password: </td>
        <td><input type='password' name="password1"><br></td>
    </tr>
    <tr>
        <td>Gentag password: </td>
        <td><input type='password' name="password2"><br></td>
    </tr>
    <tr>
        <td><input name="register" type="submit" value="Registrer"></td>
    </tr>
</table>
</form>
</body>
</html>


de 2 nederste forms du har på siden fatter jeg slet ikke, hvad er meningen med dette ??.

1) lave din side HTML mæssigt, når der er ok og validerer. 
2) lav validering på siden (php og gerne js)
3) lav de andre php ting på siden
Avatar billede TumseMM Nybegynder
18. juli 2011 - 10:52 #16
Giv et svar. Det var genialt. Mange tusinde tak!
Avatar billede TumseMM Nybegynder
18. juli 2011 - 11:22 #17
Lige hurtigt. Før var det sådan at man blev på samme side, hvor der kom en error eller "Tillykke! Du er nu klar til at afslutte sætninger!" under de Brugernavn, Password og Gentag Password. Nu bliver man bare redirectet til en ny hvid side med error/succesful tekst i hjørnet.

Kan man ikke gøre det tilbage igen.?

Sætter pris på din hjælp.
TumseMM
Avatar billede olsensweb.dk Ekspert
18. juli 2011 - 12:09 #18
#16 Det var genialt
nej bare skåret ind til benet

hvis du gerne vil lave dit eget fejlcheck til om brugeren findes i forvejen, bør du gøre det som splazz skriver i #7, dog vil jeg nok bruge LIKE istedet for =, da LIKE ikke er følsom over for store/små bogstaver, så har du lavet en bruger der hedder TumseMM, ville du ikke kunne lave en der hedder Tumsemm
fejlchecket er fremhævet.


    if($username == ""){
        echo "De har ikke indtasted et brugernavn!";
        $error=1;
    }   
   
    // #7
    $sql = "SELECT id FROM users WHERE username LIKE '".$username."'";
    // $sql = "SELECT id FROM users WHERE username='" . $username . "'";
    $rs  = mysql_query($sql);
    if($rs)
    {
        $row = mysql_fetch_assoc($rs);
        if (strlen($row['id'])) // $row['id'] er blank hvis brugeren ikke findes (stringen er tom)
        {   
            echo "brugernavnet er optaget";
            $error=1;
        }   
    }

   
    if(!$error){       
        $sql="INSERT INTO `users` (`username`,`password`) VALUES ('$username','$password1')";
        mysql_query($sql) or die(mysql_error());
        echo "Tillykke! Du er nu klar til at afslutte sætninger!<br><a href='Website.php'>Tilbage</a>";       
       
        echo "</body></html>";     // afslutter siden html mæssigt, så den også validerer
        exit; // visser ikke resten af siden,
    }


#17
siden opretter kun brugeren, og derfor giver det ikke mening at vise siden igen, med mindre der er en fejl.

hvis du viste samme side igen ville brugeren blive forvirret, han ville tro han skulle logge ind, men ville nok ikke forstå han skulle gentage sit pw, og når han så "logger ind" vil han får at vide brugernavnet er optaget.     

men du kan jo hvis oprettelsen går godt logge brugeren ind ved at sætte se session variabel, der feks kunne indeholde userid

så du skal lave en logon side også, til existede brugere, der checker username/pw, og hvis det går godt, sætte session variablen med userid.

Nu bliver man bare redirectet til en ny hvid side med error/succesful tekst i hjørnet.
det skulle være din logonside, som du ennu ikke har lavet
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