Продлема состоит вот в чем.
Есть у меня 2-а файла.
1-й ( index.php ) - в этом файле у меня отрисована форма, в которую я вношу логин и пароль, и если они правельные то открывается сессия и я могу перейти на другой файл index_cp.php и дальше работать с админ-панелью.
2-й файл ( index_cp.php ) В этом файле я на ООП сделал админку.
Проблемка заключается в том, что когда у меня создается сессия я спокойно захожу в админку и правлю там все что надо. Но потом когда я нажимаю на выход, у меня сесия удаляется, но если я просто впишу адрес той страницы на которой я был до выхода с админки, меня снова запускает в админку, но уже без сессии. Хотя я делал проверку что если сессия пустая, то делал редирект на страничку index.php
Подскажите пожалуйста из-за чего такое может происходить.
Я даже пытался средствами javascript делать редирект если сессия пустая. Но результат остался прежним.
Вот код файла index.php
<?php
require($_SERVER['DOCUMENT_ROOT'].'/administrator/init.php');
if ($_GET['logout'] == 1){
unset($_SESSION['login']);
header('Location: index.php');
}else if($_SESSION['login'] == ""){
header('Location: index.php');
}
if (isset($_SESSION['login'])){
header('Location: index_cp.php?link=1');
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<link rel="stylesheet" href="css/templates.css" type="text/css" />
<title>Вход в админ-панель</title>
</head>
<body>
<center>
<div align="center" class="pages_content" style="margin:10px; padding:8px; background:#f0efef; max-width:200px; border: 1px double #333;">
<form action="<?php $_SERVER['PHP_SELF']; ?>" method="post">
<p>
<label>ЛОГИН:</label>
<input name="login" type="text" size="15" maxlength="15" value="<?php echo $_COOKIE["login"]; ?>" >
</p>
<p>
<label>ПАРОЛЬ:</label>
<input name="password" type="password" size="15" maxlength="15" value="<?php echo $_COOKIE["password"]; ?>">
</p>
<input type="submit" name="submit" value="Войти">
</form>
</div>
</center>
<?php
if ($_SERVER['REQUEST_METHOD']=="POST"){
//заносим введенный пользователем логин в переменную $login, если он пустой, то уничтожаем переменную
if (isset($_POST['login'])) {
$login = $_POST['login'];
if ($login == '') {
unset($login);
}
}
//заносим введенный пользователем пароль в переменную $password, если он пустой, то уничтожаем переменную
if (isset($_POST['password'])) {
$password = $_POST['password'];
if ($password == '') {
unset($password);
}
}
//если логин и пароль введены,то обрабатываем их, чтобы теги и скрипты не работали, мало ли что люди могут ввести
$login = stripslashes($login);
$login = htmlspecialchars($login);
$password = stripslashes($password);
$password = htmlspecialchars($password);
//удаляем лишние пробелы при помощи функции ( trim )
$login = trim($login);
$password = trim($password);
$conn = new login($login, $password);
$conn->wevLogin();
}
?>
</body>
Вот код файла index_cp.php
<?php
require($_SERVER['DOCUMENT_ROOT'].'/administrator/init.php');
require($_SERVER['DOCUMENT_ROOT'].'/administrator/domen.js');
if (!isset($_SESSION['login'])){
echo "<script type='text/javascript'>
function getRedirect(){
window.location = 'http://' + domen + '/administrator/index.php';
}
window.onload = function(){
setTimeout('getRedirect()', 1000);
}
</script>";
}else if($_SESSION['login'] == ""){
echo "<script type='text/javascript'>
function getRedirect(){
window.location = 'http://' + domen + '/administrator/index.php';
}
window.onload = function(){
setTimeout('getRedirect()', 1000);
}
</script>";
//header('Location: index.php');
}
?>
<head>
<link rel="stylesheet" href="css/templates.css" type="text/css" />
<script type="text/javascript" src="ckeditor/ckeditor.js"></script>
<script type="text/javascript" src="js/clock.js"></script>
</head>
<body onLoad="startTime()" bgcolor="#f7f7f7">
<table width="90%" border="0" align="center" >
<tr>
<td>
<div class="top-line" align="right">
<div id="time" class="time" align="center"></div>
</div>
</td>
<td rowspan="2" align="center">
<?php
echo "<div class='menu' style='padding:10px; height:0px; width:0px;'>";
echo "<center><a href='./index.php?logout=1'><font color=red>Виход</font></a></center>";
echo "</div>";
?> </td>
</tr>
<tr>
<td style="border-bottom:2px solid #999999; ">
<?php
$menu = new Menu_admin();
$menu->MenuLink();
?>
</td>
</tr>
<tr>
<td width="91%">
<?php
$menu->MenuWev();
?>
</td>
<td width="9%" rowspan="2">
</td>
</tr>
<tr>
<td>
<?php
//Подключение к классу articles, изменение и удаление статей
$articles = new while_Articles();
$articles->wevArticles_edit();
$articles->wevArticles_del();
?>
<?php
//Подключение к mod_menu
$menu_admin = new adminMenu();
//$menu_add = new adminMenuAdd();
?>
<?php
//Тут отрисовывается обьект сортировки меню, если мы конечно редактируем порядок показа. Если нет, то он нигде не отобразится.
$listEdit = new listEdit();
$listEdit->editList();
?>
</td>
</tr>
</table>
</body>
Вот код класса который запускает сессию login.class.php
<?php
require($_SERVER['DOCUMENT_ROOT'].'/administrator/init.php');
class login {
protected $login;
protected $pass;
//////////////////// Создал конструктор и наследование конструктора от класса Conn и передал в него еще 2-е переменные /////////////////////////
public function __construct($l,$p){
//Обрабатываем свойство - (переменная) $l
try{
if(empty($l)) throw new Exception ("<center><div class='pages_content' style='background-color:#DBDBDB; width:600px;' align='center'><font color=red><h2>Логин небыл введен</h2></font></div></center>");
}catch(Exception $login){
echo $login->getMessage();
return '';
}
/////////////////////////////////////////
//Обрабатываем свойство - (переменная) $p
try{
if(empty($p)) throw new Exception ("<center><div class='pages_content' style='background-color:#DBDBDB; width:600px;' align='center'><font color=red><h2>Пароль небыл введен</h2></font></div></center>");
}catch(Exception $pass){
echo $pass->getMessage();
return '';
}
/////////////////////////////////////////
$this->login = trim(strip_tags(stripcslashes($l)));
$this->pass = trim(strip_tags(stripcslashes($p)));
}
//////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////
//////////////////////////////////////// Данный метод обрабатывает переменные из конструктора и запускает в админ - панель ///////////////////////
public function wevLogin(){
global $db_conn;
$sql = "SELECT `login`, `pass` FROM `user`";
if($result = $db_conn->query($sql)){
$row = $result->fetch_array();
if($this->login == $row['login'] and $this->pass == $row['pass']){
echo "<center>";
echo "<div class='pages_content' style='background-color:#DBDBDB; width:600px;'>";
$_SESSION['login'] = $this->login;
//$_SESSION['pass'] = $this->pass;
echo "<br /><br /><center><font color=blue><h2>Логин и пароль проверенны, вы можете перейти в панель администрирования <br> <a href='index_cp.php?link=".intval(1)."'> Перейти в панель редагування</a></h2></font></center><br /><br />";
echo "</div>";
echo "</center>";
}else{
echo "<center>";
echo "<div class='pages_content' style='background-color:#DBDBDB; width:600px;'>";
echo "<br /><br /><center><font color=blue><h2>Логин и пароль не верные. Проверте правильность вводимых данных</a></h2></font></center><br /><br />";
echo "</div>";
echo "</center>";
}
}
$result->close();
}
}
?>
Спустя 6 минут, 43 секунды (8.06.2012 - 12:55) Игорь_Vasinsky написал(а):
Цитата |
<form action="<?php $_SERVER['PHP_SELF']; ?>" method="post"> |
и
Цитата |
if ($_SERVER['REQUEST_METHOD']=="POST"){ |
что должно произойти, если ты так сомневаешься?
Цитата |
if (!isset($_SESSION['login'])){ echo "<script type='text/javascript'> function getRedirect(){ window.location = 'http://' + domen + '/administrator/index.php'; } window.onload = function(){ setTimeout('getRedirect()', 1000); } </script>"; |
и
Цитата |
}else if($_SESSION['login'] == ""){ echo "<script type='text/javascript'> function getRedirect(){ window.location = 'http://' + domen + '/administrator/index.php'; } window.onload = function(){ setTimeout('getRedirect()', 1000); } </script>"; //header('Location: index.php'); } |
ни чё не смущает?
Спустя 7 минут, 3 секунды (8.06.2012 - 13:02) kolyabis написал(а):
Конечно смущает, я уже переписывал этот код раз 20 и постоянно по разному.
Делал просто вот такую проверку
Делал просто вот такую проверку
if (!isset($_SESSION['login'])){
header('Location: index.php');
}
Спустя 1 минута, 16 секунд (8.06.2012 - 13:04) kolyabis написал(а):
Делал вот такую проверку.
if(empty($_SESSION['login'])){
header('Location: index.php');
}
Спустя 2 минуты, 37 секунд (8.06.2012 - 13:06) Игорь_Vasinsky написал(а):
логику приложения делай проще
пара логин и пароль совпали - создай сессионый массив, переадресуй в админку.
в админке - есть нужный элемент сессионого массива - велком, нету - гетаут куикли.
пара логин и пароль совпали - создай сессионый массив, переадресуй в админку.
в админке - есть нужный элемент сессионого массива - велком, нету - гетаут куикли.
Спустя 15 минут, 56 секунд (8.06.2012 - 13:22) kolyabis написал(а):
Дело в том что у меня для админки идет проверка только по логину.
Тоесть если у меня совпала пара ( логин и пароль ) , то я открываю сессию только по логину.
А в админке я проверяю, если сессия по логину есть, то что то делать, а если сессия по логину пустая, то делать редирект.
По этому мне не надо передавать массив, так как если пусто то просто надо чтоб выплевывало обратно. А так как делал на ООП, то у меня всего одна страничка для всего сразу, тоесть если я буду переходить по всем ссылкам, то все равно этот код должен обрабатыватся, так как он будет всегда у меня на одной страничке.
Тоесть если у меня совпала пара ( логин и пароль ) , то я открываю сессию только по логину.
А в админке я проверяю, если сессия по логину есть, то что то делать, а если сессия по логину пустая, то делать редирект.
По этому мне не надо передавать массив, так как если пусто то просто надо чтоб выплевывало обратно. А так как делал на ООП, то у меня всего одна страничка для всего сразу, тоесть если я буду переходить по всем ссылкам, то все равно этот код должен обрабатыватся, так как он будет всегда у меня на одной страничке.
Спустя 2 минуты, 46 секунд (8.06.2012 - 13:25) Игорь_Vasinsky написал(а):
да какая разница по чему проверять? по логину так по логину.
1. ввод данных
2. провека на совпадение вводимых данных
да
нет
3. нет - сказал что не подходит
3. да - создал сессию и запустил в админку, где в свою очередь проверил - есть ли в сессии логин
1. ввод данных
2. провека на совпадение вводимых данных
да
нет
3. нет - сказал что не подходит
3. да - создал сессию и запустил в админку, где в свою очередь проверил - есть ли в сессии логин
Спустя 27 минут, 12 секунд (8.06.2012 - 13:52) kolyabis написал(а):
Сделал вот такую проверку. Отрабатывает все как надо, единственное что не делает переадрисацию.
if(isset($_SESSION['login'])){
echo "Есть сессия";
if($_SESSION['login'] == "admin" ){
echo "CОВПАДАЕТ СЕССИЯ";
}else{
echo "НЕ СОВПАДАЕТ СЕССИЯ";
}
}else{
header('Location: index.php');
}
Спустя 3 минуты, 53 секунды (8.06.2012 - 13:56) Игорь_Vasinsky написал(а):
выше этого куска кода нет? если есть - то там не должно быть никакого вывода: echo, print, html и естественно конфликт с session_start() - выход - делать редирект на JS
Спустя 2 минуты (8.06.2012 - 13:58) kolyabis написал(а):
Выше этого куска кода, у меня только вот такие строки.
session_start();
require($_SERVER['DOCUMENT_ROOT'].'/administrator/init.php');
require($_SERVER['DOCUMENT_ROOT'].'/administrator/domen.js');
Спустя 26 минут, 54 секунды (8.06.2012 - 14:25) kolyabis написал(а):
Всем спасибо, особенно Игорь_Vasinsky
Проблемка заключалась в том что проверка стояла после подключения файла init.php
Хоть в правилах и написано что недолжно быть ни пробелов ни echo, print.
Для того чтоб код работал, оказывается что не совсем так, еще надо чтоб проверка на подобные сессии и кукисы должна быть сразу после вызова функции session_start();
Проблемка заключалась в том что проверка стояла после подключения файла init.php
Хоть в правилах и написано что недолжно быть ни пробелов ни echo, print.
Для того чтоб код работал, оказывается что не совсем так, еще надо чтоб проверка на подобные сессии и кукисы должна быть сразу после вызова функции session_start();
Спустя 1 минута, 31 секунда (8.06.2012 - 14:27) Игорь_Vasinsky написал(а):
да, пустых строк не должно быть ранее посылаемого заголовка.
Спустя 6 минут, 23 секунды (8.06.2012 - 14:33) kolyabis написал(а):
У меня их и не было.
Вот код моего init.php
Вот код моего init.php
<?php session_start();
header("Content-Type: text/html; charset=cp1251");
require_once(dirname(__FILE__). '/../class/Conn.class.php');
require_once(dirname(__FILE__). '/../class/LogoHead.class.php');
require_once(dirname(__FILE__). '/../class/menu.class.php');
require_once(dirname(__FILE__). '/../class/menuContent.class.php');
Спустя 11 минут, 56 секунд (8.06.2012 - 14:45) Игорь_Vasinsky написал(а):
а в них?
Цитата |
require_once(dirname(__FILE__). '/../class/Conn.class.php'); require_once(dirname(__FILE__). '/../class/LogoHead.class.php'); require_once(dirname(__FILE__). '/../class/menu.class.php'); require_once(dirname(__FILE__). '/../class/menuContent.class.php'); |
Спустя 7 минут, 55 секунд (8.06.2012 - 14:53) kolyabis написал(а):
Тоже нет. Я классы писал таким образом чтоб в них вообще не было echo или print я return везде использовал чтоб возвращать данные, а потом другими внутренними классами их обрабатываю. Вот по этому то я и удивился так. Потому что вообще выводов небыло.
Спустя 2 минуты, 59 секунд (8.06.2012 - 14:56) Игорь_Vasinsky написал(а):
классы и функции тут не страшны)) они вызываются и в другом месте как правило и имеют свою локальную область видимости, т.е. что внутри них - не видно снаружи.