Как закрыть сессию в PHP по нажатию кнопки?

интернет программирование программы php веб дизайн

Доброго времени суток!
Ниже представлен код, в котором работают сессии, но я не могу понять: как сделать кнопку для выхода (разлогина)? В коде же есть эта кнопка, но она не работает (почему?).
Подскажите, пожалуйста, почему не работает эта кнопка и как сделать не кривой выход из сессии чтобы при нажатии кнопки выхода юзверю показалась главная форма с окном ввода логина/пароля?
Сейчас этот код по нажатию кнопки выхода в адресную строку отправляет просто "localhost/test.php?", то есть, без должных "gtfo=true". Но даже несмотря на это, если вручную всё дописать, то выхода не происходит.
s_user и s_pass - для того, чтобы передать данные из $_SESSION[] в connect().
Спасибо.
-------------------------------------------------------------------------
<?php
session_start();
?>
<!DOCTYPE html>
<html>
<head>
<title>test</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;
mysql_close($connection);
if ($gtfo == TRUE) {
unset($_SESSION['s_user'], $_SESSION['s_pass']);
session_unset();
session_destroy();
}
?>
</body>
</html>

Примечание:
NetRain, cgfсибо Вам за продробные объяснения! Предпочитаю принцип изучения "делай, находи ошибки, исправляй, делай и никому не мешай пока не научишься делать без ошибок с пониманием почему".

Да, с mysql_close() я действительно глупую ошибку совершил, но не увидел.

Про URL формы и GET не знал, спасибо! Думал сделать переход обычной конкатенацией адреса.
Про скрытую форму. Если она будет принимать всегда TRUE, то я правильно понимаю, что необходимо будет создать вторую, отдельную от чекбокса, форму для скрытого поля логаута и кнопки этого действия?

Примечание:
Насчёт session_destroy(). Достаточно ли будет просто перенести условие разрушения сессии в часть кода сразу после session_start() - до любого вывода?

Примечание:
Ошибка успешно найдена собственными усилиями.
Решилось путём добавления отдельной формы со скрытым значением для кнопки выхода, а так же добавлением проверки (а не только установления) сессий в заголовок.
Верный, работающий код, ниже:
[code]
<?
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>
[/code]

Примечание:
NetRain, спасибо Вам за наводку и полное описание! Это очень помогло в решении и в процессе понимания.
Ответы:
Не может работать у вас кнопка, потому как вы уже начали тело ответа выводить и заголовки уже не могут быть установлены.
session_destroy(), как и session_start() или вообще любая функция, работающая с заголовками, должны вызываться до начала вывода.
Ну и кнопка не ведет на ?gtfo=true, потому как URL, по которому передаются данные и по которому выполняется переход из формы, указывается в поле action самой формы. А у вас там просто action="'.$script.'"
И еще, если вы передаете форму методом GET, то все GET-параметры из поля action будут проигнорированы браузером, поэтому вам надо либо кнопку обозвать иначе (<input type="submit" name="gfto" value="true" />), но это не совсем по-человечески, либо дополнительное скрытое поле добавить (<input type="hidden" name="gfto" value="true"/>).
Кстати,
mysql_close($connection) работать тоже не будет - переменная $connection существует только в функции connect(), вне функции этой переменной нет.
К тому же, connect() вызывается только при выполнении одного определенного условия, а mysql_close - всегда. Даже если вы исправите первую ошибку, как сможет работать mysql_close, если соединение не было установлено (вследствии того, что не было выполнено условие, при выполнении которого будет устанавливаться соединение).
Все это может привести к появлению ошибок. И даже если ошибки не будут выведены (скрыты в скрипте, либо в php.ini вывод отключен будет) и выполнение скрипта не будет остановлено, все равно ошибки будут сгенерированы и обработаны внутри PHP, соответственно вы теряете производительность.


13 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.