Gå til innhold

PHP Login script


Anbefalte innlegg

Hei.

 

Logon script som ikke fungerer helt.

 

Jeg har en tabell i MySQL database som jeg lagde slik:

CREATE TABLE IF NOT EXISTS `users` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `username` varchar(50) NOT NULL,
 `email` varchar(50) NOT NULL,
 `password` varchar(50) NOT NULL,
 `trn_date` datetime NOT NULL,
 PRIMARY KEY (`id`)
 );

Jeg vet jeg har riktig brukernavn og passord, men etter å ha tastet inn disse blir jeg verken sendt videre til index.php eller mottar feilmelding. Siden blir bare blank.

 

Kan noen av dere se hva jeg gjør feil her?

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Login</title>
<link rel="stylesheet" href="css/style.css" />
</head>
<body>
<?php
 require('db.php');
 session_start();
 // If form submitted, insert values into the database.
 if (isset($_POST['username'])){
 $username = $_POST['username'];
 $password = $_POST['password'];
 $username = stripslashes($username);
 $username = mysql_real_escape_string($username);
 $password = stripslashes($password);
 $password = mysql_real_escape_string($password);
 //Checking is user existing in the database or not
 $query = "SELECT * FROM `users` WHERE username='$username' and password='".md5($password)."'";
 $result = mysql_query($query) or die(mysql_error());
 $rows = mysql_num_rows($result);
 if($rows==1){
 $_SESSION['username'] = $username;
 header("Location: index.php"); // Redirect user to index.php
 }else{
 echo "<div class='form'><h3>Username/password is incorrect.</h3><br/>Click here to <a href='login.php'>Login</a></div>";
 }
 }else{
?>
<div class="form">
<h1>Log In</h1>
<form action="" method="post" name="login">
<input type="text" name="username" placeholder="Username" required />
<input type="password" name="password" placeholder="Password" required />
<input name="submit" type="submit" value="Login" />
</form>
<p>Not registered yet? <a href='registration.php'>Register Here</a></p>
</div>
<?php } ?>
</body>
</html>
Lenke til kommentar
Videoannonse
Annonse

ok... jeg skal ikke nevne at du ikke bør bruk md5() på passord, eller at du iallefall ikke må bruke mysql_ men heler mysqli ( http://php.net/manual/en/book.mysqli.php) eller PDO ( http://php.net/manual/en/book.pdo.php )

 

Men når det ikke er sagt, så er sikkert feilen din at du sender noe til browseren din før du sender header() meldingen, dermed vil ikke den bli sendt. Derfor gir den heler ikke noe output. bortsett fra noen html tager.  Les mer om det her: http://php.net/manual/en/function.header.php

Lenke til kommentar

Hei!

 

Her var det en del å ta tak i.

 

1.   

 

Rett etter flrste php tag

<?php

Erstatt med

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);

Forsøk scriptet igjen.

 

2.

 

Ikke bruk mysql_ eller md5

 

MySQL utvidelsen er:

  • Ikke under aktiv utvikling
  • Offisielt foreldet (som av PHP 5.5. Vil bli fjernet i PHP 7.)
  • Mangler et OO-grensesnitt

Støtter ikke:

  • Ikke-blokkerende asynkrone forespørsler
  • Preparerte spørringer eller parameteriserte spørringer
  • lagrede prosedyrer
  • flere uttrykk (statements)
  • transaksjoner
  • Den "nye" passord autentiseringsmetoden (på som standard i MySQL 5.6, kreves i 5.7)
  • All funksjonalitet i MySQL 5.1

Det tar ikke lang tid å sette seg inn i en mer objektorientert måte å kode på, preparerte spørringer og parametiserte spørringer.

 

Et eksempel på et enkelt og mer objekt orientert login script kan være som følger:

<?php
// Start session slik at server kan holde "track"
session_start();
$DB_host = "localhost";
$DB_user = "root";
$DB_pass = "";
$DB_name = "dblogin";
// Bruk en try catch blokk når du forsøker å koble til databasen
try
{
     $DB_con = new PDO("mysql:host={$DB_host};dbname={$DB_name}",$DB_user,$DB_pass);
     $DB_con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e)
{
// Skjer det en feil så blir en melding vist
     echo "FEIL VED TILBKOBLING TIL DATABASE MED BESKJED: ".$e->getMessage();
}
// Har scriptet kommet hit er tilkoblingen til databasen vellykket. Lag en brukersesjon og gi ved tilkoblingen til databasen. Sjekk klassen for User nederst.
$user = new User($DB_con);
// Sjekk om en POST forespørsel med username er til stede.
if(isset($_POST['username']))
{
// POST forespørsel er til stedet. Lag variable av brukernavn, e-post og passord (f. eks.).
$uname = $_POST['username'];
$umail = $_POST['umail'];
$upass = $_POST['password'];
 
// Sjekk om brukeren forsøker å logge inn med riktig detaljer.
if($user->login($uname,$umail,$upass))
{
  // Brukere har angitt riktig detaljer
  // Her redirekter du el.
}
else
{
  // Brukeren har ikke angått riktig detaljer.
}
}

