Avatar billede flashback83 Nybegynder
06. december 2006 - 11:44 Der er 26 kommentarer og
1 løsning

Session bliver ikke sat

Jeg har den efterfølgende kode på en side. Det er et login-system, Men $_SESSION['valid_user'] bliver ikke sat, selvom jeg mener oplysningerne i MySQL-databasen stemmer med det indtastede. Har I nogen ideer til hvor jeg skal lede efter fejlen?
Jeg har stirret mig blind på det efterhånden...
Rasmus

session_start();

if (isset($_POST['userid']) && isset($_POST['password']))
{
  // if the user has just tried to log in
  $userid = $_POST['userid'];
  $password = $_POST['password'];

  $db_conn = new mysqli('localhost', 'root', '', 'blog');

  if (mysqli_connect_errno()) {
  echo 'Connection to database failed:'.mysqli_connect_error();
  exit();
  }

  $query = 'SELECT * FROM tbl_user'
          ."WHERE username='$userid' "
          ." AND pswrd=sha1('$password')";

  $result = $db_conn->query($query);
  if ($result->num_rows >0 )
  {
    // if they are in the database register the user id
    $_SESSION['valid_user'] = $userid;   
  }
  $db_conn->close();
}
?>
<html>
<body>
<?php
  if (isset($_SESSION['valid_user']))
  {
    echo 'You are logged in as: '.$_SESSION['valid_user'].' <br />';
    echo '<a href="logout.php">Log out</a><br />';
  }
  else
  {
    if (isset($userid))
    {
      // if they've tried and failed to log in
      echo 'Could not log you in.<br />';
    }
Avatar billede mcgoat Nybegynder
06. december 2006 - 12:17 #1
$query = 'SELECT * FROM tbl_user'
          ."WHERE username='$userid' "
          ." AND pswrd=sha1('$password')";
må vel give:

SELECT * FROM tbl_userWHERE username='$userid'

skal du ikke have et mellemrum inden WHERE? :=)
Avatar billede coderdk Praktikant
06. december 2006 - 12:18 #2
Det ville hjælp at checke mysql_error() hvis query'en ikke går godt ;)
Avatar billede mcgoat Nybegynder
06. december 2006 - 12:22 #3
$result = $db_conn->query($query) or die("FEJL: " . mysql_error()); ville jeg mene :)
Avatar billede flashback83 Nybegynder
06. december 2006 - 12:29 #4
mcgoat > Du havde ret der manglede et mellemrum!

Der kommer ingen fejl ved:
$result = $db_conn->query($query) or die("FEJL: " . mysql_error());

Den spytter "could not log you in" ud - Altså $userid er sat, men $_SESSION['valid_user'] er ikke sat...

Undskyld hvis jeg spørger dumt, men jeg er helt nybegynder, så det kniber lidt med overblikket ind imellem
Avatar billede mcgoat Nybegynder
06. december 2006 - 12:34 #5
er userid et tal eller bogstaver?
Avatar billede flashback83 Nybegynder
06. december 2006 - 12:35 #6
Min sqltabel hedder i øvrigt
+--------+-----------+
| userID |int(11)    |
+--------+-----------+
| pswrd  |varchar(16)|
+--------+-----------+
| ...    | ...      |

med en del ekstra rækker dernedefter
Avatar billede flashback83 Nybegynder
06. december 2006 - 12:36 #7
...et tal :)
Avatar billede flashback83 Nybegynder
06. december 2006 - 12:37 #8
Nej sorry - $userid svarer til username i databasen, hvilket er bogstaver
Avatar billede mcgoat Nybegynder
06. december 2006 - 12:37 #9
jamen... hvis den hedder userID..

$query = 'SELECT * FROM tbl_user'
          ." WHERE username='$userid' "
          ." AND pswrd=sha1('$password')";

der spørger du jo efter username og ikke userID.. er der begge i DB?

