Permalänk
Medlem

PHP inloggningsruta

Tjena!

Börjat lite med PHP och följde denna video tutorial och implementerade hans lösning på min lokala testsida. Allting fungerade utmärkt och jag la till session timeout också!

Min lokala server kör senaste XAMPP-versionen med PHP Version 5.3.8 och MySQL Server version: 5.5.16.

När jag sedan laddade upp all kod på riktiga servern så ger inloggningen mig "fel användarnamn eller lösenord", inga PHP eller MySQL meddelanden. databser och namn har jag dubbel och trippel kollat men min PHP-skills sträcker sig inte så långt att jag kan få upp en ordentlig log över vad som händer.

Allt jag vet är att användarnamn och lösenord kommer fram korrekt till query'n och sedan inte av någon anledning kan hittas i riktiga databasen.

Jag har inte hashat lösenordet i databasen!

Le code:

membership.php

<?php require 'mysql.php'; class Membership { function validate_user($username, $pw){ $mysql=new Mysql(); echo $username . $pw; $ensure_credentials = $mysql->verify_Username_and_Pw($username, $pw); if($ensure_credentials){ $_SESSION['status']='authorized'; header("location: admin.php"); } else return "Felaktigt användarnamn eller lösenord, försök igen."; } function log_User_Out(){ if(isset($_SESSION['status'])){ unset($_SESSION['status']); if(isset($_COOKIE[session_name()])){ setcookie(session_name(), '', time() - 10000); } session_destroy(); } } function confirm_Member(){ session_start(); if($_SESSION['status'] != 'authorized'){ header("location: inloggning.php"); } } function time_Out(){ // set timeout period in seconds $inactive = 600; // check to see if $_SESSION['timeout'] is set if(isset($_SESSION['timeout']) ) { $session_life = time() - $_SESSION['timeout']; if($session_life > $inactive){ session_destroy(); header("Location: inloggning.php"); } } $_SESSION['timeout'] = time(); } }

Dold text

mysql.php Felet i verify_Username_and_Pw antar jag..

<?php require_once 'includes/constants.php'; class Mysql{ private $conn; function __construct(){ $this->conn = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME) or die("Det var ett problem med uppkopplingen till databasen, försök igen! Om problemet kvarstår kontakta administratör."); } function verify_Username_and_Pw($username, $pw){ $query= "SELECT * FROM users WHERE username= ? AND password= ? LIMIT 1"; if($statement =$this->conn->prepare($query)) { $statement->bind_param('ss', $username, $pw); $statement->execute(); if($statement->fetch()){ $statement->close(); return true; } } } }

Dold text

Är i stort sett exakt som länken ovan där man kan ladda ner källkoden. Allt annat databasrelaterat fungerar och hämtas korrekt.

Inte så mkt att gå på men om någon kan visa hur man kan få tydligare översikt över vad som händer skulle jag vara tacksam

Visa signatur

Neon
Citera mig om du vill ha svar!

Permalänk
Medlem

Har aldrig använt mysqli men innan du använder $statement->fetch() borde du ha $statement->bind_result($var1, $var2);
Om jag har fel så ursäktar jag mig.

Permalänk
Medlem
Skrivet av Normano:

Har aldrig använt mysqli men innan du använder $statement->fetch() borde du ha $statement->bind_result($var1, $var2);
Om jag har fel så ursäktar jag mig.

Kan det vara servern som inte stödjer msqli? Fast med PHP5 ska väl det fungera.. Annars kan jag tycka två variabler låter rimligare också men 'ss' fungerande fint lokalt så känns inte som det borde vara problemet, ska testköra utan en gång.

Visa signatur

Neon
Citera mig om du vill ha svar!

Permalänk
Medlem
Skrivet av Neonxz:

Kan det vara servern som inte stödjer msqli? Fast med PHP5 ska väl det fungera.. Annars kan jag tycka två variabler låter rimligare också men 'ss' fungerande fint lokalt så känns inte som det borde vara problemet, ska testköra utan en gång.

Oj ursäkta missade den delen av att det fungerade med XAMPP, testa med följande funktion

if (function_exists('mysqli_connect')) { //mysqli is installed }

Permalänk
Medlem
Skrivet av Normano:

Oj ursäkta missade den delen av att det fungerade med XAMPP, testa med följande funktion

if (function_exists('mysqli_connect')) { //mysqli is installed }

Yes den funktionen fungerade så då är det inte avsaknad av msqli.

Kan man på något sätt tvinga upp log/error på verify_Username...funktionen?

function verify_Username_and_Pw($username, $pw){ $query= "SELECT * FROM users WHERE username= ? AND password= ? LIMIT 1"; if($statement =$this->conn->prepare($query)) { $statement->bind_param($username, $pw); $statement->execute(); if($statement->fetch()){ $statement->close(); return true; } }

För om jag kör

echo $username ." ". $pw;

i den funktionen så skrivs strängarna ut korrekt vilket betyder det måste vara något fel som sker i queryn?

Visa signatur

Neon
Citera mig om du vill ha svar!

Permalänk
Medlem
Skrivet av Neonxz:

Yes den funktionen fungerade så då är det inte avsaknad av msqli.

Kan man på något sätt tvinga upp log/error på verify_Username...funktionen?

function verify_Username_and_Pw($username, $pw){ $query= "SELECT * FROM users WHERE username= ? AND password= ? LIMIT 1"; if($statement =$this->conn->prepare($query)) { $statement->bind_param($username, $pw); $statement->execute(); if($statement->fetch()){ $statement->close(); return true; } }

För om jag kör

echo $username ." ". $pw;

i den funktionen så skrivs strängarna ut korrekt vilket betyder det måste vara något fel som sker i queryn?

Testade funktionen på min dator och det fungerar utmärkt, får du inget error meddelande eller så när det inte fungerar?
Om du lägger in echo mellan raderna i mysql funktionen och ser vart det tar stopp så är det lättare att veta vad som inte fungerar.

Permalänk
Medlem
Skrivet av Normano:

Testade funktionen på min dator och det fungerar utmärkt, får du inget error meddelande eller så när det inte fungerar?
Om du lägger in echo mellan raderna i mysql funktionen och ser vart det tar stopp så är det lättare att veta vad som inte fungerar.

Var oneklingen smart, måste suttit stirrat mig blind för länge för att sätta ett echo innanför if-satsen.

Ett echo direkt efter

if($statement =$this->conn->prepare($query)) {

dyker inte upp! vilket betyder den inte blir true av någon anledning.

$query går f.ö. helt utmärkt skriva ut som en string precis som mysqli::prepare vill ha den, dvs som string.

Visa signatur

Neon
Citera mig om du vill ha svar!

Permalänk
Medlem
Skrivet av Neonxz:

Var oneklingen smart, måste suttit stirrat mig blind för länge för att sätta ett echo innanför if-satsen.

Ett echo direkt efter

if($statement =$this->conn->prepare($query)) {

dyker inte upp! vilket betyder den inte blir true av någon anledning.

$query går f.ö. helt utmärkt skriva ut som en string precis som mysqli::prepare vill ha den, dvs som string.

Ger $query svar om du skriver den direkt som SQL i phpMyAdmin?

Permalänk
Medlem
Skrivet av Normano:

Ger $query svar om du skriver den direkt som SQL i phpMyAdmin?

Där tog mina kunskaper slut, hur testar man det? Vet var SQL-rutan finns, men kommandon man ska skriva. gissar den inte tar PHP.

Visa signatur

Neon
Citera mig om du vill ha svar!

Permalänk
Medlem
Skrivet av Neonxz:

Där tog mina kunskaper slut, hur testar man det? Vet var SQL-rutan finns, men kommandon man ska skriva. gissar den inte tar PHP.

Om din host har phpMyAdmin så går du in där, väljer databasen och sen fliken SQL och skriver in

SELECT * FROM users WHERE username = '[byt ut="ut"]' AND password = '[byt ut="ut"]' LIMIT 1

Om användaren kommer upp i tabellen efter att du kört så vet du att det inte är något fel på queryt.

Annars testa med

$mysqli_connection = new MySQLi('localhost', 'user', 'pass', 'db'); if($mysqli_connection->connect_error){ echo "Not connected, error: ".$mysqli_connection->connect_error; }else{ echo "Connected." }

och se om du får kontakt med databasen. Kanske är error_reporting av i php och därav inte får några errormeddelanden. Har tyvärr inte direkt så mycket kunskap, jag fortsätter på tills det fungerar eller söker efter en lösning för det mesta. Hoppas något var till hjälp

Permalänk
Medlem

Har du plain eller sha1 som lörsenord encrypt?

Visa signatur

CPU: I5 4690K @ 4.8GHZ Vcore 1,32 Temp max load: 76c | KYLARE: Phanteks PH-TC14PE MODERKORT: ASUS Z97-A | PSU: FSP Hyper 700W
MINNE:16GB HyperX Black @ 1866mhz |SSD: PNY Optima 240 GB
GRAFIK KORT: Gigabyte 970 GTX WFx3 | BURK: Phanteks Enthoo Pro, windowed edition
Ja jag vet att jag särskriver och jag skyller på engelskan!

Permalänk
Medlem
Skrivet av Normano:

Om din host har phpMyAdmin så går du in där, väljer databasen och sen fliken SQL och skriver in

SELECT * FROM users WHERE username = '[byt ut="ut"]' AND password = '[byt ut="ut"]' LIMIT 1

Om användaren kommer upp i tabellen efter att du kört så vet du att det inte är något fel på queryt.

Annars testa med

$mysqli_connection = new MySQLi('localhost', 'user', 'pass', 'db'); if($mysqli_connection->connect_error){ echo "Not connected, error: ".$mysqli_connection->connect_error; }else{ echo "Connected." }

och se om du får kontakt med databasen. Kanske är error_reporting av i php och därav inte får några errormeddelanden. Har tyvärr inte direkt så mycket kunskap, jag fortsätter på tills det fungerar eller söker efter en lösning för det mesta. Hoppas något var till hjälp

Dyker upp då. password blir PASSWORD, kan det vara det som är felet?

Skrivet av Fakkahe:

Har du plain eller sha1 som lörsenord encrypt?

Har ingen lösenords encrypt, jämför bara två vanliga strängar. Om jag uppfattade frågan rätt.

Visa signatur

Neon
Citera mig om du vill ha svar!

Permalänk
Medlem
Skrivet av Neonxz:

http://dl.dropbox.com/u/782480/sql.PNG

Dyker upp då. password blir PASSWORD, kan det vara det som är felet?

Kan jag inte svara på, password är väl en reserverat namn så testa med att byta, men det fungerade ju ändå för båda när man körde på datorn men kan vara olika mysql versioner.

Annars om du gör en fil bara för att testa annars utan att ha något $_POST för att få tag på det som postas.

<?php require 'mysql.php'; class Membership { function validate_user($username, $pw){ $mysql=new Mysql(); $ensure_credentials = $mysql->verify_Username_and_Pw($username, $pw); if($ensure_credentials){ echo "hest"; } else return "Felaktigt användarnamn eller lösenord, försök igen."; } } $membership = new Membership(); $membership->validate_user("admin", "pw"); ?>

Permalänk
Medlem
Skrivet av Normano:

Kan jag inte svara på, password är väl en reserverat namn så testa med att byta, men det fungerade ju ändå för båda när man körde på datorn men kan vara olika mysql versioner.

Testade ändra till pw men enda skillnaden var även pw tabellen fick orange border som username har på bilden ovan, dock 0 träffar.

Är olika MySQL-versioner ja, lokala kör Server version: 5.5.16 medan server som hyrs kör 5.0.67.

Får fortsätta kolla på det här imorgon..

Visa signatur

Neon
Citera mig om du vill ha svar!

Permalänk
Medlem

Testa

SELECT * FROM users WHERE username = 'admin' AND `password` = 'pw' LIMIT 1

Visa signatur

Asus P8P67 Pro | Core i7 2600 | Sapphire Radeon R9 290 | A-DATA SSD 510

Permalänk
Medlem
Skrivet av crazzir:

Testa

SELECT * FROM users WHERE username = 'admin' AND `password` = 'pw' LIMIT 1

Funkar direkt i SQL men inget resultat i riktiga koden.

Jag testade köra koden

<?php require_once 'includes/constants.php'; class Mysql{ private $conn; function __construct(){ $this->conn = new mysqli(DB_SERVER, 'spaobad', DB_PASSWORD, 'spaobad_m') or die("Det var ett problem med uppkopplingen till databasen, försök igen! Om problemet kvarstår kontakta administratör."); } function verify_Username_and_Pw($username, $pw){ $query= "SELECT * FROM users WHERE username= ? AND `password`= ? LIMIT 1"; $statement = $this->conn->prepare($query); echo $statement;

prepare($string) enligt PHP-manualen: "mysqli_prepare() returns a statement object or FALSE if an error occurred."

Mitt echo är helt tomt.. Blir galen, skulle gå snabbare skriva om koden till icke objektorienterat men vill verkligen veta vad felet är.

Visa signatur

Neon
Citera mig om du vill ha svar!

Permalänk
Medlem

Testa lägga till var_dump($statement->errno); och se om den skriver ut nåt.

Visa signatur

Asus P8P67 Pro | Core i7 2600 | Sapphire Radeon R9 290 | A-DATA SSD 510

Permalänk
Medlem
Skrivet av crazzir:

Testa lägga till var_dump($statement->errno); och se om den skriver ut nåt.

Menar du så här?

<?php require_once 'includes/constants.php'; class Mysql{ private $conn; function __construct(){ $this->conn = new mysqli(DB_SERVER, 'spaobad', DB_PASSWORD, 'spaobad_m') or die("Det var ett problem med uppkopplingen till databasen, försök igen! Om problemet kvarstår kontakta administratör."); } function verify_Username_and_Pw($username, $pw){ $query= "SELECT * FROM users WHERE username= ? AND `password`= ? LIMIT 1"; $statement = $this->conn->prepare($query); echo var_dump($statement->errno); } }

Den koden skriver ut NULL :/

Visa signatur

Neon
Citera mig om du vill ha svar!