2010-09-15 3 views
0

У меня есть форма входа, захватывающая хэшированные пароли из базы данных. Если «отправьте проверку» <input type="hidden"> равно 1 (пример ниже объяснит это лучше), тогда отображается содержимое страницы, если оно не равно 1, отображается форма входа. Форма выглядит следующим образом:

<div id="login" style="<?php echo $style ?>"> //$style is by default "visibility:visible;" but will change to "visibility:hidden;" when correct login info is given 
<p>Log in</p> 
<form method="POST" action="<?php echo $_SERVER['PHP_SELF'] ?>"> 
<input type="text" id ="username" name="username" value="Username" onfocus="if (this.value == 'Username') this.value=''"> 
<input type="password" id="password" name="password" value="passpass" onfocus="if (this.value == 'passpass') this.value=''"> 
<br> 
<input type="submit" name="submit" value="Log Ind"> 
<input type="hidden" name="_submit_check" value="1"> //Submit checker. if set, process login information 
</form> 
</div> 
<p>No user? Make one <a href="register.php">here.</a></p> 
</div> 

Это прекрасно работает с моей PHP образца, но есть одна маленькая раздражающая вещь ... Вы должны войти в систему каждый раз, когда вы просто просмотреть страницу. Поэтому я сделал это в моем PHP скрипт:

<?php 

    session_start(); 

    $db = DB::connect('mysql://username:[email protected]/database'); 
    if (DB::isError($db)){ 
     die("Can't connect: " . $db->getMessage()); 
    } 
$style = "visibility:visible;"; 

$passwordHash = sha1($_POST['password']); 
$_SESSION['login'] = $_POST['_submit_check']; //This is the submit checker I mentioned before 

$sql = 'SELECT username FROM user WHERE username = ? AND passwordHash = ?'; 
$result = $db->query($sql, array($_POST['username'], $passwordHash)); 
if ($_SESSION['login'] == 1) { 
    if ($result->numRows() < 1) 
    { 
     echo '<p>Correct your username and password please</p>'; 
    } 
    else { 
     $style = "visibility: hidden;"; 
     echo '<p>This is the page content</p>'; 
    } 
} 
?> 

В случае, если не то, что я добавить $ _POST [ «_ submit_check»] значение до $ _SESSION [] переменная называется «Войти» делают пользователям требуется только для войти каждые 24 минуты? Этого я хочу, но этого не происходит ...

Надеюсь, вы поймете мой вопрос, если нет, оставьте комментарий о том, что вы не понимаете. Мне было трудно объяснить мои мысли в этом вопросе;)

ответ

2

Вы переписываете $_SESSION['login'] каждый запрос, потому что вы назначаете значение $ _POST, не проверяя, действительно ли он установлен.

if(isset($_POST['_check_submit'])) { 
    $_SESSION['login'] = $_POST['_check_submit']; 
} 
+0

Все еще не работает, хотя ... Тот же вывод, что и раньше: он входит в систему, когда я перехожу на другую страницу и обратно, чтобы снова войти в систему :(Если я правильно понял, строки/переменные, хранящиеся внутри переменных SESSION, доступны на всех страницах (с session_start()) в течение следующих 24 минут (по умолчанию) правильно? – Latze

+0

Ухм, потому что вам требуется имя пользователя и пароль чтобы быть POST'ed каждый отдельный запрос. Вы должны переосмыслить свою систему аутентификации. – halfdan

+0

Хорошо, спасибо. – Latze

1

Я не уверен на 100%, потому что другого кода нет, но вам кажется, что вам не нужен звонок session_start(), который необходим для запуска или загрузки сеанса. К сожалению $_SESSION не достаточно магический, чтобы начать сеанс от вашего имени. Без этого вызова $_SESSION будет пустым в начале каждого скрипта и никогда не будет инициализирован для данных сеанса.

Сказав это, можно настроить PHP для автоматического запуска сеансов для каждого скрипта с использованием директивы php.ini session.auto_start, предполагая, что у вас достаточно контроля, чтобы изменить это.

+0

Кроме того, у полуденца есть очень хорошая точка, которую я пропустил! – DMI

+0

Session_start() находится в первом примере :) не знаю почему, перемещая его ... – Latze

Смежные вопросы