Kobraz Skrevet 19. november 2015 Del Skrevet 19. november 2015 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
trondes Skrevet 19. november 2015 Del Skrevet 19. november 2015 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
Dan-Levi Skrevet 19. november 2015 Del Skrevet 19. november 2015 (endret) 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: http://php.net/manual/en/book.pdo.php http://php.net/manual/en/pdo.setattribute.php http://php.net/manual/en/class.pdoexception.php http://php.net/manual/en/pdo.prepare.php http://php.net/manual/en/pdostatement.execute.php http://php.net/manual/en/pdostatement.fetch.php http://php.net/manual/en/pdostatement.rowcount.php OOP eller objekt orientert programmering http://php.net/manual/en/language.oop5.basic.php http://php.net/manual/en/language.oop5.php http://php.net/manual-lookup.php?pattern=__construct&scope=quickref Try catch blokk http://php.net/manual/en/internals2.opcodes.catch.php http://php.net/manual/en/language.exceptions.php http://php.net/manual/en/exception.getmessage.php Passordsjekking http://php.net/manual/en/function.password-verify.php 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 19. november 2015 av [email protected] 2 Lenke til kommentar
Thorbear Skrevet 20. november 2015 Del Skrevet 20. november 2015 ... 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
Dan-Levi Skrevet 20. november 2015 Del Skrevet 20. november 2015 Var litt fort og gæli men bra du har et godt øye ☺ Lenke til kommentar
Kobraz Skrevet 21. november 2015 Forfatter Del Skrevet 21. november 2015 Takk for hjelpen Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå