Permalänk

Loginfunktion PHP? (hjälp)

Tjenare. jag jobbar på en hemsida med några polare och då hade vi tänkt ha en loginfunktion så att visst innehåll bara ska vara synligt för inloggade medlemmar. grejen är den att jag i nuläget inte får loginfunktionen att fungera som den ska, trots att allt (som jag ser det) är skrivet på rätt sätt och jag får inga felmeddelanden.

Totalt består sidan av två dokument för tillfället, en index.php och en loginuser.php

index.php innehåller formen för inloggningen och loginuser innehåller funktionerna för det. jag tänkte vända mig till er som har tid och lust att hjälpa mig felsöka, eftersom jag själv inte kan se vad som är problemet.

OBS jag är väldigt dålig på kodande i php, så behandla mig som en rookie.

här är all php från index.php

<?php error_reporting(E_ALL); ini_set("display_errors", "1"); ?> <?php if (isset($_SESSION["namn"])) { echo "Inloggad som: $_SESSION[namn] "; } else { echo '<form method="post" action="loginuser.php"> <b>Användarnamn:</b><input name="user" id="login" type="text" /><br /> <b>Lösenord:</b><input name="pass" id="login" type="password" /><br /> <input type="submit" id="loginruta" style="width:58px;" value="Logga in"> <input type="submit" id="loginruta" style="width:67px;" value="Bli medlem"> </form>'; } ?>

och hela innehållet i loginuser.php

<?php session_start(); error_reporting(E_ALL); ini_set("display_errors", "1"); $dbc = mysql_connect("localhost", "root", "") or die(mysql_error()); mysql_select_db("arkstedt") or die(mysql_error()); if(isset($_POST["login"])) { $query = mysql_query("SELECT * FROM members WHERE namn = '{$_POST['user']}'") or die(mysql_error()); $user = mysql_fetch_assoc($query) or die(mysql_error()); echo $_POST["user"]; if($user["pass"]==$_POST["pass"]) { $_SESSION["namn"] = $user["namn"]; header("Location: index.php"); exit; } else { echo "DU AER INTE ZNEL HESTEN"; } } ?>

något ni saknar? -fråga

Visa signatur

ASUS 8800GTS 640mb || Intel e6320 1,86Ghz @ 3,2Ghz|| Scythe Infinity || 4gb OCZ Platinum 800mhz || PSU - Hiper R 580W || Antec P182 || P5B-Deluxe || SuperPi 1MB - 14,8s || 3dMark06 -10761p

//CruZadeR

Permalänk
Hedersmedlem

1) id i XHTML måste vara unika, du kan inte ha flera med samma id. (Rätta mig om jag har fel)
2) Googla på "PHP SQL Injection" och ändra koden (tips: mysql_real_escape_string() på php.net)
3) Ha hashade lösenord i databasen!
4) (Ha lösenord på root i MySQL om du inte bara editerade bort det)

Inget av detta lär lösa problemet, kaanske #1 då, men lika bra att påpeka ändå.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk

session_start kan vara bra att ha i index.php om jag förstått din kod rätt

Visa signatur

"to conquer others is to have power, to conquer yourself is to know the way"

Permalänk
Citat:

Ursprungligen inskrivet av Thomas
1) id i XHTML måste vara unika, du kan inte ha flera med samma id. (Rätta mig om jag har fel)
2) Googla på "PHP SQL Injection" och ändra koden (tips: mysql_real_escape_string() på php.net)
3) Ha hashade lösenord i databasen!
4) (Ha lösenord på root i MySQL om du inte bara editerade bort det)

Inget av detta lär lösa problemet, kaanske #1 då, men lika bra att påpeka ändå.

klart som fan att jag har tagit bort lösenordet however, tack för tipset, dock fortfarande ingen lösning på mitt huvudsakliga problem, right?

Citat:

Ursprungligen inskrivet av dr slizer
session_start kan vara bra att ha i index.php om jag förstått din kod rätt

jag testade att ha session_start(); i början, men då fick jag fram felmeddelanden hela tiden. tycker du jag ska testa igen och klistra in felmeddelandet här?

Visa signatur

ASUS 8800GTS 640mb || Intel e6320 1,86Ghz @ 3,2Ghz|| Scythe Infinity || 4gb OCZ Platinum 800mhz || PSU - Hiper R 580W || Antec P182 || P5B-Deluxe || SuperPi 1MB - 14,8s || 3dMark06 -10761p

//CruZadeR

Permalänk
Medlem

Det låter som en bra idé.

Permalänk
Citat:

Ursprungligen inskrivet av Garret
Det låter som en bra idé.

