Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Проблема с сессиями


Автор: Gold Dragon 4.9.2012, 11:43
Помогите разобраться с сессиями... 

У меня где-то в коде перед session_start() есть вывод html и соответственно выводится: "A session had already been started - ignoring session_start()".. 

Есть одна точна входа, что-то типа такого
Код

$GDPM = new GDPM();


Попробовал всё это дело закинуть в буффер, как-то так
Код

ob_start();
$GDPM = new GDPM();
$GDPM_html = ob_get_contents();
ob_end_clean();

echo $GDPM_html 

Но проблема не исчезла.. Что где не так?

Автор: gta4kv 4.9.2012, 12:09
Сделай session_start до вывода html...

Автор: Gold Dragon 4.9.2012, 12:12
не получится.. это CMS и там сессии стартуют когда нужно в отдельных компонентах :( На данном этапе всё переделывать очень накладно

Автор: ksnk 4.9.2012, 12:33
Цитата(Gold Dragon @  4.9.2012,  12:12 Найти цитируемый пост)
это CMS и там сессии стартуют когда нужно в отдельных компонентах

Это либо "Ужас-ужас", который по любому нужно переделать, либо централизованная система хранения информации о сессии, которой просто и цинично нужно воспользоваться перед реальным выводом на экран. Вообще, с таким отношением к сессии, в этой CMS, вероятно, предполагаются какие-то свои способы вывода? Может  документацию почитать - примеры посмотреть?

Автор: Gold Dragon 4.9.2012, 12:47
Цитата(ksnk @  4.9.2012,  13:33 Найти цитируемый пост)
либо централизованная система хранения информации о сессии, которой просто и цинично нужно воспользоваться перед реальным выводом на экран. 
да, через механизмы плагинов.. Это наследие Joomla.

Однозначно с этим нужно что-то делать, но не на этом этапе.. А при данных условиях можно найти какой-нибудь выход?

Автор: Sanchezzz 4.9.2012, 12:58
смотреть по этапно файл запуска и до ошибки возможно где то файл с BOM символом в начале файла.
Сори не так прочитал вопрос и понял другую суть....  мне нужно подумать....

Автор: Sanchezzz 4.9.2012, 14:15
Я так понимаю вам не нравится что он ругается на то что уже объявлено 

Первое нужен общий ob_start() до вывода всего на экран
Второе либо скрываем все ошибки нафиг или пишем костыль исключения грубый вариант

сессия в любом  случаи стартанет просто выводит вам сообщения что текущая операция не может быть выполнена так как был уже объявлен вызов session_start(); 

По хорошему это нужно проверку вставить если  strlen( session_id() ) < 1  то session_start(); во все места где session_start(); есть прям тупо поиск заменой

Грубый пример на скорую руку.
Код

error_reporting(-1);
//свой обработчик проще было бы error_reporting(0);
function my_error_handle($errno, $errstr ,$errfile , $errline , $errcontext = ''){
    if($errstr=='A session had already been started - ignoring session_start()'){ return;}else{
        print $errno." ".$errstr." ".$errfile." ".$errline." ".$errcontext;
    }
    

} 
//ставим свой обработчик заместо стандартного.
set_error_handler( 'my_error_handle'  , -1 );

ob_start();
    print 'ssss';
    
        session_start();
        session_start();
        session_start();
        session_start();
        session_start();
        session_start();
    if(!isset($_SESSION['aaa'])) $_SESSION['aaa'] = 'сессия не была'; else $_SESSION['aaa'] = 'сессия есть';
    
    
    $GDPM_html = ob_get_contents();
    ob_end_clean();
echo $GDPM_html ;

print_r($_SESSION['aaa']);


Как видим сессия стартует и туда что то пишется а ошибок нету.

Надеюсь я правильно понял суть вашей проблемы , заранее извиняюсь.

Я бы выбрал вариант с рефакторингом кода и проверки на наличии старта сессии.


Автор: Gold Dragon 4.9.2012, 14:34
Цитата(Sanchezzz @  4.9.2012,  15:15 Найти цитируемый пост)
По хорошему это нужно проверку вставить если session_id() < 1  то session_start()
ведь точно.... Что-то я не додумал... наверное уже замозолил мозги... Спасибо!!! +1

Вот только поясни ещё чуть-чуть...

У меня ошибка в том что до вызова сессии есть вывод... Я пробовал поместить всё в буфер, но ошибка всё равно есть. Никак не могу понять почему так.. т.е. алгоритм такой
Код


ob_start(); // старт буферизации 

$GDPM = new GDPM(); // входим для формирования HTML-кода, в т.ч. там где-то и session_start()

$GDPM_html = ob_get_contents(); // передаём буфер переменной

ob_end_clean(); // останавливаем буферизацию и очищаем буффер

// что-то делаем с данными ещё

echo $GDPM_html; // выводим результат


Где ошибка? или всё равно будет ошибка?

Автор: Sanchezzz 4.9.2012, 14:39
если ошибка насчет вывода до <? ob_start() то значит есть BOM символ  перед <? ob_start() или пробел в начале строки сохраните файл без BOM

Автор: Gold Dragon 4.9.2012, 14:51
Это практически не возможно... уж очень много файлов... Надеюсь что проблема именно в этом. 

Алгоритм вроде правильный.. Ну да ладно, вопрос решённый будем считать smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)