Premiär! Fyndchans i SweClockers Månadens Drop

MYSQL och PHP inloggning (jämför data med databasen)

Permalänk

MYSQL och PHP inloggning (jämför data med databasen)

Hej!

Jag har lyckats få fram användardata från min databas där användarnamn samt lösenord kommer fram.

Nu har jag också skapat simple inloggningsformulär där man skriver in lösenord samt användare.

mitt problem är att jag inte riktigt vet ännu hur jag jämför om användaren samt lösenord stammer med vad som finns I database för att sedan ge ett välkomstmeddelande.

här är min kod:

<html> <head> <title>mysqli</title> <meta charset="utf-8"> </head> <body> <?php require_once 'login.php'; $mysqli = new mysqli($hn, $un, $pw, $db); if($mysqli->connect_errno){ echo "Failed to connect to MYSQL: (" .$mysqli->connect_errno.")" .$mysqli->connect_error; } $sql = "SELECT * FROM users9"; if (!($stmt = $mysqli -> prepare($sql))){ echo "Prepare failed " . $mysqli->errno. ")" . mysql_error; } echo "<pre>". print_r($stmt, 1) . "</pre>"; $result = $mysqli ->query($sql); echo "<pre>" . print_r($result,1) . "</pre>"; if ($result){ while ($rows = $result ->fetch_assoc()) { echo "<p>Ditt username är ". $rows['username'] . " och ditt lösenord är " . $rows['password'] . "</p>"; } } else { echo "Query failed (" . $mysqli->errno . ")" . $mysqli->error; } $user = $_POST['username']; $Password = $_POST['password']; if ($username == '') ?> <form method="post" action="PREP.php"> <label>Username</label> <input type="text" id="user" username="username" > <label>Password</label> <input type="text" id ="pass" password="password" > <input type="submit" id="btn" value="Login"> </form> </body> </html>

Vore tacksam för all hjälp som kan fås.

Mvh

Permalänk

Så vad jag behöver är att kunna jämföra vad som skrivits in textinput

"användarnamn"
"lösenord"

sedan gå till inloggningssida om användarnamn och lösenord matchar med vad som finns inne I database som framkallas hittills

Permalänk
Medlem
Skrivet av naturaljoin:

Så vad jag behöver är att kunna jämföra vad som skrivits in textinput

Om vi bortser från säkerhet osv...
Experimentera med SQL-satsen "select * from users9 where username = '$username' and password = '$password'"
Får du matchning så är det korrekt användare.

Permalänk
Medlem
Skrivet av iXam:

Om vi bortser från säkerhet osv...
Experimentera med SQL-satsen "select * from users9 where username = '$username' and password = '$password'"
Får du matchning så är det korrekt användare.

Jag skulle ju vilja hävda att det är lite tokigt att säga att "vi bortser från säkerheten" när man visar någon hur man gör. Ovanstående lösning ju helt galet farlig, och detta på ett sätt som förmodligen inte är uppenbart för nybörjaren.

Om man använder mysqli så är det väl https://www.php.net/manual/en/mysqli-stmt.bind-param.php som gäller (se exemplen där).

Visa signatur

Desktop: Ryzen 5800X3D || MSI X570S Edge Max Wifi || Sapphire Pulse RX 7900 XTX || Gskill Trident Z 3600 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Medlem
Skrivet av evil penguin:

Jag skulle ju vilja hävda att det är lite tokigt att säga att "vi bortser från säkerheten" när man visar någon hur man gör. Ovanstående lösning ju helt galet farlig, och detta på ett sätt som förmodligen inte är uppenbart för nybörjaren.

Absolut, det har du rätt i. Men jag kände att det var vettigare att ta ett steg i taget än att ösa på för mycket. Verkade som OP inte hade speciellt mycket erfarenhet av SQL och inte ens tänkt på att man kan jämföra saker direkt i SQL och ett "aha-moment" kanske sker. Därmed inte nödvändigtvis sagt att det SKA lösas på det sättet, bara visa att det finns möjligheter till det.
Sen ska ju lösenord ska ju dessutom inte lagras i klartext.

Permalänk

@iXam: mycket bra förslag.

har hittills provt detta:

$usr = "SELECT * FROM users9 WHERE username='username'"; if (!($stmt = $mysqli -> prepare($usr))){ echo "Prepare failed " . $mysqli->errno. ")" . mysql_error; } $result2 = $mysqli ->query($usr); //först och främst sker inget I result2 nedan här if ($result2){ while ($rows2 = $result2 ->fetch_assoc()) { echo "<p>your username 666 är ". $rows2['username'] . " and your password " . "</p>"; } } else { echo "Query failed (" . $mysqli->errno . ")" . $mysqli->error; } function error(){ echo("Fel lösenord"); } if(isset($_POST['passw'])) { if($_POST['passw'] == $usr) { // Inloggning lyckades, skicka vidare $_SESSION['logged_in'] = 'ja'; header('Location: PROCESS.php'); }else{ // Inloggning misslyckades, skicka tillbaka header('Location: EXEMPEL.php'); } } ?> <form method="post" name="loggain"> <input type="password" name="passw" size="30" /> <input type="submit" name="login" value="Logga in" /> </form>

sist men inte minst så får inte if($_POST['passw'] == $usr) någon data alls verkar det som.

Vad är det som jag gör fel?

Jag knappar in I input texten vad användaren heter men det kommer ingenting upp, eller fel sida öppnas vilket betyder att den inte regerade på infon som skulle tas upp