då återkommer jag imorgon med mer information. har inte tid för kodande ikväll.

tack så mycket för att ni tagit er tid och läst igenom ikväll

Visa signatur

ASUS 8800GTS 640mb || Intel e6320 1,86Ghz @ 3,2Ghz|| Scythe Infinity || 4gb OCZ Platinum 800mhz || PSU - Hiper R 580W || Antec P182 || P5B-Deluxe || SuperPi 1MB - 14,8s || 3dMark06 -10761p

//CruZadeR

Permalänk

Om du vill komma åt session-datan i index.php så är du tvungen att starta sessionen igenom med session_start(). Om du får något felmeddelande kan det bero på att du har skickat data till webbläsaren innan sessionen är initierad (t.ex. genom tomraden du har mellan PHP-blocken).

Visa signatur

"to conquer others is to have power, to conquer yourself is to know the way"

Permalänk
Citat:

Ursprungligen inskrivet av Thomas 3) Ha hashade lösenord i databasen!

Kapar tråden lite, har du någon bra länk till hur man hashar osv?

Permalänk
Medlem

Jag har inte testat detta, men jag ser ett uppenbart fel...

if(isset($_POST["login"])) {

... det där förutsätter att du har något element i formuläret som har name="login", men jag ser inga såna... bara id="login", så testa att ge något element namnet "login" så borde du komma ett steg längre...session_start() måste finnas med också, som tidigare nämnt.
Sen detta:

echo "Inloggad som: $_SESSION[namn] ";

Detta finns kvar och funkar pga. bakåtkompabilitet tror jag, men jag har för mig att php.net rekommenderar det mer vanliga:

echo 'Inloggad som:' . $_SESSION['namn'];

EDIT: Tennessee: det räcker egentligen med ett enda kommando:
string hash ( string $algo, string $data ) ;

Enkelt exempel:

//användaren vill ha lösenordet nisse, vi sparar det i databasen $pwd = 'nisse'; $pwdhashed = hash('md5', $pwd); $sql = "INSERT INTO users ... $pwdhashed ... ;";

//när denne användare vill logga in kollar vi om rätt är rätt $input = 'nisse'; //denna variabel fyllde användaren i själv $inputhashed = hash('md5', $input); //hämta lösenordet i databasen $dbobj = mysql_fetch_object(mysql_connect( ... )); //anslut till vår SQL $pwdhashed = $dbobj->password; //hämtar från en kolumn password //och till sist en jämförelse if($pwdhashed == $inputhashed)

Permalänk
Citat:

Ursprungligen inskrivet av azoapes
Jag har inte testat detta, men jag ser ett uppenbart fel...

if(isset($_POST["login"])) {

... det där förutsätter att du har något element i formuläret som har name="login", men jag ser inga såna... bara id="login", så testa att ge något element namnet "login" så borde du komma ett steg längre...session_start() måste finnas med också, som tidigare nämnt.
Sen detta:

echo "Inloggad som: $_SESSION[namn] ";

Detta finns kvar och funkar pga. bakåtkompabilitet tror jag, men jag har för mig att php.net rekommenderar det mer vanliga:

echo 'Inloggad som:' . $_SESSION['namn'];

EDIT: Tennessee: det räcker egentligen med ett enda kommando:
string hash ( string $algo, string $data ) ;

Enkelt exempel:

//användaren vill ha lösenordet nisse, vi sparar det i databasen $pwd = 'nisse'; $pwdhashed = hash('md5', $pwd); $sql = "INSERT INTO users ... $pwdhashed ... ;";

//när denne användare vill logga in kollar vi om rätt är rätt $input = 'nisse'; //denna variabel fyllde användaren i själv $inputhashed = hash('md5', $input); //hämta lösenordet i databasen $dbobj = mysql_fetch_object(mysql_connect( ... )); //anslut till vår SQL $pwdhashed = $dbobj->password; //hämtar från en kolumn password //och till sist en jämförelse if($pwdhashed == $inputhashed)

när jag skriver in session_start(); i min kod så får jag följande felmeddelande:

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:\wamp\www\index.php:1) in C:\wamp\www\index.php on line 2

varför? och sen undrar jag om du kan skriva ut ett "element" med namnet "login" istället för bara ett ID.

-ni får ursäkta min okunskap, och jag tackar för den hjälp jag fått hittills

Visa signatur

ASUS 8800GTS 640mb || Intel e6320 1,86Ghz @ 3,2Ghz|| Scythe Infinity || 4gb OCZ Platinum 800mhz || PSU - Hiper R 580W || Antec P182 || P5B-Deluxe || SuperPi 1MB - 14,8s || 3dMark06 -10761p

//CruZadeR

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av GeneralCrusader
när jag skriver in session_start(); i min kod så får jag följande felmeddelande:

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:\wamp\www\index.php:1) in C:\wamp\www\index.php on line 2