og hvis du spørger på en INT, så skal der ikke være ' ' om $userid i din query
Avatar billede flashback83 Nybegynder
06. december 2006 - 12:38 #10
Glemte også en række før:
+--------+-----------+
| userID |int(11)    |
+--------+-----------+
|username|varchar(16)|
+--------+-----------+
| pswrd  |varchar(16)|
+--------+-----------+
| ...    | ...      |
Avatar billede mcgoat Nybegynder
06. december 2006 - 12:38 #11
ok. så $userid har ikke noget at gøre med userID i DB?
Avatar billede mcgoat Nybegynder
06. december 2006 - 12:39 #12
godt så :) kigger lige igen
Avatar billede flashback83 Nybegynder
06. december 2006 - 12:41 #13
Ja, jeg fik rodet rundt i det før...
Der er begge dele i db - userID og username, men
$userid på PHP-siden svarer til "username" i DB.
Jeg spørger altså ikke om en int...
Avatar billede mcgoat Nybegynder
06. december 2006 - 12:46 #14
kan jeg få dig til at prøve det her:

session_start();

if (isset($_POST['userid']) && isset($_POST['password']))
{
  // if the user has just tried to log in
  $username = $_POST['userid'];
  $password = $_POST['password'];

$link = mysql_pconnect("localhost", "root", "") or die("Kunne ikke forbinde til server");
$db = mysql_select_db("blog", $link) or die("Kunne ikke forbinde til Database");

$query = "SELECT * FROM tbl_user WHERE username='" . $username . "' AND pswrd='" . $password . "';";

  $result = mysql_query($query) or die("FEJL: " . mysql_error());
  if ($result->num_rows >0 )
  {
    // if they are in the database register the user id
    $_SESSION['valid_user'] = $userid;   
  }

}
?>
<html>
<body>
<?php
  if (isset($_SESSION['valid_user']))
  {
    echo 'You are logged in as: '.$_SESSION['valid_user'].' <br />';
    echo '<a href="logout.php">Log out</a><br />';
  }
  else
  {
    if (isset($userid))
    {
      // if they've tried and failed to log in
      echo 'Could not log you in.<br />';
    }
Avatar billede mcgoat Nybegynder
06. december 2006 - 12:47 #15
hov... og fjerne din sidste if(isset($userid))
Avatar billede mcgoat Nybegynder
06. december 2006 - 12:49 #16
hmmm... når du poster dine login informationer, laver du så dit password om til sha1? . for ellers vil du jo tjekke på om "random-password" == %¤&=("=(&"#&(&%=&(%
Avatar billede mcgoat Nybegynder
06. december 2006 - 12:51 #17
altså.

session_start();

if (isset($_POST['userid']) && isset($_POST['password']))
{
  // if the user has just tried to log in
  $username = $_POST['userid'];
  $password = $_POST['password'];

$link = mysql_pconnect("localhost", "root", "") or die("Kunne ikke forbinde til server");
$db = mysql_select_db("blog", $link) or die("Kunne ikke forbinde til Database");

$query = "SELECT * FROM tbl_user WHERE username='" . $username . "' AND pswrd='" . $password . "';";

  $result = mysql_query($query) or die("FEJL: " . mysql_error());
  $numrows = mysql_num_rows($result);
  if ($numrows)
  {
    // if they are in the database register the user id
    $_SESSION['valid_user'] = $userid;   
  }

}
?>
<html>
<body>
<?php
  if (isset($_SESSION['valid_user']))
  {
    echo 'You are logged in as: '.$_SESSION['valid_user'].' <br />';
    echo '<a href="logout.php">Log out</a><br />';
  }
  else
  {

      // if they've tried and failed to log in
      echo 'Could not log you in.<br />';
  }
Avatar billede mcgoat Nybegynder
06. december 2006 - 12:59 #18
$_SESSION['valid_user'] = $username;  selvf
Avatar billede flashback83 Nybegynder
06. december 2006 - 13:17 #19
Ja, jeg har husket at poste sha1 også :) Er det kun SQL-query'en du har ændret i stykket ovenfor?
Avatar billede flashback83 Nybegynder
06. december 2006 - 13:24 #20
Når jeg kører den udgave du lige har givet mig får jeg en parse error:
Parse error: parse error, unexpected T_ELSE in F:\Programmer\Xampp\xampp\htdocs\blog\simpellogin\Edit2.php on line 38

    // if they've tried and failed to log in
      echo 'Could not log you in.<br />';
  }
PARSE ERROR --> else
    {
      // they have not tried to log in yet or have logged out
      echo 'You are not logged in.<br />';
    }
