session_start() не работает в функции

Тема в разделе "PHP", создана пользователем avgaz, 15 апр 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. avgaz

    avgaz

    Регистр.:
    18 окт 2006
    Сообщения:
    188
    Симпатии:
    6
    Столкнулся с такой проблемкой делаю капчу с CMS за основу была взята капча captcha.ru всё вроде сделал вывод но вот сталкнулся с такой проблемкой это проверка кода.
    Код вывода и проверки находится в основном файле функции портала function.php и выглядит так
    Код:
    function stopspam() {
       global $mkportals, $DB, $std, $print, $mklib, $Skin, $mklib_board;
       session_start(); 
       $stopspam ="1";
     if ($stopspam==1) {
         $content ="<p><img src=\"{$MK_PATH}mkportal/antispam/kcaptcha.php\"></p>
    <p><input type=\"text\" name=\"keystring\"></p>";
      
        } else {
            $content = "<input type=\"hidden\" name=\"keystring\" value=\"0\">";
        }
            return $content;
    }
    function stopspam_check() {
        global $mkportals, $DB, $std, $print, $mklib, $Skin, $mklib_board;
        session_start();
        $code = $_POST['keystring'];
    
        if(isset($_SESSION['captcha_keystring']) && $_SESSION['captcha_keystring'] == $code){
            echo "Correct";
        }else{
            echo "Wrong $code";
        }
    
    unset($_SESSION['captcha_keystring']);
       
    }
    Функция вывода и stopspam_check и функция проверки
    Нопроблема в том что session_start(); не работает в этом файле функций не ошибок не чего нет.
    Если просто создать php файл с содержанием
    Код:
    <?php
    session_start();
    
    ?>
    то сессия создается, а если вызвать на страницу сайта это же из файла фукции то сессия не создается в чем может быть причина?
     
  2. Ton

    Ton Постоялец

    Регистр.:
    20 май 2007
    Сообщения:
    55
    Симпатии:
    9
    Попробуй error_reporting(E_ALL); потому что сессия из фунции прекрасно вызывается:
    PHP:
    <?php
    error_reporting
    (E_ALL);
    function 
    fn() {
        
    session_start();
    }
    fn();
    if (empty(
    $_SESSION['var'])) {
        
    $_SESSION['var_cals'] = 0;
        
    $_SESSION['var'] = 'SESSION OK';
    }
    echo 
    $_SESSION['var_cals']++;
    echo 
    '<br />';
    echo 
    $_SESSION['var'];
     
  3. Mr.Emm

    Mr.Emm Постоялец

    Регистр.:
    5 май 2008
    Сообщения:
    147
    Симпатии:
    111
    Стартуй сессию извне, до начала функции.
     
  4. Виллен

    Виллен

    Регистр.:
    12 мар 2009
    Сообщения:
    235
    Симпатии:
    60
    ну почему всем так трудно выложить весь код? да еще и без тегов [ php ] [ /php ]
    очень сложно понять что и как неработает

    по тому что есть:
    1. можешь объяснить назначение сей конструкции
    PHP:
       $stopspam ="1";
     if (
    $stopspam==1) {
    2. одинаковое название функции и переменной stopspam помоему это не правильно.
    3. зачем глобализируется столько переменных global $mkportals,.... , если ниодна дальше не используется? про запас?
     
  5. Ton

    Ton Постоялец

    Регистр.:
    20 май 2007
    Сообщения:
    55
    Симпатии:
    9
    Место старта сессии абсолютно не имеет никакого значения, главное только перед стартом нечего не отправлять на вывод в браузер типа "echo, print_r...".

    Может и в какой то версии PHP этот баг и есть но походу тут не в этом проблема. У меня на PHP 5.2.4 по крайней мере этот кусок кода стартует нормально
     
  6. avgaz

    avgaz

    Регистр.:
    18 окт 2006
    Сообщения:
    188
    Симпатии:
    6
    Зачем в этом случае выкладывать весь код функции 80кб если задействованы в этом случае только две
    1. Это $stopspam так сказать наработка включения, отключения капчи
    2. Не влияет на текущею проблему
    3. Ну да можно убрать правы.
    Думаю в этом и есть проблема т.к до старта сессии выводится шаблон и тд и этого не избежать т.к сесию нужно мне выводить только около форм с капчей. Может можно как то обойти это?
    P.S после включения показа всех ошибок вылезла эта
    Рекомендовать Сайт
    Код:
    Notice: A session had already been started - ignoring session_start() in  T:\home\virtual\second\mkportal\include\functions.php on line  2138
    
     
  7. jik

    jik

    Регистр.:
    11 мар 2009
    Сообщения:
    243
    Симпатии:
    133
    1) Проверьте, нет ли пустой строки в начале файла.
    Так нельзя:

    Код:
    ---[ gonduras.php ]---
    
    <?
    ...
    session_start();
    ?>
    ---[ gonduras.php ]---
    Надо делать так:

    Код:
    ---[ gonduras.php ]---
    <?
    ...
    session_start();
    ?>
    ---[ gonduras.php ]---
    2) Если вызов session_start() стоит внутри include-файла, то в этом файле
    после закрывающего hph тэга не должно быть символов. Короче, все поубирать после ?>.

    3) session_start() может не сработать и выдать warning, если PHPSESSID содержит неверные символы. Можно сделать такую обертку вокруг функции:

    PHP:
    <?
        function 
    my_session_start()
        {
            if (isset(
    $_COOKIE['PHPSESSID'])) {
                
    $sessid $_COOKIE['PHPSESSID'];
            } else if (isset(
    $_GET['PHPSESSID'])) {
                
    $sessid $_GET['PHPSESSID'];
            } else {
                
    session_start();
                return 
    false;
            }
            if (!
    preg_match('/^[a-z0-9]{32}$/'$sessid)) {
                return 
    false;
            }
            
    session_start();
            return 
    true;
        }
    ?> 
     
  8. Ton

    Ton Постоялец

    Регистр.:
    20 май 2007
    Сообщения:
    55
    Симпатии:
    9
    Просто впиши старт сессии глобально перед всеми выводами, например в index.php в начало или какой то общий файл но что б он стартовал только один раз! это вполне нормальная практика.
     
  9. avgaz

    avgaz

    Регистр.:
    18 окт 2006
    Сообщения:
    188
    Симпатии:
    6
    Об этом уже думал но зачем если session_start(); нужна только для вывода капчи и только на страницах формы если я в index то будет вызываться постоянно
     
  10. Ton

    Ton Постоялец

    Регистр.:
    20 май 2007
    Сообщения:
    55
    Симпатии:
    9
    Это абсолютно не повредит поверь.
    Хотя я непредставляю что можно писать не использую session?
     
Статус темы:
Закрыта.