[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Не работает авторизация.
McLotos
Все привет, я опять с вопросом. У меня не работает авторизация, точнее сказать в один прекрасный день она просто перестала работать. Код перепроверил, всё логично, нигде никаких багов не заметно, но не работает.
Может кто-нибудь подскажет что не так?
Выкладываю все скрипты, которые даже косвенно связаны с процессом авторизации. Пожалуйста, если не трудно, ознакомьтесь. 3 дня бьюсь, но так ничего и не нашёл.
Index.php
Свернутый текст
<?PHP session_start();
require './system/config.php'; //подключаем файл конфигураций

if (empty($cfg['mysqlhost']) && empty($cfg['mysqldb']))
{
header('Location: install.php');
exit;
}

ini_set('display_errors',1);
error_reporting(E_ALL);
require './system/header.php'; //подключаем шапку

//в зависимости от времени суток подобрать нужное приветствие

switch ($m)
{
case '1':$hellomsg = '{text.morning}';break;
case '2':$hellomsg = '{text.day}';break;
case '3':$hellomsg = '{text.evening}';break;
}
//перевести всю текстовую информацию на странице на нужный пользователю язык
$wellcome = Lang::evaluate($hellomsg,$L);
$hello = Lang::evaluate('{text.hello}',$L);
$logint = Lang::evaluate('{text.login}',$L);
$passw = Lang::evaluate('{text.passw}',$L);
$secur = Lang::evaluate('{text.secur}',$L);
$button= Lang::evaluate('{text.button}',$L);

//массив для передачи в шаблон
$arr = array
(
'HELLO' => $hello,
'LOGIN' => $logint,
'PASSWORD' => $passw,
'SECURITY' => $secur,
'BUTTON'=> $button,
'Wellcome'=>$wellcome,
);

require './system/core/index/index.inc.php';
?>

header.php
Свернутый текст
<?PHP
$browser=$_SERVER['HTTP_USER_AGENT'];
if ($browser=stristr($_SERVER['HTTP_USER_AGENT'], 'Chrome'))
{
//проверяем который час. от этого зависит множество параметров
$h = date('H');
if (($h>0)and ($h<7))
{$t = '1';}
if ($h>18)
{$t = '2';}
if (($h>6)and ($h<18))
{$t = '3';}
//подбираем нужное сообщение
switch ($t)
{
case '1':$timemsg = '{time.early}';break;//типа вы пришли слишком рано
case '2':$timemsg = '{time.late}';break; //типа рабочий день закончен
case '3':$timemsg = '{time.checked}';break;
}

//блок подключения скриптов
require './system/config.php'; //конфигурация
require './system/classes/lang.class.php';//языковой класс
require './system/classes/template.class.php';//шаблонизатор
require './system/functions.php';//функции
require './system/functions.db.php';//функции для работы с БД
require './system/functions.admin.php';//функции для панели админа
//конец блока

//подключаемся к БД

connect($cfg['mysqlhost'],$cfg['mysqluser'],$cfg['mysqlpassword'],$cfg['mysqldb']);


//блок подготовки констант
//создаём переменную для языковой панели

define("SLANG",'<a href="?lang=en"><img src="system/img/gb.png"></a> <a href="?lang=kz"><img src="system/img/kz.png"></a> <a href="?lang=ru"><img src="system/img/ru.png"></a>');
//конец блока

//проверяем выбран ли язык пользователя

//если в сессии висит язык, установить его

if (!empty ($_SESSION['lang']))
{require './system/langs/'.$_SESSION['lang'].'/main.lang.php';}

//если язык в сессии отличается от языка в get, выбрать язык get
if ((isset ($_GET['lang']))&&($_GET['lang']!==$_SESSION['lang']))
{$_SESSION['lang']=$_GET['lang'];
require './system/langs/'.$_SESSION['lang'].'/main.lang.php';}

//если в get языка нет, и в сессии язык не выбран, установить русский.
if ((!isset ($_GET['lang']))&&(empty ($_SESSION['lang'])))
{require 'system/langs/ru/main.lang.php';}

//проверяем выбран ли у пользователя свой скин
if (!empty($_SESSION['skin']))
{$userskin=$_SESSION['skin'];}
else
{$userskin='default';}

//создаём новый экземпляр класса Template
$tpl = new Template('./templates/'.$userskin.'/header.tpl');

if (!empty($_SESSION['NewMessages']))
{$Messages=Lang::evaluate('{user.messages}',$L);}

//подключаем новый экземпляр языкового класса
$timer = Lang::evaluate($timemsg,$L);

//создаём массив переменных интерфейса.
$arr = array
(
'TIME' => $timer,
'LANG' => SLANG,
);


//эту строку лучше не трогать =)
$s="173/No*n\АС.lbp-1]2ВC1[Фe{г5т}5шт3п'10.";
//она используется при регистрации и авторизации пользователей
//$time это time() на момент регистрации пользователя
//$password=md5(md5($pass.$time.$s))

//проверяем авторизован ли пользователь, и строим страницу.

//если в сессии нет id

if (empty($_SESSION['uid']))
{ $block='guest'; //выбирваем гостевой блок во всех tpl файлах
$tpl->assign('HEADER', $arr);
$tpl->parse($block);
$tpl->out($block);
}
else
{
//если это не гость
//перевести меню на нужный язык

$HeadMenu=Lang::evaluate($_SESSION['HeadMenu'],$L);
$LeftMenu=Lang::evaluate($_SESSION['PersonalMenu'],$L);
$RightMenu=$_SESSION['RightMenu'];

//создаём ещё один массив для передачи в класс
if ($_SESSION['group']=='Administrators')
{
$arr2 = array
(
'LeftMenu' => $LeftMenu,
'HeadMenu' => $HeadMenu,
'RightMenu'=> $RightMenu,
'DirList'=>dir_list($dir)
);

}

elseif ($_SESSION['group']!=='Administrators')
{$arr2 = array
(
'LeftMenu' => $LeftMenu,
'HeadMenu' => $HeadMenu,
'RightMenu'=> $RightMenu
);
}

//если пользователь авторизовался меняем значение блоков
//устанавливаем значение блока MeMber

$block='member';

//берём оба массива и строим страницу
$tpl->assign('HEADER', $arr);
$tpl->assign('MENU', $arr2);

//так как шаблон разворвачивается изнутри, сначала парсим внутренний блок
$tpl->parse($block.'.'.$_SESSION['group']); //этот блок зависит от группы пользователя

//теперь "под нож" попадает основной блок

$tpl->parse($block); //этот блок зависит от страницы, на которой находится юзер
$tpl->out($block);//выводим.
} //конец блока для пользователя
}//конец

elseif ($browser!=='Chrome')
{header('Location:http://google.ru/chrome');}

Index.inc.php
Свернутый текст
<?PHP
//если блок назвали Гость
if ($block=='guest')
{
//подключить авторизацию и переименовать блок
require './system/core/users/users.auth.php';

$block='auth';
$tpl = new Template('./templates/'.$userskin.'/index.tpl');

$tpl->assign('TEXT', $arr);
$tpl->parse('home.'.$block); //блок авторизации находится внутри основного блока
$tpl->parse('home');
$tpl->out('home');
}
elseif ($block!=='guest')

{
//если это не гость, тогда не переключаемся в гостевой блок, а берём основной
$block='home';
$tpl = new Template('./templates/'.$userskin.'/index.tpl');

$tpl->assign('TEXT', $arr);
$tpl->assign('MENU', $arr2);

if ($_SESSION['group']=='Administrators')
{//если это админ, тогда берём блок номе, в нём ищем подблок Админ, а в Админ ищём подгруппу
//например CoreAdmin или DBAdmin или TemplateAdmin

$tpl->parse($block.'.'.$_SESSION['group'].'.'.$_SESSION['sGroup']);
$tpl->parse($block.'.'.$_SESSION['group']);
$tpl->parse($block);
$tpl->out($block);}

elseif ($_SESSION['group']!=='Administrators')
{//если это не админ, но пользователь
$tpl->parse($block.'.'.$_SESSION['group']);
$tpl->parse($block);
$tpl->out($block);
}
}

users.auth.php
Свернутый текст
<?PHP
if (isset($_POST['submit'])) //если нажата кнопка входа

{ $login = stripslashes($_POST['login']); //убираем экранирование
$login = htmlspecialchars($login); //проверяем на наличие спец символов
$password = stripslashes($_POST['password']); //убираем экранирование
$password = htmlspecialchars($password); //проверяем на наличие спец символов
$login = trim($login); //убираем пробелы
$password = trim($password); //убираем пробелы

if ((!empty($login))&&(!empty($password)))
{auth($login,$password,$s);}//вызываем функцию
}

functions.php
Свернутый текст
<?PHP
//функция-ссылка авторизации
function auth($login,$password,$s)
{
if ((!empty($login))&&(!empty($password)))
{require './system/config.php';
find_time($login,$password,$s); //если логин и пароль не пустые и не равны 0, найти время регистрации
}
}


//функция проверяет существование логина и шифрует пароль для дальнейшей обработки
function find_time($login,$password,$s)
{
require './system/config.php';
$check = mysql_query("SELECT `Time`
FROM "
.$db_members."
WHERE `Login`='"
.$login."'");
$checked = mysql_fetch_assoc($check);

$pass=md5(md5($password).$checked['Time'].$s); //зашифровать пароль

info($login,$pass); //передать логин и пароль для получения информации о пользователе
}

//функция вытягивает всю информацию по пользователю
function info($login,$pass)
{
require './system/config.php';
$h = date('H');

if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"),"unknown"))
$ip = getenv("HTTP_CLIENT_IP");

elseif (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
$ip = getenv("HTTP_X_FORWARDED_FOR");

elseif (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
$ip = getenv("REMOTE_ADDR");

elseif (!empty($_SERVER['REMOTE_ADDR']) && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
$ip = $_SERVER['REMOTE_ADDR'];

else
$ip = 'unknown';

$info=mysql_query("SELECT *
FROM "
.$db_members."
WHERE `Login`='"
.$login."' and `Password`='".$pass."'");
$user=mysql_fetch_assoc($info);

$_SESSION['uid']=$user['uid']; //идентификатор пользователя
$_SESSION['lName']=$user['Lastname'];//фамилия пользователя
$_SESSION['fName']=$user['Firstname'];//имя пользователя
$_SESSION['mName']=$user['Middlename'];//отчество пользователя
$_SESSION['BDate']=$user['BDate'];//дата рождения пользователя
$_SESSION['lang']=$user['lang'];//язык пользователя

if (!empty($user['group']))//если существует группа пользователя
{myMenu($user['group']); //найти меню пользователя
MyGroup($user['group']);} //проверить уровень доступа пользователя

if (!empty($user['lGroup'])) //если пользователь зарегистрирован в учебной группе
{lgroup($user['lGroup']);}//найти информацию по группе

if (!empty($user['skin'])) //если существует скин пользователя
{find_skin($user['skin']);} //найти информацию по скину пользователя

if ($user['logined']=='1')//если пользователь уже авторизован
{session_destroy();}//разрушить сессию

elseif(empty($user['logined'])) //если нет, зарегистрировать вход пользователя
{
//указать в таблице пользователей что он авторизован
$auth=mysql_query("UPDATE ".$db_members."
SET `logined`='1'
Where `uid`='"
.$_SESSION['uid']."'");
//узнать входил ли он ранее
$vis=mysql_query("SELECT *
FROM "
.$db_visits."
WHERE `uid`='"
.$_SESSION['uid']."'");
$res=mysql_fetch_assoc($vis);

if (empty($res))
{
//если пользователь впервые здесь добавить информацию в БД
$visit=mysql_query("INSERT INTO ".$db_visits."
(`DateIn`,`IP`,`Count`,`uid`)
VALUES
('"
.date("d/m/y - ".$h.":i")."','".$ip."','1','".$_SESSION['uid']."')");
}
elseif(!empty($res))
{//если он здесь уже был, обновить данные о последнем входе
$visup=mysql_query("UPDATE ".$db_visits."
SET `Count`=`Count`+1
WHERE `uid`="
.$_SESSION['uid']."");
}
}
}


//если это ученик, тогда получить информацию по его группе
function lgroup($lgroup)
{require './system/config.php';

$lgroups=mysql_query("SELECT *
FROM "
.$db_group."
WHERE gid='"
.$lgroup."'");

$rgroups=mysql_fetch_assoc($lgroups);
if (!empty ($rgroups['gName']))
{$_SESSION['lgName']=$rgroups['gName'];} //сохраняем в сессию название моей учебной группы

if (!empty($rgroups['Teacher']))
{$sql=mysql_query("SELECT `uid`
FROM "
.$db_members."
WHERE `uid`='"
.$rgroups['Teacher']."'");
$res=mysql_fetch_assoc($sql);
$_SESSION['MyTeach']=$res['uid'];} //сохраняем в сессию id моего куратора

if ((!empty ($rgroups['HOG']))&&($rgroups['HOG']!==$_SESSION['uid']))
{//если в группе существует староста, и это не я, тогда найти кто староста
$sql=mysql_query("SELECT `uid`
FROM "
.$db_members."
WHERE `uid`='"
.$rgroups['HOG']."'");
$res=mysql_fetch_assoc($sql);

$_SESSION['MyHOG']=$res['uid'];} //сохраняем в сессию ID моего старосты
}

//ищем скин пользователя
function find_skin($skinid)
{require './system/config.php';

if (!empty($skinid))
{$myskin=mysql_query("SELECT *
FROM "
.$db_skins."
WHERE ID='"
.$skinid."'");
$skinres=mysql_fetch_assoc($myskin);
$_SESSION['skin']=$skinres['Name'];//сохраняем в сессию имя скина, чтобы патом строить страницы

}
}



//получаем меню
function myMenu($group)
{require './system/config.php';
//у каждого пользователя есть 3 сидв меню
//1. основное меню (уникальное для каждой группы)
//2. персональное меню (настройки профиля, почта и прочее)
//3. дополнительное меню (уникальное для каждой подгруппы)

$sql1=mysql_query("SELECT `Menu`,`PersonalMenu`,`RightMenu`
FROM "
.$db_menu."
WHERE `Access`='"
.$group."'");
$res=mysql_fetch_assoc($sql1);
$_SESSION['HeadMenu']=$res['Menu'];
$_SESSION['PersonalMenu']=$res['PersonalMenu'];
$_SESSION['RightMenu']=$res['RightMenu'];
}

//узнаём группу и подгруппу пользователя (Уровень доступа)
function MyGroup($group)
{require './system/config.php';
//узнаём в какой группе и подгруппе зарегистрирован пользователь
$sql=mysql_query("SELECT *
FROM "
.$db_access."
WHERE `aId`='"
.$group."'");

$res=mysql_fetch_assoc($sql);
$_SESSION['group']=$res['aName'];//основная группа
$_SESSION['sGroup']=$res['saName'];//подгруппа
}

//функция которая проверяет почтовый ящик
function NewMessages()
{require './system/config.php';
//посчитать количество писем где я получатель и статус=0 (новые)
$sql=mysql_query("SELECT COUNT(*)
FROM "
.$db_messages."
WHERE recipient='"
.$_SESSION['uid']."'
and `status`='0'"
);
$counter=mysql_num_rows($sql);

if($counter>0)
{
$_SESSION['NewMessages']=$counter;
}
}




Спустя 14 минут, 20 секунд (27.01.2012 - 12:14) neadekvat написал(а):
Я за всех не скажу - мазахисты тут есть. Но столько кода я за деньги то не всегда готов смотреть.

Давай по порядку - что не работает? Нажимаешь вход - просто обновляется страница? Появляются ли ошибки, если неверные данные? Появляется ли что-то в кукисах, в сессии, в базе, если данные верные?

Спустя 2 часа, 3 минуты, 2 секунды (27.01.2012 - 14:17) inpost написал(а):
пункт №1:
http://phpforum.ru/index.php?showtopic=27289
пункт №2:
Для того, чтобы авторизировать, надо сделать запрос в БД, то есть выбрать запись, и если логин и пароль сошлись, то ты проверяешь на mysql_num_rows. Так вот, эту выборку напиши не mysql_query(""); а die(""); , и на экран выведется твой запрос. С этим запросом в PMA и проверяй, точно ли такие же данные в БД, и правильно ли составлен запрос.

Спустя 2 дня, 17 часов, 18 минут, 23 секунды (30.01.2012 - 07:35) McLotos написал(а):
neadekvat
Ввожу данные, нажимаю кнопку и ничего не происходит. Вообще ничего, даже error_reporting(E_ALL) молчит.
Куки не использую, сессия не регистрируется, в БД обновлений не происходит, т.е. скрипт вообще не срабатывает. =(
Сначала думал что нет сязи между страницей авторизации, и скриптом с функциями, так оно и оказалось (страница авторизации вообще не видит функций), прозвонил все связи, везде всё ок. Если допустим файл functions убрать, то скрипт начинает материться, но саму функцию он почему-то не видит, хотя молчит, т.е. не сообщает что такой функции нет.

inpost
Извини, но я не понял в чём смысл ссылки,с кодировкой у меня всё в порядке, по крайней мере страницы отображаются коректно, кодировка выставлена и в шаблоне, и в скрипте, и в htaccess.
Каждый запрос к БД проверялся дублированием запроса с выводом на экран.
т.е. $result=mysql_query($sql)
if (!$result){echo $sql}
там всё в порядке.

Спустя 18 минут, 10 секунд (30.01.2012 - 07:53) McLotos написал(а):
Я так подозреваю что данный глюк возник из-за самой сложно и самой проблематичной ошибки (ошибки логики), где-то в каком то из скриптов функця объявлена позже, чем обработчик, но блин как теперь отследить. Перелопатить весь код? Жуть, слишком много скриптов где она могла возникнуть.

Спустя 22 часа, 18 минут, 5 секунд (31.01.2012 - 06:11) McLotos написал(а):
Всё оказалось куда прозаичнее. В скриптах ошибок нет, ошибка в шаблоне. Не знаю по какой логике, но дизайнер решил что вот так:
<button type="submit" name="submit" value="submit" id="submit" form="auth_login_form">{TEXT.BUTTON}</button>

будет логичнее чем
<button type="submit" name="submit" value="submit" id="submit" >{TEXT.BUTTON}</button>

поясню в чем проблема.
Кнопка Button и так находится в форме auth_login_form, так он зачем-то добавил в кнопку параметр form="auth_login_form"
А я блин больше недели убил на поиск бага у себя в коде. Поймаю - убью =)


_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
Быстрый ответ:

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