Tardos Mors
Новичёк
Карма: 0
Сообщений: 7
|
 |
« : Сентябрь 06, 2007, 21:41:25 » |
|
Проблема в том, что сбрасываются переменные сессии. Создал простой тест - в одном файле переменная устанавливается переменная, в другом она выводится. Все работает прекрасно. Но при выводе страницы сайта переменные пропадают. Выглядит действительно очень глупо. Я даже представить не могу, в чем может быть проблема.
Приблизительно опишу механизм работы сайта: В файле .htaccess прописано: RewriteEngine on RewriteRule .* index.php
В файле index.php происходит обработка поступившего URL и вывод нужной страницы. Все картинки и css подгружаются из папки с выключенным RewriteEngine.
На сайте есть форма авторизации. Если логин/пароль введены правильно, то устанавливается переменная сессии. При следующем запросе она проверяется. Так вот, если в самом начале скрипта при наличии этой переменной останавливать выполнение, то она остается. Если вывести страницу, то при следующем запросе к серверу переменной уже нет. Логично предположить, что она удаляется где-то в коде вывода страницы. Но это не так. И в денвере, и на другом хостинге код работал. Может у хостинга есть какие-то особенности, которые я не учел?
|
|
|
Записан
|
|
|
|
support@ayola.net
|
 |
« Ответ #1 : Сентябрь 07, 2007, 02:21:00 » |
|
Нет, никаких особенностей нет. Есть только ошибки программирования. Всё что касается работы сессий - всё установлено в дефолтные значения php.
Раз работают все CMS и форумы, а ваш скрипт не работает, приходит на ум мысль что где-то вы делаете не совсем корректно. Помочь будет проще, если мы будем видеть конкретный скрипт. Иными словами - урл в студию.
|
|
|
Записан
|
|
|
|
Tardos Mors
Новичёк
Карма: 0
Сообщений: 7
|
 |
« Ответ #2 : Сентябрь 07, 2007, 06:40:10 » |
|
Сайт http://skaz.md8.ru/Все запросы сначала получает index.php, он подгружает _application/init.php. Тот в свою очередь подгружает _application/includes/controller.php. Он обрабатывает урл и подгружает следующий файл. Файлы админки лежат по адресу _application/includes/admin/. Каждый из них подключает функцию checkAdmin (_application/functions/checkAdmin.php) и в зависимости от результата либо выводит страницу, либо ошибку 404. Так вот, если остановить скрипт еще в функции checkAdmin, то переменная никуда не девается. А если позволить скрипту вывести страницу, то при следующем запросе переменная пропадает, и выводится ошибка 404. Но ни в одном из файлов админки эта переменная не удаляется! Вернее в одном удаляется - в файе выхода, но он подключается только файлом _application/includes/controller.php при нужном урле.
|
|
|
Записан
|
|
|
|
support@ayola.net
|
 |
« Ответ #3 : Сентябрь 07, 2007, 06:53:31 » |
|
Ага. Уже понятнее. Теперь по пунктам. 1. Закомментируйте вызовы session_destroy() во всех файлах. 2. А ваш браузер, чисто случайно, не блокирует файлы cookies? Например из-за настроек безопасности если речь идёт об IE. 3. Перед созданием сессии установите все нужные значения для сессии через ini_set. В том числе - работу через cookies.
|
|
|
Записан
|
|
|
|
support@ayola.net
|
 |
« Ответ #4 : Сентябрь 07, 2007, 06:56:20 » |
|
п.с. завтра когда буду на офисе - посмотрю детальнее, но к этому времени, пожалуйста, выполните пункт 1. Самое простое, на мой взгляд, что косяк именно в случайном вызове этой функции.
|
|
|
Записан
|
|
|
|
Tardos Mors
Новичёк
Карма: 0
Сообщений: 7
|
 |
« Ответ #5 : Сентябрь 07, 2007, 18:01:03 » |
|
session_destroy у меня нет вообще, т.к. сделан счетчик посетителей по сессии. Только в одном месте удаляется переменная сессии (на всякий случай закомментировал). Перед стартом сессии добавил: ini_set("session.use_cookies", "1"); ini_set("session.cookie_lifetime", "1"); # На всякий случай ini_set("session.gc_probability", "0"); Куки не блокируются, на всякий случай попробовал в разных браузерах.
|
|
|
Записан
|
|
|
|
support@ayola.net
|
 |
« Ответ #6 : Сентябрь 07, 2007, 18:59:31 » |
|
ini_set("session.cookie_lifetime", "1");
Насколько я понимаю - вот и ответ - время жизни этой сессии благодаря cookie - 1 секунда.
|
|
|
Записан
|
|
|
|
Tardos Mors
Новичёк
Карма: 0
Сообщений: 7
|
 |
« Ответ #7 : Сентябрь 07, 2007, 19:30:58 » |
|
Ошибся чуть чуть... Но я ее только сейчас добавил, без этого все равно не работало. Исправил "1" на "0"
|
|
|
Записан
|
|
|
|
support@ayola.net
|
 |
« Ответ #8 : Сентябрь 07, 2007, 23:37:04 » |
|
0 - это работа без cookies. Т.е. сессия живёт только до тех пор, пока не будет закрыто окно браузера. После этого сессия автоматически уничтожается.
|
|
|
Записан
|
|
|
|
Tardos Mors
Новичёк
Карма: 0
Сообщений: 7
|
 |
« Ответ #9 : Сентябрь 08, 2007, 01:23:22 » |
|
Ну это то понятно, но я же не закрываю окно браузера.
|
|
|
Записан
|
|
|
|
support@ayola.net
|
 |
« Ответ #10 : Сентябрь 08, 2007, 05:10:36 » |
|
Такс. Сейчас я накидаю простейший скриптик, и мы с вами всё увидим.
|
|
|
Записан
|
|
|
|
|
Tardos Mors
Новичёк
Карма: 0
Сообщений: 7
|
 |
« Ответ #12 : Сентябрь 14, 2007, 21:52:52 » |
|
Проблема решена. Видимо на хостинге включен register_globals, хотя в FAQ написано, что он выключен. Для проверки создал два файла. Вот первый файл (устанавливается переменная сессии): <?php
session_start(); $_SESSION["var"] = "value";
?> И вот второй файл (выводится переменная сессии): <?php session_start(); header("Content-type: text/plain; charset=utf-8"); echo ("Зачение переменной сессии var - \"" . $_SESSION["var"] . "\"\n"); $var = "otherValue"; echo ("На этот раз зачение переменной сессии var - \"" . $_SESSION["var"] . "\""); ?> Второй файл выводит: Зачение переменной сессии var - "value" На этот раз зачение переменной сессии var - "otherValue" Можно ли выключить register_globals для моего аккаунта?
|
|
« Последнее редактирование: Сентябрь 14, 2007, 22:03:50 от Tardos Mors »
|
Записан
|
|
|
|
support@ayola.net
|
 |
« Ответ #13 : Сентябрь 14, 2007, 22:03:58 » |
|
Да, register_globals включен по многочисленным просьбам пользователей. И вы первый (!) кто просит его выключить. Выключили его для вас.
|
|
|
Записан
|
|
|
|
Tardos Mors
Новичёк
Карма: 0
Сообщений: 7
|
 |
« Ответ #14 : Сентябрь 15, 2007, 00:47:24 » |
|
Спасибо.
|
|
|
Записан
|
|
|
|
support@ayola.net
|
 |
« Ответ #15 : Сентябрь 15, 2007, 02:21:20 » |
|
Всегда рады помочь.
Топик закрываю.
|
|
|
Записан
|
|
|
|
|