Permalänk
Skrivet av iXam:

Om vi bortser från säkerhet osv...
Experimentera med SQL-satsen "select * from users9 where username = '$username' and password = '$password'"
Får du matchning så är det korrekt användare.

Oh ser nu att du lagt "$username" som variable. Hur får du fram $username ifrån? finns ingen deklarerad sådan..

Permalänk
Medlem
Skrivet av naturaljoin:

Oh ser nu att du lagt "$username" som variable. Hur får du fram $username ifrån? finns ingen deklarerad sådan..

SQL

create table user ( username varchar(100), password varchar(100) ) insert into user values ("Pelle","svanslos"); insert into user values ("Ulla","bullen");

login.php

<?php session_start(); if($_POST['username'] == "") { print " <form action='login.php' method='post'> <input type='text' name='username'/> <input type='password' name='password'/> <input type='submit' value='Login'> "; exit(); } $mysqli = new mysqli("localhost", "test", "XXXsdfjkhcDD33ddsa", "test"); $username = $_POST['username']; $password = $_POST['password']; $stmt = $mysqli->prepare("SELECT * FROM user WHERE username=? and password=?"); $stmt->bind_param("ss", $username, $password); $stmt->execute(); $stmt->store_result(); if($stmt->num_rows > 0) { $_SESSION['loggedInUsername'] = $username; header('Location: userPage.php'); } else print "Login error, try again."; ?>

userPage.php

<?php session_start(); if($_SESSION['loggedInUsername'] != "") { print "You are logged in as ".$_SESSION['loggedInUsername']; print "<br><a href='logOut.php'>Logout</a>"; } else print "You need to be logged in to use this page"; ?>

logOut.php

<?php session_start(); session_destroy(); header('Location: login.php'); ?>

Permalänk
Skrivet av iXam:

SQL

create table user ( username varchar(100), password varchar(100) ) insert into user values ("Pelle","svanslos"); insert into user values ("Ulla","bullen");

login.php

<?php session_start(); if($_POST['username'] == "") { print " <form action='login.php' method='post'> <input type='text' name='username'/> <input type='password' name='password'/> <input type='submit' value='Login'> "; exit(); } $mysqli = new mysqli("localhost", "test", "XXXsdfjkhcDD33ddsa", "test"); $username = $_POST['username']; $password = $_POST['password']; $stmt = $mysqli->prepare("SELECT * FROM user WHERE username=? and password=?"); $stmt->bind_param("ss", $username, $password); $stmt->execute(); $stmt->store_result(); if($stmt->num_rows > 0) { $_SESSION['loggedInUsername'] = $username; header('Location: userPage.php'); } else print "Login error, try again."; ?>

userPage.php

<?php session_start(); if($_SESSION['loggedInUsername'] != "") { print "You are logged in as ".$_SESSION['loggedInUsername']; print "<br><a href='logOut.php'>Logout</a>"; } else print "You need to be logged in to use this page"; ?>

logOut.php

<?php session_start(); session_destroy(); header('Location: login.php'); ?>

Hej mycket fint.

Jag gjorde detta och har korrigerat lite så mycket jag kunnat och såhär ser den ut:

<?php session_start(); require_once 'login.php'; if($_POST['username'] == "") { print " <form method='post'> <input type='text' name='username'/> <input type='password' name='password'/> <input type='submit' value='Login'> "; exit(); } $mysqli = new mysqli($hn, $un, $pw, $db); $username = $_POST['username']; $password = $_POST['password']; $stmt = $mysqli->prepare("SELECT * FROM users9 WHERE username='username' and password='password'"); $stmt->bind_param("ss", $username, $password); $stmt->execute(); $stmt->store_result(); if($stmt->num_rows > 0) { $_SESSION['loggedInUsername'] = $username; header('Location: userPage.php'); } else header('Location: PROCESS.php'); //print "Login error, try again."; ?>

Problem:

Jag kommer alltid till alternativa sidan dit man kommer om det blir misslyckad inloggning.

sen får jag felmdeddelande:

"Notice: Undefined index: username in C:\Xampp\htdocs\Webb\EXEXNYEX.php on line 4"

Ser du några fel jag gjort?

EDIT Det gick nu när jag la $ signen framför username och password.

Tackar för ditt geniala och prima värk.

Permalänk
Medlem
Skrivet av naturaljoin:

"Notice: Undefined index: username in C:\Xampp\htdocs\Webb\EXEXNYEX.php on line 4"

Notisen kan du få bort genom att byta ut

if($_POST['username'] == "") {

mot

if(!isset($_POST['username'])) {

Observera utropstecknet (!) före funktionsanropet isset. Det betyder "inte". Så den testar om $_POST['username'] INTE är initierad.

Sen är

$stmt = $mysqli->prepare("SELECT * FROM users9 WHERE username='username' and password='password'");

felaktigt. Det ska vara

$stmt = $mysqli->prepare("SELECT * FROM users9 WHERE username=? and password=?");

$stmt->bind_param("ss", $username, $password); stoppar in $username och $password där "?" är. "ss" indikerar att det är strängar.

Anledningen till att inte peta in $username och $password direkt i SQL-satsen är något som heter SQL Injection (Läs om det här, det ÄR viktigt https://www.veracode.com/security/sql-injection). Även om jag gjorde det i min första kommentar, men det var för att ta saker och ting ett steg i taget istället för att det skulle bli så här långt som det blev nu...