Веселье с сессиями - PullRequest
       4

Веселье с сессиями

1 голос
/ 04 августа 2010

У меня проблема, которая очень меня раздражает. Это потому, что я пытаюсь сделать скрипт входа в PHP. Но когда я войду в систему правильно, он не позволит мне войти.

Если я закомментирую некоторые строки (я их отмечу), сценарий будет работать, но это код, который я планировал использовать для проверки на каждой странице, чтобы люди не могли войти, если они этого не делают должен иметь доступ.

Ниже я разместил код.


index.php

<?php
function __autoload($class_name) {
 require_once "./functions/" . $class_name . ".php";
}
$functions = new functions;
$functions->header("Log ind",0);
$login = new login;
$login->showLogin();
$functions->footer();
?>

/ Функции / functions.php

<?php
// Define class functions
class functions {
 function header($titel,$needlogin = 1) {
  session_start();
  echo $_SESSION['navn'];
// The following lines can be commented out, and it's working
  if($needlogin == 1) {
   if(!isset($_SESSION['id'])) {
    header("Location: http://hansensopskrifter.co.cc/");
    exit;
   }
  }
  ?>
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
   <head>
    <title><?php echo $titel; ?> - Hansens Opskrifter</title>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
   </head>
   <body>
    <h1>Hansens Opskrifter</h1>
  <?php
// The above lines can be commented out, and it's working
 }

 function footer() {
  ?>
   </body>
  </html>
  <?php
 }
}
?>

/ Функции / mysql.php

<?php
// Create the class MySQL
class mysql {
 function __construct() {
  $this->mysqlconnect();
 }

 function mysqlconnect() {
  $conn = mysql_connect("localhost","user","pass");
  if(!$conn) {
   die("Noget gik galt - kontakt Kristoffer og vis ham den følgende meddelelse: " . mysql_error());
  }
  if(!mysql_select_db("db",$conn)) {
   die("Noget gik galt - kontakt Kristoffer og vis ham den følgende meddelelse: " . mysql_error());
  }
 }

 function mysqlquery($query) {
  $result = mysql_query($query);
  if($result) {
   return $result;
  }
 }
}
?>

login.php

<?php
function __autoload($class_name) {
 require_once "./functions/" . $class_name . ".php";
}
$name = $_REQUEST['name'];
$pass = $_REQUEST['pass'];
$login = new login;
$l = $login->doLogin($name,$pass);
if($l == TRUE) {
 header("Location: http://hansensopskrifter.co.cc/loggedin.php");
} else {
 exit;
}
?>

/ функция / login.php

<?php
class login {
 function __autoload($class_name) {
  require_once($class_name . ".php");
 }
 function showLogin() {
  ?>
  <h2>Log ind</h2>
  <form action="./login.php" method="post">
   Navn:<input type="text" name="name" />
   Kode:<input type="password" name="pass" />
   <input type="submit" value="Log ind" />
  </form>
  <p><a href="./forgotpass.php" alt="Glemt kode" title="Glemt kode">Glemt kode?</a></p>
  <?php
 }

 function doLogin($name,$pass) {
  $mysql = new mysql;
  $n = mysql_real_escape_string($name);
  if(!$n) {
   $functions = new functions;
   $functions->header("Intet navn indtastet",0);
   echo "Du glemte at indtaste dit navn.";
   $this->showLogin();
   $functions->footer();
   return false;
  } elseif(!$pass) {
   $functions = new functions;
   $functions->header("Ingen adgangskode indtastet",0);
   echo "Du glemte at indtaste din adgangskode.";
   $this->showLogin();
   $functions->footer();
  }
  $query = "SELECT `id`, `navn`, `kode` FROM `users` WHERE `navn` = '".$n."' ";
  $result = $mysql->mysqlquery($query);
  while($row = mysql_fetch_assoc($result)) {
   $k = sha1($pass);
   $navn = $row['navn'];
   $kode = $row['kode'];
   $n = ucfirst(strtolower($n));
   if($navn == $n && $kode == $k) {
    $_SESSION['id'] = $row['id'];
    $_SESSION['navn'] = $row['navn'];
    return true;
   } else {
    $functions = new functions;
    $functions->header("Forkert navn eller kode",0);
    echo "Det indtastede navn eller kode er forkert.";
    $this->showLogin();
    $functions->footer();
    return false;
   }
  }
 }
}
?>

loggedin.php

<?php
function __autoload($class_name) {
 require_once ("./functions/" . $class_name . ".php");
}
header( "refresh:2;url=./panel/index.php",0);
$functions = new functions;
$functions->header("Logger ind...");
?>
<p>Du er nu logget ind. Du vil automatisk blive viderestillet om omkring 5 sekunder. Hvis du er tr&aelig;t af at vente kan du <a href="./panel/index.php" alt="Opskrifter" title="Opskrifter">klikke her</a>.</p>
<?php
$functions->footer();
?>

Я много чего перепробовал, а теперь просто надеюсь, что вы мне поможете. Я проверил, что на моем компьютере создан файл cookie, который называется PHPSESSID.

Заранее большое спасибо.

Ответы [ 3 ]

2 голосов
/ 04 августа 2010

Это огромная стена текста, но в вашем index.php могут появиться недостатки:

$login = new login;
$login->showLogin();

Вы безоговорочно создаете объект входа и отображаете форму входа, даже не проверяя, была ли успешной предыдущая попытка входа. Я не знаю, указывают ли $_SESSION['id'] и $_SESSION['navn'], которые вы установили в классе входа, успешный вход в систему или нет, но, если они есть, у вас должно быть что-то вроде:

if (isset($_SESSION['id'])) {
    // not logged in, show the form
    $login = new login;
    $login->showLogin();
    exit();
}
// show logged in content here
1 голос
/ 04 августа 2010

Я думаю, что только isset недостаточно.Даже если переменная равна 0, isset также возвращает true.

Попробуйте использовать следующий код:

if ((isset ($ _ SESSION ['id'])) && ($_SESSION ['id']! = 0)) {

$login = new login;

$login->showLogin();

exit(); }
0 голосов
/ 04 августа 2010

Единственное, что я вижу после быстрого просмотра, это то, что вы делаете это:

echo $_SESSION['navn'];

перед запуском

header("Location: http://hansensopskrifter.co.cc/");

Это не будет работать.Вы не можете ничего вывести до того, как напишите HTTP-заголовок.Уберите это эхо или поставьте его после header().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...