Avatar billede flashback83 Nybegynder
06. december 2006 - 13:28 #21
Glem den sidste. Har fundet fejlen... Men jeg får samme resultat som før. Man bliver ikke logget ind
Avatar billede flashback83 Nybegynder
06. december 2006 - 13:39 #22
Her er den side, hvor man opretter brugere. Som du kan se laver jeg passwordet om til sha1()
<?php

$username = $_POST['username'];
$pswrd = $_POST['pswrd'];
$pswrd2 = $_POST['pswrd2'];
$email = $_POST['email'];
$name = $_POST['name'];
$diver = $_POST['diver'];
$dives_no = $_POST['dives_no'];
$cert_sys = $_POST['cert_sys'];
$cert_lvl = $_POST['cert_lvl'];
$fav_site = $_POST['fav_site'];
$interests = $_POST['interests'];
$pic = $_POST['pic'];

if(!get_magic_quotes_gpc())
{
    $username = addslashes($username);
    $pswrd = addslashes($pswrd);
    $pswrd2 = addslashes($pswrd2);
    $email = addslashes($email);
    $name = addslashes($name);
    $diver = addslashes($diver);
    $dives_no = addslashes($dives_no);
    $cert_sys = addslashes($cert_sys);
    $cert_lvl = addslashes($cert_lvl);
    $fav_site = addslashes($fav_site);
    $interests = addslashes($interests);
    $pic = addslashes($pic);
}

$pswrd = sha1($pswrd);
   
@ $db = new mysqli("localhost", "root", "" , "blog"); //opretter forbindelse til serveren med host, username, password, database
   
if (mysqli_connect_errno())
    die('Kunne ikke oprette forbindelse til database-serveren');

$result = $db->query("SELECT * FROM tbl_user WHERE username='$username'" );
    if(!$result)
        die('Kunne ikke udføre forespørgsel');
    if($result->num_rows>0)
        die('Brugernavnet er optaget - Gå tilbage og vælg et andet');
   
   
$query = "INSERT INTO tbl_user (username, pswrd, email, name, diver, dives_no, cert_sys, cert_lvl, fav_site, interests, pic) VALUES ( '$username', '$pswrd', '$email', '$name', '$diver', '$dives_no', '$cert_sys', '$cert_lvl', '$fav_site', '$interests', '$pic')";

$result = $db->query($query);
echo mysql_error();

if($result)
    echo $db->affected_rows.' Bruger registreret.';
    $db->close();
   
?>
Avatar billede mcgoat Nybegynder
06. december 2006 - 19:07 #23
jo jo.. det er der hvor du opretter dem, som gemmer deres password i DB med sha1.
Lad os sige du opretter en bruger:

username: testbruger
password: testpassword

så bliver passwordet jo lagt krypteret ind i DB så lad os nu bare sige det hedder "blahblahblah"... Når du så logger ind spørger du om "testpassword" == "blahblahblah" og det vil det jo ikke være.

så du skal i din forespørgsel til DB spørge om password i DB == sha1($password)


forstår du? :)
Avatar billede mcgoat Nybegynder
06. december 2006 - 19:12 #24
mig der ikke kan huske :P havde du jo også gjort i starten. bare mig der havde glemt at tilføje det til mit kodeeksempel
Avatar billede flashback83 Nybegynder
06. december 2006 - 19:40 #25
Tusind tak for din hjælp!!!
Jeg har lige fundet fejlen. Dum dum fejl...

Jeg havde defineret pswrd som varchar(16) i min DB-tabel, men sha1(1234); returnerer "7110eda4d09e062aa5e4a390b0a572ac0d2c0220" ...Lidt mere end 16 tegn, ikke?
Det virker som det skal nu, fordi jeg fjernede begrænsningen i antallet af tegn.
Rasmus

P.S. Hvis du samler på point, så smid et svar, så får du dem, for den tid du har brugt, som tak for hjælpen :)
Avatar billede mcgoat Nybegynder
06. december 2006 - 19:57 #26
ahhh... d'oh... den ville jeg ikke lige have fundet. hehe... nej er sq lige meget, du fandt selv fejlen :)
Avatar billede flashback83 Nybegynder
06. december 2006 - 20:00 #27
Ok, tak alligevel
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester