Всем доброго времени суток! Сейчас пишу простенький сайт, дошел до авторизации, решил не заморачиваться, просто база с пользователями, отсылаем через ajax, обновляем страницу и записываем в переменную $_SESSION, потом сравниваем, если в сессии что-то есть выводим контект личного кабинета. Вроде все написал, проверил, все работает, на телефоне проверил, тоже работает, на другом компьютере проверил все работает, ну думаю раз на 3 машинах работает можно отсылать. Позже узнаю, что сначала 1 пользователь не может зайти, потом 2, сам проверил удаленно и действительно, не записываются данные в $_SESSION, все уже перепробовал не пишутся и все.. Вот код, который проверяет PHP: <?php session_start(); if (isset($_SESSION['login']) && isset($_SESSION['id'])):?> <h2 align="center">Личные данные</h2> <?php print_r($_SESSION); ?> <?php else: ?> <div class="login" align="center"><h2>Авторизация на сайте:</h2> <form id="formx" method="post" action=""> Логин: <input type="text" name="login" style="margin-right: -1px;"><br> Пароль: <input type="password" name="password"><br> <input id="submit" type="submit" name="submit" value="Войти"> </form> </div> <?php print_r($_SESSION); ?> <div id="rez"></div> <?php endif ?> Вот обработчик PHP: if(isset($_POST['login']) and isset($_POST['password'])){ include('asset.php'); if (empty($_POST['login'])) // Если поле логин пустое { echo '<div class="red">Поле логин не заполненно!</div>'; // То выводим сообщение об ошибке } elseif (empty($_POST['password'])) // Если поле пароль пустое { echo '<div class="red">Поле пароль не заполненно!</div>'; // То выводим сообщение об ошибке } else // Иначе если все поля заполненны { $login = $_POST['login']; // Присваиваем переменной значение из поля с логином $password = $_POST['password']; // Присваиваем другой переменной значение из поля с паролем $loginCheckDb = $con->query("SELECT `id`, `status` FROM `users` WHERE `login` = '$login' AND `password` = '$password'") or die($con->error); $loginCheckDbROW = $loginCheckDb->fetch_assoc(); $id_db=$loginCheckDbROW['id']; $status=$loginCheckDbROW['status']; if (empty($id_db)) // Если запрос к бд не возвразяет id пользователя { echo '<div class="red">Неверные Логин или Пароль!</div>'; // Значит такой пользователь не существует или не верен пароль } else // Если возвращяем id пользователя, выполняем вход под ним { session_start(); //$_SESSION['password'] = $password; // Заносим в сессию пароль $_SESSION['login'] = $login; // Заносим в сессию логин $_SESSION['id'] = $id_db; // Заносим в сессию id $_SESSION['status'] = $status; //header('Location: http://localhost/login'); print_r($_SESSION); echo '<script>location.reload();</script>'; echo '<div class="gren">Вы успешно вошли в систему: '.$_SESSION['login'].'</div>'; // Выводим сообщение что пользователь авторизирован } } }else echo '<div class="red">Ошибка отправки данных!</div>'; Вот ajax Код (Javascript): $(document).ready(function(){ $('#submit').click(function(e){ e.preventDefault(); var msg = $('#formx').serialize(); $.ajax({ type: 'post', url: 'http://localhost/assets/php/login.php', data: msg, success: function(data) { $('#rez').html(data); /*location.reload();*/ }, }); }) }); Что получается у тех, кто жалуется: 1.Они вводят правильный логин и пароль 2.Запрос отсылается на обработчик 3.Возвращается строка: Вы успешно вошли в систему: Логин, который ввел пользователь 4.Страница обновляется 5.Проверяется условие if (isset($_SESSION['login']) && isset($_SESSION['id'])): 6.Выводится форма авторизации, поскольку нет переменных. Ткните в чем проблема может быть, я уже и <?php session_start(); ?> в разные места пробовал и в самое начало, все равно тоже самое, прям какой-то парадокс, причем скачал те же браузеры, что у них, у меня все работает, а у них нет...
Да, в логах ни чего не нашел.. access Код (Text): IP - - [26/Feb/2017:22:36:50 +0300] "GET /assets/image/icon-2.svg HTTP/1.1" 304 180 "http://host.ru/assets/css/style.css" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 YaBrowser/17.3.0.1785 Yowser/2.5 Safari/537.36" IP - - [26/Feb/2017:22:36:50 +0300] "GET /assets/image/icon-3.svg HTTP/1.1" 304 181 "http://host.ru/assets/css/style.css" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 YaBrowser/17.3.0.1785 Yowser/2.5 Safari/537.36" IP - - [26/Feb/2017:22:36:50 +0300] "GET /assets/image/icon-4.svg HTTP/1.1" 304 181 "http://host.ru/assets/css/style.css" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 YaBrowser/17.3.0.1785 Yowser/2.5 Safari/537.36" IP - - [26/Feb/2017:22:36:50 +0300] "GET /assets/image/icon-5.svg HTTP/1.1" 304 180 "http://host.ru/assets/css/style.css" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 YaBrowser/17.3.0.1785 Yowser/2.5 Safari/537.36" IP - - [26/Feb/2017:22:36:50 +0300] "GET /assets/image/bg.gif HTTP/1.1" 304 180 "http://host.ru/assets/css/style.css" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 YaBrowser/17.3.0.1785 Yowser/2.5 Safari/537.36" 127.0.0.1 - - [26/Feb/2017:22:36:59 +0300] "OPTIONS * HTTP/1.0" 200 126 "-" "Apache/2.4.10 (Debian) (internal dummy connection)" IP - - [26/Feb/2017:22:44:07 +0300] "POST /login HTTP/1.1" 200 3496 "http://host.ru/login" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 YaBrowser/17.3.0.1785 Yowser/2.5 Safari/537.36" IP - - [26/Feb/2017:22:44:07 +0300] "GET /assets/css/bootstrap.min.css.map HTTP/1.1" 200 3172 "-" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 YaBrowser/17.3.0.1785 Yowser/2.5 Safari/537.36" IP - - [26/Feb/2017:22:44:27 +0300] "GET /login HTTP/1.1" 200 3727 "http://host.ru/login" "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.04" IP - - [26/Feb/2017:22:44:54 +0300] "GET /login HTTP/1.1" 200 3727 "http://host.ru/login" "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.04" IP - - [26/Feb/2017:22:44:55 +0300] "GET /assets/image/fav.png HTTP/1.1" 200 1211 "http://host.ru/login" "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.04" IP - - [26/Feb/2017:22:45:02 +0300] "GET /login HTTP/1.1" 200 3727 "http://host.ru/login" "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.04" IP - - [26/Feb/2017:22:45:05 +0300] "GET /login HTTP/1.1" 200 3726 "http://host.ru/login" "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.04" IP - - [26/Feb/2017:22:45:06 +0300] "POST /assets/php/content.php HTTP/1.1" 200 782 "http://host.ru/login" "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.04" IP - - [26/Feb/2017:22:45:20 +0300] "POST /assets/php/content.php HTTP/1.1" 200 1025 "http://host.ru/login" "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.04" IP - - [26/Feb/2017:22:45:24 +0300] "POST /assets/php/content.php HTTP/1.1" 200 849 "http://host.ru/login" "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.04" IP - - [26/Feb/2017:22:45:26 +0300] "POST /assets/php/content.php HTTP/1.1" 200 1299 "http://host.ru/login" "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.04" IP - - [26/Feb/2017:22:45:27 +0300] "POST /assets/php/content.php HTTP/1.1" 200 1371 "http://host.ru/login" "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.04" IP - - [26/Feb/2017:22:45:28 +0300] "POST /assets/php/content.php HTTP/1.1" 200 839 "http://host.ru/login" "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.04" IP - - [26/Feb/2017:22:45:30 +0300] "POST /assets/php/content.php HTTP/1.1" 200 1124 "http://host.ru/login" "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.04" IP - - [26/Feb/2017:22:45:30 +0300] "POST /assets/php/content.php HTTP/1.1" 200 1170 "http://host.ru/login" "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.04" IP - - [26/Feb/2017:22:45:31 +0300] "POST /assets/php/content.php HTTP/1.1" 200 846 "http://host.ru/login" "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.04" IP - - [26/Feb/2017:22:45:32 +0300] "POST /assets/php/content.php HTTP/1.1" 200 1019 "http://host.ru/login" "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.04" IP - - [26/Feb/2017:22:45:33 +0300] "POST /assets/php/content.php HTTP/1.1" 200 1034 "http://host.ru/login" "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.04" IP - - [26/Feb/2017:22:45:34 +0300] "POST /assets/php/content.php HTTP/1.1" 200 991 "http://host.ru/login" "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.04" IP - - [26/Feb/2017:22:45:35 +0300] "POST /assets/php/content.php HTTP/1.1" 200 936 "http://host.ru/login" "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.04" IP - - [26/Feb/2017:22:45:36 +0300] "POST /assets/php/content.php HTTP/1.1" 200 957 "http://host.ru/login" "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.04" IP - - [26/Feb/2017:22:45:37 +0300] "POST /assets/php/content.php HTTP/1.1" 200 837 "http://host.ru/login" "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.04" IP - - [26/Feb/2017:22:45:38 +0300] "POST /assets/php/content.php HTTP/1.1" 200 864 "http://host.ru/login" "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.04" IP - - [26/Feb/2017:22:45:59 +0300] "POST /assets/php/content.php HTTP/1.1" 200 746 "http://host.ru/login" "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.04" IP - - [26/Feb/2017:22:46:01 +0300] "POST /assets/php/content.php HTTP/1.1" 200 923 "http://host.ru/login" "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.04" IP - - [26/Feb/2017:22:46:03 +0300] "GET / HTTP/1.1" 200 4503 "http://host.ru/login" "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.04" error(Последние ошибки, это я поставил session.auto_start = 1 и поменял директорию хранения сессий, может это поможет) Код (Text): [Sun Feb 26 22:16:17.610203 2017] [mpm_prefork:notice] [pid 1071] AH00171: Graceful restart requested, doing restart [Sun Feb 26 22:16:17.658400 2017] [alias:warn] [pid 1071] AH00671: The Alias directive in /etc/apache2/conf-enabled/phpmyadmin.conf at line 3 will probably never match because it overlaps an earlier Alias. [Sun Feb 26 22:16:17.683134 2017] [mpm_prefork:notice] [pid 1071] AH00163: Apache/2.4.10 (Debian) configured -- resuming normal operations [Sun Feb 26 22:16:17.683160 2017] [core:notice] [pid 1071] AH00094: Command line: '/usr/sbin/apache2' [Sun Feb 26 22:16:32.451864 2017] [:error] [pid 3894] [client IP:26450] PHP Notice: A session had already been started - ignoring session_start() in /var/www/html/assets/php/login.php on line 27, referer: http://host.ru/login [Sun Feb 26 22:21:48.177831 2017] [:error] [pid 3897] [client IP:26273] PHP Notice: A session had already been started - ignoring session_start() in /var/www/html/assets/php/login.php on line 27, referer: http://host.ru/login [Sun Feb 26 22:29:35.590111 2017] [:error] [pid 3894] [client IP:26328] PHP Notice: A session had already been started - ignoring session_start() in /var/www/html/pages/logout.php on line 3, referer: http://host.ru/login [Sun Feb 26 22:30:11.429577 2017] [:error] [pid 3894] [client IP:26340] PHP Notice: A session had already been started - ignoring session_start() in /var/www/html/pages/login.php on line 6, referer: http://host.ru/login [Sun Feb 26 22:45:06.649209 2017] [:error] [pid 3896] [client IP:26470] PHP Notice: A session had already been started - ignoring session_start() in /var/www/html/pages/content/login/kab_1.php on line 2, referer: http://host.ru/login [Sun Feb 26 22:45:20.239022 2017] [:error] [pid 3895] [client IP:26472] PHP Notice: A session had already been started - ignoring session_start() in /var/www/html/pages/content/login/kab_3.php on line 19, referer: http://host.ru/login [Sun Feb 26 22:45:38.818821 2017] [:error] [pid 3895] [client IP:26472] PHP Notice: A session had already been started - ignoring session_start() in /var/www/html/pages/content/login/za_form.php on line 13, referer: http://host.ru/login
как думаешь?) --- Добавлено --- избавься от ошибок дальше будем смотреть. А сфига менять директорию? Может туда прав нет... Проверяй, ответы у тебя в логах)
1. session_start(); в обработчик в самое начало. 2. пароль в сессии хранить не нужно 3. полученные от пользователя строки нужно проверять хотя бы стандартными функциями
права дал, от ошибок , да надо избавляться. А не может к примеру блокировать антивирус падения файлика куки? --- Добавлено --- Хорошо, попробую с этого начать.
Хотя кука падает-то клиентам, в браузере и у себя и пользователя я ее вижу, но получается у меня он находит значения по ид куки, а у пользователя нет, завтра сравню, есть ли вообще на сервере эта кука со значениями, если ее нет, то проблема в том, что куда кидать ее на сервере...
Все ошибки устранил, но проблема не ушла, но я нашел причину. Что у нас получается: 1.Загружаю страничку с формой, стартует сессия, кидается кука на комп клиента с ID сессии и на сервер в папку session.save_path(Кстати какие у нее должны быть права, я пока поставил 777, ну это не правильно, каждый может зайти и поменять данные?) с таким же ID, все хорошо пока.. 2.Ввожу логин и пароль, нажимаю войти, стартует новая сессия с ID_2, переменные пишутся в нее в div выводиться, что все хорошо, пользователь зашел, страница обновляется и опять форма авторизации, потому что ID сессии нет переменных. Вопрос. Почему такое может быть? У меня 2 варианта: 1.Надо проверять есть ли кука с ID сессии, но тогда выдается ошибка в логах, что Undefined variable: _SESSION 2.Это настройки php.ini (возможно надо настроить время жизни сессии) Вот они PHP: [Session] session.save_handler = files session.save_path = "/var/www/html/temp" session.use_strict_mode = 0 session.use_cookies = 1 ;session.cookie_secure = session.use_only_cookies = 1 session.name = PHPSESSID session.auto_start = 0 session.cookie_lifetime = 0 session.cookie_path = / session.cookie_domain = session.cookie_httponly = session.serialize_handler = php session.gc_probability = 0 session.gc_divisor = 1000 session.gc_maxlifetime = 1440 session.referer_check = ;session.entropy_length = 32 ;session.entropy_file = /dev/urandom session.cache_limiter = nocache session.cache_expire = 180 session.use_trans_sid = 0 session.hash_function = 0 session.hash_bits_per_character = 5 ame=src,input=src,form=fakeentry" url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry" ;session.upload_progress.enabled = On ;session.upload_progress.cleanup = On ;session.upload_progress.prefix = "upload_progress_" ;session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS" ;session.upload_progress.freq = "1%" ;session.upload_progress.min_freq = "1" ;session.lazy_write = On Ткните, что не так делаю, уже перечитал про сессии мануал, там есть что-то про механизм задваивания, но у меня там не та ситуация. Есть и про навигацию JS, ведь у меня контект подгружается динамически, соответственно там написано, что надо слать заголовки, думаю с этого дальше начну.. Так же заметил в логах такую ошибку internal dummy connection, так и не нашел что она значит, может кто подскажет?
сессии по умолчанию нормально должны работать. не надо лазить в настройки если не знаешь что делаешь и зачем тебе это нужно. верни всё как было.
Понял, я поменял только путь, ну сейчас все по умолчанию вернул. Все равно задваивается.. --- Добавлено --- Вот к примеру, я нажимаю войти, ajax'ом посылаю запрос, там создается куки, но они не посылаются пользователю, вот в чем проблема, думаю надо в эту сторону копать..
Вроде решил проблему, путем удаления ajax'а, просто форма и action на обработчик.. Она стартует, чтобы взять от туда переменные и проверить такого пользователя на его данные из базы. Я может не понимаю алгоритм, удали ajax и все заработало, куки пишуться именно в сессию, которая уже есть.
Мне кажется, что это можно сделать проще. Пользователь ввёл логин и пароль и нажал кнопку "Войти", например. Ты в принимающем скрипте проверяешь есть ли такой пользователь и если есть, верный ли пароль он указал. Если все верно, то стартуешь сессию и в неё записываешь ID юзера и допустим строку сгенерированную из случайных символов. И создаёшь куки с теми же данными. Потом сравниваешь данные из куки с данными из сессии и если они одинаковые, значит пользователь авторизован для доступа в личный кабинет, например. В противном случае выкидываешь пользователя на страницу входа.