varför? och sen undrar jag om du kan skriva ut ett "element" med namnet "login" istället för bara ett ID.

-ni får ursäkta min okunskap, och jag tackar för den hjälp jag fått hittills

Du skriver ut echo $_POST['user'], om jag kommer ihåg rätt, innan du kör en header("Location: "); Du kan inte skriva ut någonting innan en sådan, läs på om HTTP-protokollet om du vill veta mer. Du kan lösa det med ob_flush(); men, lär dig att göra rätt från början.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av GeneralCrusader
när jag skriver in session_start(); i min kod så får jag följande felmeddelande:

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:\wamp\www\index.php:1) in C:\wamp\www\index.php on line 2

varför? och sen undrar jag om du kan skriva ut ett "element" med namnet "login" istället för bara ett ID.

-ni får ursäkta min okunskap, och jag tackar för den hjälp jag fått hittills

Skriv session_start(); längst upp, alltså som första rad. Felmeddelandet beror kanske på att du har whitespace (tab, mellanslag eller radbrytningar) innan den första <?php-taggen. Det allra första tecknet i filen ska vara < och inget annat.

Alltså som jag sa, name="login"... jag kan inte skriva det tydligare än så. Du har name="user" och name="pass" på dina två input-element, så du kan ju lägga till ett hidden:

<input type="hidden" name="login" value="true">

Permalänk
Citat:

Ursprungligen inskrivet av azoapes
Skriv session_start(); längst upp, alltså som första rad. Felmeddelandet beror kanske på att du har whitespace (tab, mellanslag eller radbrytningar) innan den första <?php-taggen. Det allra första tecknet i filen ska vara < och inget annat.

Alltså som jag sa, name="login"... jag kan inte skriva det tydligare än så. Du har name="user" och name="pass" på dina två input-element, så du kan ju lägga till ett hidden:

<input type="hidden" name="login" value="true">

jag har några tabbar innan session_start(); - tror du att det kan orsaka några problem, eller är det bara innan <?php som man inte kan ha några tecken?

Visa signatur

ASUS 8800GTS 640mb || Intel e6320 1,86Ghz @ 3,2Ghz|| Scythe Infinity || 4gb OCZ Platinum 800mhz || PSU - Hiper R 580W || Antec P182 || P5B-Deluxe || SuperPi 1MB - 14,8s || 3dMark06 -10761p

//CruZadeR

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av GeneralCrusader
jag har några tabbar innan session_start(); - tror du att det kan orsaka några problem, eller är det bara innan <?php som man inte kan ha några tecken?

Tänk såhär: allt som inte är inom <?php ... ?> skrivs ut. Text, whitespace, taggar, allt. Däremot inget som är innanför <?php ... ?> dvs php-kod, skrivs ut så länge man inte använder kommandon, t.ex. echo.

Om något skrivs ut innan man anropar funktionen header(); får man felmeddelandet som du postade här innan; "headers already sent".

Säg att du har denna kod:

<?php //lite kod här ?> <?php //och lite mer här, med ett header-anrop ?>

Vad är det som händer där? Jo, först exekveras php-koden. Sedan skrivs det som är mellan ?> och <?php ut, och vad finns där? Jo, en radbrytning! Det kommer att bli error så det bara knakar om det. Då justerar man (enkelt i detta fall):

<?php //lite kod här //och lite mer här, med ett header-anrop ?>

Permalänk
Testpilot

Skitbra förklarat azoapes men dock stämmer inte ditt exempel då radbrytningen efter ?> faktiskt inte kommer att skrivas ut och din kod kommer därför fungera alldeles utmärkt

Kolla källkoden på en sida med det här exempelvis:

<?php echo 'hej'; ?> <?php echo 'då'; ?>

Den kommer att skriva ut hejdå på bara en rad. Tycker själv det är rätt smidigt att det funkar på det här viset då man inte behöver skriva sin övriga html-kod direkt efter avslutandet av php-taggen utan kan få det mer tydligt på två rader.

Visa signatur

Kolla gärna in min RGB-LED-ljusstake i galleriet
[Gigabyte GA-Z97MX-Gaming 5][Intel Core i5 4690K][Corsair XMS3 16GB][Asus GeForce RTX 2060 Super Dual Evo OC]

Permalänk
Medlem

Aaah... men om det är ett mellanslag också då innan radbrytningen, som inte syns Eller ett innan <

<?php echo 'hej'; ?> <?php echo 'då'; ?>