Ниже представлен код, в котором работают сессии, но я не могу понять: как сделать кнопку для выхода (разлогина)? В коде же есть эта кнопка, но она не работает.
Подскажите, пожалуйста, почему не работает эта кнопка и как сделать не кривой выход из сессии чтобы при нажатии кнопки выхода юзверю показалась главная форма с окном ввода логина/пароля?
Сейчас этот код по нажатию кнопки выхода в адресную строку отправляет просто "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
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 написал(а):
Так надо обрабатывать входящие данные:
и проверять потом, на какое действие реакция.
чтобы не было ошибок Undefined index
По логике скрипта, не особо понятно, что делается
Вот этой кнопке
добавь атрибут name, чтобы идентифицировать форму, которая сабмитится.
$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, чтобы идентифицировать форму, которая сабмитится.
То бишь, так? Эту часть с двумя сабмитками я не особо понял
ps: в строке №43 в сабже написано [name="textbox"]. Это форумная очепятка и в коде написан верный вариант (testbox).
Пробовал чистить куки/кэш для локалхоста (они, кстати, появляются через секунду после очистки, сами) при выключенных 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 всё открывается как было (то есть, без дополнительной строки), хотя куки/кэш почищены и скрипт открыт заново под другим именем.
Грешу на сессии, но увы, моих знаний сейчас недостаточно для того, чтобы решить эту проблему.
> давольно нелепое заявление.
Я знаю, но не понимаю - как после изменения кода в 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
На всякий случай, прилагаю код:
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
Правильная здесь: 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. Да и юзверя в мускуле создал специального под тесты - с правами доступа только к одной единственной базе
Спустя 2 минуты, 12 секунд (17.12.2011 - 13:39) Guest написал(а):
Ну и про htmlentities(), mysql_real_escape_string(), проверку по регэксам тоже не забываю.
В данном примере не могу понять почему не работают сессии - вот и написал простой скрипт без шелухи. Реальная задача размером в 500+ строк.
В данном примере не могу понять почему не работают сессии - вот и написал простой скрипт без шелухи. Реальная задача размером в 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 тогда, когда пользователь нажимает кнопку
Логика такова:
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 без прибегания к помощи 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>