|
|
|
|
|
для: cheops
(27.08.2005 в 20:47)
| | Говорят, что в настройках сервера у них htaccess как конфигурационный файл разрешен, но мои настройки session.save_handler работает от фонаря, а флаг session.use_trans_sid вообще не могу отключить.
Верить им на слово? Или через пхп можно проверить, дано добро для htaccess или нет?
Да, еще - пхп на хосте скомпелирован как модуль апаче. А на нашей фирме как CGI. | |
|
|
|
|
|
|
|
для: gotbar
(27.08.2005 в 14:52)
| | Хм... а может просто не разрешено использовать в .htaccess директиву session.save_handler? Вы не спрашивали ещё об этом в тех поддержке хостинга? | |
|
|
|
|
|
|
|
для: cheops
(27.08.2005 в 12:39)
| | Конечно, да.
Но беда в том, что до БД даже не доходит дело.
Сервер выдает сначала очередной номер сеанса моему соединению, проверяет базу данных, такого номера нет, пишет его в БД, при переходе к новой странице все повторяется заново. Смотрела логи на хосте. В логах четко стоит номер сессии в урлах.
Такое впечатление, что сервер на хосте при session_start проверяет наличие файла сессии, а не БД, а только потом "читает" установки в .htaccess
session.save_handler "user"
1. Может .htaccess лежит не в той директории? У меня он находится там , где скрипты обработчика и формы.
И в том случае, если я прямо обращаюсь к этим скриптам и залогинившись возвращаюсь на ту же страницу, все как раз работает даже на хосте.
Но в случае, если я гружу ту же форму как новое окно (скрипты лежат в другой директории и там стоит include моей формы) или уже залогинившись перехожу к другой странице, то сервер теряет сессию. | |
|
|
|
|
|
|
|
для: gotbar
(27.08.2005 в 04:49)
| | А понял... но для этого нужно, чтобы ses_id был проиндексирован как уникальный ключ - у вас имеется такая индексация в MySQL-таблице? | |
|
|
|
|
|
|
|
для: cheops
(26.08.2005 в 21:47)
| | именно SID не проверяю. Но некоторое подобие проверки есть
$session_sql = "INSERT INTO $sesTable (ses_id, ses_start, ses_time, ses_value) VALUES ('$sesID', '$strTime','".$ses_expiration."', '$data')";
$session_resins = @mysql_query ($session_sql); // Пишу новую сессию в БД
if (!$session_resins) { // Если запись в БД не состоялась, то делаем апдейт существующей сессии
$session_sql = "UPDATE $sesTable SET ses_time='" . $ses_expiration
. "', ses_value='$data' WHERE ses_id='$sesID'";
|
Собственно сам SID мне не нужен, только номер сессии. Потом я не понимаю почему без проверки функционирует на нашем местном веб-сервере? По логике не должны бы и там сессии работать. | |
|
|
|
|
|
|
|
для: gotbar
(26.08.2005 в 15:19)
| | Если вы организуете собственный механизм хранения сессий - вам необходимо самостоятельно обрабатывать ситуацию поступления информации от сессии, которая уже имеется в базе данных. Не очень понятно как в обработчике s_write() проверяется существует сессия с таким SID или нет и проводится ли такая проверка? | |
|
|
|
|
|
|
|
для: cheops
(26.08.2005 в 15:00)
| | да, передается.
это выглядит примерно так:
<area shape="rect" coords="120,141,260,231" href="Папка/Файл.htm?sessid=ad8d1afc8fb0503f72a6ab767a6559b6" target="mainFrame1">
Но при переходе по ссылке скрипт заносит в БД новый айди сеанса | |
|
|
|
|
|
|
|
для: gotbar
(26.08.2005 в 14:57)
| |
session.use_trans_sid="On"
|
А SID через URL передаётся? | |
|
|
|
|
|
|
| Самое интересное, что те же скрипты в среде разработки фунционируют без ошибок. А на хосте сессии стартуют на каждый чих.
Данные сессии сохраняются в БД:
session_set_save_handler ("s_open", "s_close", "s_read", "s_write", "s_destroy", "s_gc");
session_name('sessid');
$sesTable= "sessions";
$dbHost = "localhost";
$dbDBase = "dbName";
$dbUser = "dbUser";
$dbPass = "PWD";
/*Сессию открыть*/
function s_open($path, $name) {
global $dbHost,$dbDBase,$dbUser,$dbPass;
$mysql_connect = mysql_connect($dbHost,$dbUser,$dbPass);
$mysql_db = mysql_select_db ($dbDBase);
if (!$mysql_connect || !$mysql_db) {
return FALSE;
} else {
return TRUE;
}//if
}//func
/* Сессию закрыть*/
function s_close() {
return TRUE;
}
/* данные сессии из ДБ */
function s_read($sesID) {
global $sesTable;
$session_sql = "SELECT * FROM $sesTable WHERE ses_id = '$sesID'";
$session_res = mysql_query($session_sql) or die(mysql_error());
if (!$session_res) {
return '';
}//if
$session_num = mysql_num_rows ($session_res); // Noch fraglich
if ($session_num > 0) {
$session_row = mysql_fetch_assoc($session_res);
$ses_data = $session_row["ses_value"];
return $ses_data;
} else {
return '';
}//if
}//func
/* занести данные сессии в ДБ */
function s_write($sesID, $data) {
global $sesTable;
$this->data=$daten;
$ses_life = get_cfg_var("session.gc_maxlifetime"); $ses_expiration = time() + $ses_life;
$strTime = strftime("%H:%M:%S %d-%m-%Y",time());
$session_sql = "INSERT INTO $sesTable (ses_id, ses_start, ses_time, ses_value) VALUES ('$sesID', '$strTime','".$ses_expiration."', '$data')";
$session_resins = @mysql_query ($session_sql);
if (!$session_resins) {
$session_sql = "UPDATE $sesTable SET ses_time='" . $ses_expiration
. "', ses_value='$data' WHERE ses_id='$sesID'";
$session_resup = @mysql_query ($session_sql) ;
if (!$session_resup && !$session_resins){
return FALSE;
}//if
elseif (mysql_affected_rows ()){
return TRUE;
} else {
return TRUE; }//elseif
}//if
}//func
/* данные сессии удалить*/
function s_destroy($sesID) {
global $sesTable;
$session_sql = "DELETE FROM $sesTable WHERE ses_id = '$sesID'";
$session_resdel = mysql_query ($session_sql) ;
mysql_query("OPTIMIZE TABLE $sesTable");
if (!$session_resdel) {
return FALSE;
} else {
return TRUE;
}//if
}//func
/* старые сессии удалить*/
function s_gc($max_lifetime) {
global $sesTable;
echo "trace_6";
$session_sql = "DELETE FROM $sesTable WHERE ses_time < " . time();
$session_res = @mysql_query ($session_sql);
mysql_query("OPTIMIZE TABLE $sesTable");
if (!$session_res) {
return FALSE;
} else {
return TRUE;
}//if
}//func
|
Установки у хостера и локал:
в .htaccess (лежит в папке со скриптом хандлера):
php_value session.save_handler "user"
в php.ini:
session.use_trans_sid="On"
Ведь session_start() должна проверять наличие уже выданного индифаказионного номера сессии, как я понимаю.
Почему же она этого не делает? | |
|
|
|
|