[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как закрыть сессию в PHP по нажатию кнопки?
TrogWarZ
Доброго времени суток!

Ниже представлен код, в котором работают сессии, но я не могу понять: как сделать кнопку для выхода (разлогина)? В коде же есть эта кнопка, но она не работает.

Подскажите, пожалуйста, почему не работает эта кнопка и как сделать не кривой выход из сессии чтобы при нажатии кнопки выхода юзверю показалась главная форма с окном ввода логина/пароля?

Сейчас этот код по нажатию кнопки выхода в адресную строку отправляет просто "localhost/test.php?", то есть, без должных "..?gtfo=true". Но даже несмотря на это, если вручную всё дописать, то выхода не происходит.
s_user и s_pass созданы для того, чтобы передать данные из $_SESSION[] в connect() - если записать напрямую, то в лог вываливаются ошибки синтаксиса.

В чём у меня косяк? Или хотя бы в какую сторону думать?

Спасибо.


<?php
session_start();
?>
<!DOCTYPE html>
<html>
<head>
<title>
test sessions</title>
<meta
http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<?php

$logout = $_GET['logout'];
$testbox = $_GET['testbox'];
$script = $_SERVER['PHP_SELF'];
if (!isset($_SESSION['s_pass'])) {
$_SESSION['s_user'] = $_GET['user'];
$_SESSION['s_pass'] = $_GET['pass'];
}
$s_user = $_SESSION['s_user'];
$s_pass = $_SESSION['s_pass'];
$host = 'localhost';
$user = $_GET['user'];
$pass = $_GET['pass'];
function connect($host, $s_user, $s_pass) {
$connection = mysql_connect($host, $s_user, $s_pass);
if (!$connection) {
die (mysql_error());
}
}

if (!($s_user AND $s_pass)) {
echo('
<form action="'
.$script.'" method="GET">
<input type="text" name="user" placeholder="user"/><br/>
<input type="password" name="pass" placeholder="pass"/><br/>
<input type="submit"/>
</form>
'
);
}
if ($s_user AND $s_pass) {
connect($host, $s_user, $s_pass);
echo ('
<form action="'
.$script.'" method="GET">
<input type="checkbox" name="textbox"/>
<input type="submit" formaction="'
.$script.'?gtfo=true" value="gtfo"/>
<input type="submit"/>
</form>
'
);
}
echo '<hr/>testbox = '.$testbox;
if ($gtfo == TRUE) {
unset($_SESSION['s_user'], $_SESSION['s_pass']);
session_unset();
session_destroy();
}
?>
</body>
</html>





Спустя 6 минут, 21 секунда (17.12.2011 - 10:42) TrogWarZ написал(а):
Содержание php_error.php:

PHP Notice: Undefined index: logout in /Applications/MAMP/htdocs/test_sessions.php on line 12
PHP Notice: Undefined index: testbox in /Applications/MAMP/htdocs/test_sessions.php on line 13
PHP Notice: Undefined index: user in /Applications/MAMP/htdocs/test_sessions.php on line 22
PHP Notice: Undefined index: pass in /Applications/MAMP/htdocs/test_sessions.php on line 23
PHP Notice: Undefined variable: connection in /Applications/MAMP/htdocs/test_sessions.php on line 50
PHP Notice: Undefined variable: gtfo in /Applications/MAMP/htdocs/test_sessions.php on line 51

Спустя 43 минуты, 56 секунд (17.12.2011 - 11:26) Michael написал(а):
Так надо обрабатывать входящие данные:
$logout = isset($_GET['logout']) ? $_GET['logout'] : null;

и проверять потом, на какое действие реакция.

чтобы не было ошибок Undefined index

По логике скрипта, не особо понятно, что делается
Вот этой кнопке
<input type="submit"/>

добавь атрибут name, чтобы идентифицировать форму, которая сабмитится.

Спустя 43 минуты, 9 секунд (17.12.2011 - 12:09) Guest написал(а):
Пока изменял код - обнаружилась другая проблема: браузер никак не хочет принимать изменённый код скрипта.
Пробовал чистить куки/кэш для локалхоста (они, кстати, появляются через секунду после очистки, сами) при выключенных Apache/php/mysql, удалять этот скрипт, копипастить его код (с закомментированными сессиями) в другой файл с другим названием.
После этих манипуляций смог получить доступ к форме ввода логина/пароля, но после неё вывелась старая форма (судя по HTML-коду, полученному браузером).
Разница между старой и новой формой в html-коде есть (добавлял как раз атрибут name в submit).

-----

Michael

> Так надо обрабатывать входящие данные
Да, это логично. Спасибо, исправлюсь.

> чтобы не было ошибок Undefined index
Насколько я понимаю, в PHP специально сделано так, чтобы не нужно было определять типы и вообще сами переменные до их использования, в отличие от других ЯП.
Есть ли какой-то смысл всё же их жёстко определять?

> По логике скрипта, не особо понятно, что делается вот этой кнопке
Отправляются данные формы (с чекбоксом) на сервер.

> добавь атрибут name, чтобы идентифицировать форму, которая сабмитится.
То бишь, так? Эту часть с двумя сабмитками я не особо понял

<form name="testform" action="'.$script.'" method="GET">
<input
type="checkbox" name="testbox"/>
<input
type="submit" formaction="'.$script.'?gtfo=true" value="gtfo"/>
<input
name="testform" type="submit"/>
</form>



ps: в строке №43 в сабже написано [name="textbox"]. Это форумная очепятка и в коде написан верный вариант (testbox).

Спустя 4 минуты, 22 секунды (17.12.2011 - 12:14) Игорь_Vasinsky написал(а):
Цитата
браузер никак не хочет принимать изменённый код скрипта.

давольно нелепое заявление.

код PHP - а он серверный язык, а не клиентский - и на браузер ему пофиг.

Цитата
<input name="testform" type="submit"/>


имя кнопки для того чтобы запускать обработчик тогда когда эта кнопка нажата

if(isset($_POST['testform']))
{
//Код оработчика
}

Спустя 18 минут, 31 секунда (17.12.2011 - 12:32) Guest написал(а):
Игорь_Vasinsky
> давольно нелепое заявление.
Я знаю, но не понимаю - как после изменения кода в test.php (например, дописать ещё одну строку текста между чекбоксом и кнопкой во второй форме) при вышеописанных манипуляциях и новом открытии файла test2.php всё открывается как было (то есть, без дополнительной строки), хотя куки/кэш почищены и скрипт открыт заново под другим именем.
Грешу на сессии, но увы, моих знаний сейчас недостаточно для того, чтобы решить эту проблему.

Спустя 1 минута, 48 секунд (17.12.2011 - 12:34) Guest написал(а):
UPD. Система такова: macbook 4.1, Mac OS 10.7.2, PHP 5.2.17, Safari 5.1.2.

Спустя 21 минута, 15 секунд (17.12.2011 - 12:55) caballero написал(а):
открой в браузере исходный код страницы и посмотри пришла строка или нет
может она пришла но не отображается

Спустя 27 минут, 38 секунд (17.12.2011 - 13:23) Guest написал(а):
UPD2: Порылся в директориях PHP, снёс все файлы сессий. Теперь тестовый скрипт открылся как нужно (изменённый), но с сессиями творится что-то непонятное (лично мне):
1 - файлы сессий больше не создаются.
2 - после нажатия "Отправить" (сабмитка подтверждения) перекидывает на форму логина (чекбокс рапортирует о значении "on", если его выбрать до нажатия кнопки).
3 - если в html-код второй формы дописать что угодно, ребутнуть сервак/браузер/страницу - она "не приходит" (т.е. не видна даже в исходном коде страницы при просмотре через браузер).
4 - браузер утверждает, что cookies никакие не создаются для localhost и 172.0.0.1.

Обращаю внимание на закомментированную и опущенную вниз строку echo с кнопкой "gtfo": её в форме впринципе нет. Но вот браузер утверждает обратное (скрин по ссылке): http://cl.ly/ChKK
На всякий случай, прилагаю код:

<?php
session_start();
?>
<!DOCTYPE html>
<html>
<head>
<title>
test sessions</title>
<meta
http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<?php

$logout = isset($_GET['logout']) ? $_GET['logout'] : NULL;
$testbox = isset($_GET['testbox']) ? $_GET['testbox'] : NULL;
$script = $_SERVER['PHP_SELF'];
if (!isset($_SESSION['s_pass'])) {
$_SESSION['s_user'] = $_GET['user'];
$_SESSION['s_pass'] = $_GET['pass'];
}
$s_user = isset($_SESSION['s_user']) ? $_SESSION['s_user'] : NULL;
$s_pass = isset($_SESSION['s_pass']) ? $_SESSION['s_pass'] : NULL;
$host = 'localhost';
$user = isset($_GET['user']) ? $_GET['user'] : NULL;
$pass = isset($_GET['pass']) ? $_GET['pass'] : NULL;
function connect($host, $s_user, $s_pass) {
$connection = mysql_connect($host, $s_user, $s_pass);
if (!$connection) {
die (mysql_error());
}
}

if (!($s_user AND $s_pass)) {
echo('
<form action="'
.$script.'" method="GET">
<input type="text" name="user" placeholder="user"/><br/>
<input type="password" name="pass" placeholder="pass"/><br/>
<input type="submit"/>
</form>
'
);
}
if ($s_user AND $s_pass) {
connect($host, $s_user, $s_pass);
echo ('
<form action="'
.$script.'" method="GET">
<input type="checkbox" name="textbox"/>
<br/><p>textstring! Anybody here?</p><br/>
<input type="submit"/>
</form>
'
);
}
echo '<hr/>testbox = '.$testbox;
if ($gtfo == TRUE) {
unset($_SESSION['s_user'], $_SESSION['s_pass']);
session_unset();
session_destroy();
}
// echo ('<input type="submit" formaction="'.$script.'?gtfo=true" value="gtfo"/>');
?>
</body>
</html>


Спустя 3 минуты, 24 секунды (17.12.2011 - 13:26) Guest написал(а):
Прошу простить - в прошлом комменте ссылка на скрин битая.
Правильная здесь: http://cl.ly/Cghh

Спустя 6 минут, 43 секунды (17.12.2011 - 13:33) Игорь_Vasinsky написал(а):
ты для чё в GET паролю суюшь???

Спустя 4 минуты, 6 секунд (17.12.2011 - 13:37) Guest написал(а):
Игорь_Vasinsky, пользуюсь GET только при отладке, а когда скрипт завершён - меняю все GET на POST. Да и юзверя в мускуле создал специального под тесты - с правами доступа только к одной единственной базе smile.gif

Спустя 2 минуты, 12 секунд (17.12.2011 - 13:39) Guest написал(а):
Ну и про htmlentities(), mysql_real_escape_string(), проверку по регэксам тоже не забываю.
В данном примере не могу понять почему не работают сессии - вот и написал простой скрипт без шелухи. Реальная задача размером в 500+ строк.

Спустя 5 часов, 3 минуты, 6 секунд (17.12.2011 - 18:42) Ramzil_Nixon написал(а):
session_destroy();

Спустя 6 минут, 3 секунды (17.12.2011 - 18:48) Guest написал(а):
Ramzil_Nixon, session_destroy() у меня присутствует в 6й по счёту строке с конца (во втором коде) и в 5й строке с конца (в САБЖе).

Логика такова:
session_destroy() вызывается только в случае, если $gtfo == TRUE.
$gtfo = TRUE тогда, когда пользователь нажимает кнопку
<input type="submit" formaction="'.$script.'?gtfo=true" value="gtfo"/>
.

Спустя 16 часов, 59 минут, 53 секунды (18.12.2011 - 11:48) Guest написал(а):
Долго подумав, сделал так (код ниже). Работает успешно.
Возможно ли это реализовать средствами именно PHP без прибегания к помощи JS? И как конкретней это сделать?

<?php
session_start();
?>
<!DOCTYPE html>
<html>
<head>
<title>
test sessions</title>
<meta
http-equiv="Content-Type" content="text/html; charset=utf-8">
<script>
function
logout(obj) {
// alert(obj.id);
obj.gtfo.value = 1;
obj.submit();
}
</script>
</head>
<body>
<?php

var_dump($_SESSION);
$gtfo = $_GET['gtfo'];
if (!empty($gtfo)) {
unset($_SESSION['s_user'], $_SESSION['s_pass']);
session_unset();
session_destroy();
}
var_dump($_SESSION);
$logout = isset($_GET['logout']) ? $_GET['logout'] : NULL;
$testbox = $_GET['testbox'];
$script = $_SERVER['PHP_SELF'];
if (!isset($_SESSION['s_pass'])) {
$_SESSION['s_user'] = $_GET['user'];
$_SESSION['s_pass'] = $_GET['pass'];
}
$s_user = $_SESSION['s_user'];
$s_pass = $_SESSION['s_pass'];
$host = 'localhost';
$user = $_GET['user'];
$pass = $_GET['pass'];
function connect($host, $s_user, $s_pass) {
$connection = mysql_connect($host, $s_user, $s_pass);
if (!$connection) {
die (mysql_error());
}
}

if (!($s_user AND $s_pass)) {
echo('
<form name="login" action="'
.$script.'" method="GET">
<input type="text" name="user" placeholder="user"/><br/>
<input type="password" name="pass" placeholder="pass"/><br/>
<input type="submit"/>
</form>
'
);
}
if ($s_user AND $s_pass) {
connect($host, $s_user, $s_pass);
echo ('
<form name="testform" id="testform" action="'
.$script.'" method="GET">
<input type="checkbox" name="testbox"/>
<input type="button" onclick="logout(this.form);" value="gtfo"/>
<input type="hidden" name="gtfo" value="0"/>
<input name="testform" type="submit"/>
</form>
'
);
}
echo '<hr/>testbox = '.$testbox;
var_dump($_SESSION);
?>
</body>
</html>


Спустя 6 часов, 40 минут, 40 секунд (18.12.2011 - 18:29) TrogWarZ написал(а):
Ошибка успешно найдена собственными усилиями.
Решилось путём добавления отдельной формы со скрытым значением для кнопки выхода, а так же добавлением проверки (а не только установления) сессий в заголовок.
Верный, работающий код, ниже:

<?
session_start();
if ($_POST['logout']) {
session_unset();
}
?>
<!DOCTYPE html>
<html>
<head>
<title>
test sessions</title>
<meta
http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<?php

$testbox = $_POST['testbox'];
$script = $_SERVER['PHP_SELF'];
if (!isset($_SESSION['s_pass'])) {
$_SESSION['s_user'] = $_POST['user'];
$_SESSION['s_pass'] = $_POST['pass'];
}
$s_user = $_SESSION['s_user'];
$s_pass = $_SESSION['s_pass'];
$host = 'localhost';
$user = $_POST['user'];
$pass = $_POST['pass'];
function connect($host, $s_user, $s_pass) {
$connection = mysql_connect($host, $s_user, $s_pass);
if (!$connection) {
die (mysql_error());
}
}

if (!($s_user AND $s_pass)) {
echo('
<form name="login" action="'
.$script.'" method="POST">
<input type="text" name="user" placeholder="user"/><br/>
<input type="password" name="pass" placeholder="pass"/><br/>
<input type="submit" value="Login"/>
</form>
'
);
}
if ($s_user AND $s_pass) {
connect($host, $s_user, $s_pass);
echo ('
<form name="checkboxform" action="'
.$script.'" method="POST">
<input type="checkbox" name="testbox"/>
<input type="submit" name="checkboxform" value="CheckboxButton"/>
</form>
<form action="'
.$script.'" method="POST">
<input type="hidden" value="1" name="logout"/>
<input type="submit" value="GTFO"/>
</form>
'
);
}
echo '<hr/>testbox = '.$testbox.'<br/>';
?>
</body>
</html>

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.