class User
{
// databasevariabel som blir populert når vi instansierer User klassen og legger ved databasetilkoblingen som et argument.
    private $db;
  // Denne "magiske" funksjonen er innebygd i PHP siden PHP5 og lar deg utføre kode når en klasse instansieres. Her legges databasetilkoblingen ved som et argument så vi kan bruke den i User klassen.
    function __construct($DB_con)
    {
      // Bruk $this for å referere til det aktuelle objektet. Bruk self for å referere til den aktuelle klassen. Med andre ord, bruk $this->VARIABEL for ikke-statiske variabler, bruker self::$VARIABEL for statiske variabler.
      // variabelen $db i denne klassen populeres med databasetilkoblingen vi la ved som argument i den "magiske" konstruktørmethoden
      $this->db = $DB_con;
    }

  // Innloggingslogikken ligger i en method i User klassen så vi kan skrive mye av logikken og få en mer lesbar kode.
  // Denne methoden har 3 argumenter, brukernavn, epost og passord
  public function login($uname,$umail,$upass)
    {
     // En try catch blokk brukes
  try
  {
   // Preparer spørringen, legg merke til :uname og :umail
   $stmt = $this->db->prepare("SELECT * FROM users WHERE user_name=:uname OR user_email=:umail LIMIT 1");
   // Her forteller vi PHP at :uname er variabelen $uname, variabelen vi sender ved som første argument i denne method. Akkurat det samme for :umail
   // Vi utfører så spørringen i samme slengen $stmt->execute er en innebygd funksjon som godtar et array hvor vi binder variablene.
   $stmt->execute(array(':uname'=>$uname, ':umail'=>$umail));
   // Vi henter så resultatet og lagrer det i variabelen $userRow
   $userRow=$stmt->fetch(PDO::FETCH_ASSOC);
   // Hvis det er mer en 0 resultater
   if($stmt->rowCount() > 0)
   {
    // Her kommer en oppgave til deg. Du skal bruke den "nye" måten å sjekke om passordet er korrekt.
    // Referer til linken nedenfor, forsøk å lage en method til i denne klassen som registrerer en bruker med riktig passordbeskyttelse
    if(password_verify($upass, $userRow['user_pass']))
    {
     // sett en sesjonvariabel der du angår bruker id og returner sant (true)
     $_SESSION['user_session'] = $userRow['user_id'];
     return true;
    }
    // Hvis det ikke er mer en 0 resultater
    else
    {
     // returner usant (false)
     return false;
    }
   }
  }
  catch(PDOException $e)
  {
   // Kommer vi hit har det skjedd en feil når vi forsøkte å hente bruker fra database.
   echo $e->getMessage();
  }
   }
}
?>

Da har du litt å tygge på. Kom med spørsmål underveis om du skulle lure på noe.

 

Noen lenker:

 

PDO, en bedre og sikrere måte å kommunisere med database:

OOP eller objekt orientert programmering

Try catch blokk

 

Passordsjekking

 

 

Fotnote: Alt er nå kodet i ett, men du vil naturligvis separerere databasetilkoblingen til en fil som f.eks. heter init.php og require_once på den og User klassen kan også separeres ut til en fil som f.eks. heter User.Class.php og require_once i init.php.

Endret av [email protected]
  • Liker 2
Lenke til kommentar

 

...

 

Et eksempel på et enkelt og mer objekt orientert login script kan være som følger:

 

...

 

Tror det er en liten glipp i login-funksjonen du har skrevet her, i følge kommentarene dine har du en else som man skal ende opp i dersom antall rader er 0, men man ender opp der dersom password_verify() returnerer false. Dette gjør også at det er tilfeller der denne funskjonen ikke returnerer noen verdi.

 

Ellers var det supert av deg å legge ved et såpass utfyllende eksempel :)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...