16. maj 2008 - 14:01Der er
46 kommentarer og 1 løsning
Jeg giver op (session spørgsmål inside)
Hey eksperter,
Som nogen af jer sikkert ved ;) så er jeg ved at lave et site hvor der kan være flere brugere.
Jeg er nu løbet ind i det problem, at når du har været logget ind på en bruger og derefter logger ind på en anden bruger, så skifter den pludselig over på den foregående bruger.
Problemet er lidt omstændigt, så jeg foretrækker at tage den over MSN, hvis der er en derude, der har tålmodighed til at hjælpe mig med det her.
Hmm ja, det er også min tanke, men jeg har snart prøvet samtlige metoder til at slette de sessions.
En anden ting er, at f.eks. den session jeg har sat med $brugernavn ikke gør det.
I kan lige prøve at se min login.php, hvor jeg sætter sessions. session_start(); $form_user = $_POST['brugernavn']; $form_pass = $_POST['kodeord'];
$resultat = mysql_query("SELECT bId FROM brugere WHERE brugernavn = '$form_user' AND password = '$form_pass'");//Spørger efter ID $number = mysql_num_rows($resultat);//Tæller antaller af resultater
if($number == 1) { $status_array = mysql_query("SELECT status, navn FROM brugere WHERE brugernavn = '$form_user' AND password = '$form_pass'"); $status = mysql_fetch_array($status_array); $_SESSION['adgang'] = "true"; $_SESSION['status'] = $status[0]; $_SESSION['brugernavn'] = $brugernavn; $_SESSION['navn'] = $navn; header("location: enurl");
} else if ($number != 1) { header("location: index.php"); }
Navnet kommer også først frem når man har klikket lidt rundt på siden og så skifter det bare pludselig til den foregående login session. Det er vildt mærkeligt :(
Jeg fandt selv ud af det hehe ;) det hjalp lige at få en pause væk fra det en halv times tid.
Lavede bare en sql query mere, der stod for, at hente * fra brugere. Hvorfor det ikke virkede med $status_array queryen har jeg ingen anelse om, men det virker nu.
Ved godt du selv har løst det, men syntes lige du skal tage følgende til eftertanke.
I dit førrste script du postede, har du ingen steder hvor du sætter $brugernavn...
brugernavnet som brugeren taster ind kalder du $form_user .. og i databasen henter du kun bId, status og navn...
Det kunne måske være en god ide at på din første $query at skrive navn, status efter bId og så spare de 2 andre mysql kald væk...
har kigget lidt på dit script, og tilføjet lidt sikkerhed i det også. ;)
htmlspecialchars burde du læse lidt op på, og bruge hver gang en bruger kan tilføje noget. Det jeg er ude i her, er det der kaldes sql injection.. dvs. ufrivillig adgang via input felter, textarea's osv. Du kan google det og læse lidt mere om det. ;)
altså:
<?php
// Husk dine mysql oplysninger.
session_start(); /* Trim fjerner mellemrum først og sidst i strengen. htmlspecialchars konventerer specielle tegn, for at forhindre mysql injection. */ $form_user = trim(htmlspecialchars($_POST['brugernavn'])); $form_pass = trim(htmlspecialchars($_POST['kodeord']));
if(empty($form_user) || empty($form_pass)) { // tjekker at ingen af felterne er tomme. header("Location: index.php"); // sender brugeren tilbage hvis et tomt felt er fundet. exit; }
$resultat = mysql_query("SELECT bId, status, navn FROM brugere WHERE brugernavn = '$form_user' AND password = '$form_pass'"); //Spørger efter ID $number = mysql_num_rows($resultat);//Tæller antaller af resultater
Jeg har bare det problem, at hvis jeg kun bruger én SQL query, så kan jeg ikke bruge navn, brugerensid m.v. - det eneste jeg kan bruge er $_SESSION['brugernavn'], $_SESSION['status'] og $_SESSION['adgang'] - alle andre ignorerer den bare. Har prøvet at udskrive navn og brugerensid på min index for at teste det, men den udskriver intet. Udskriver jeg derimod brugernavn, så virker det fint?
if(empty($form_user) || empty($form_pass)) { // tjekker at ingen af felterne er tomme. header("Location: index.php"); // sender brugeren tilbage hvis et tomt felt er fundet. exit; }
$resultat = mysql_query("SELECT bId, status, navn FROM brugere WHERE brugernavn = '$form_user' AND password = '$form_pass'"); //Spørger efter ID // $number = mysql_num_rows($resultat);//Tæller antaller af resultater
og du er 100% sikker på at din forbindelse til mysql virker ? og du er 100% sikker på at brugernavn og kodeord er korrekt, og findes i databasen ? og du HAR husket <?php og ?> ? (skal spørge)
Og den udskriver bare stadig intet :( Det er sygt underligt, at den ellers godt kan finde ud af, at brugerens status er sat til 0 eller 1 i DB'en, men den kan ikke finde ud af navn m.v.
if(empty($form_user) || empty($form_pass)) { // tjekker at ingen af felterne er tomme. header("Location: index.php"); // sender brugeren tilbage hvis et tomt felt er fundet. exit; }
$resultat = mysql_query("SELECT bId, status, navn FROM brugere WHERE brugernavn = '$form_user' AND password = '$form_pass'") or die(mysql_error()); //Spørger efter ID $number = mysql_num_rows($resultat);//Tæller antaller af resultater
mener at kunne huske noget med en setting i php.ini som gjorde at du faktisk kunne kalde sessions, ved variable navn, i dit tilfælde.. navn, status og adgang.
en anden ting.. åbn phpmyadmin, åbn din brugere tabel, rediger dine inputs, og smid md5 på.. du kan læse mere om md5 her: http://www.eksperten.dk/artikler/1051
når du så opretter smider du md5() rundt om, før du smider det i databasen. når du så tjekker.. så smider du md5() rundt om det kodeord brugeren har tastet, og tjekker det i databasen. ;)
md5() generer en 32 tegns hash værdi af ordet.
men læs den artikel jeg linkede til tidligere, den er ret nyttet og forklarer rigtigt godt hvordan og hvorledes omkring md5.
lige præcist, og da folk har det med at genbruge deres kodeord på alle de forskellige ting de bruger, er det nok smartest at du ikke kan se deres kodeord. :P
dvs, at hvis de skulle glemme det, så skal der laves et nyt til dem, for du kan IKKE vende md5 funktionen.. altså fra md5 -> tekst..
nej nej... læs den artikel, han forklarer det hele. ;)
hvis nu hest blev til 098f6bcd4621d373cade4e832627b4f6 når det var fræset igennem md5, så ville brugeren huske på hest, men databasen ville huske på 098f6bcd4621d373cade4e832627b4f6.
når brugeren så skal tjekkes.. så er det simpelt..
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.