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

Статус
В этой теме нельзя размещать новые ответы.

avgaz

Участник
Регистрация
18 Окт 2006
Сообщения
189
Реакции
7
Столкнулся с такой проблемкой делаю капчу с 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();

?>
то сессия создается, а если вызвать на страницу сайта это же из файла фукции то сессия не создается в чем может быть причина?
 
Попробуй 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'];
 
Стартуй сессию извне, до начала функции.
 
ну почему всем так трудно выложить весь код? да еще и без тегов [ php ] [ /php ]
очень сложно понять что и как неработает

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

2. одинаковое название функции и переменной stopspam помоему это не правильно.

Может и в какой то версии PHP этот баг и есть но походу тут не в этом проблема. У меня на PHP 5.2.4 по крайней мере этот кусок кода стартует нормально
 
ну почему всем так трудно выложить весь код? да еще и без тегов [ php ] [ /php ]
очень сложно понять что и как неработает

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



Может и в какой то версии PHP этот баг и есть но походу тут не в этом проблема. У меня на PHP 5.2.4 по крайней мере этот кусок кода стартует нормально
Думаю в этом и есть проблема т.к до старта сессии выводится шаблон и тд и этого не избежать т.к сесию нужно мне выводить только около форм с капчей. Может можно как то обойти это?
P.S после включения показа всех ошибок вылезла эта
Рекомендовать Сайт
Код:
Notice: A session had already been started - ignoring session_start() in  T:\home\virtual\second\mkportal\include\functions.php on line  2138
 
проблема в том что session_start(); не работает в этом файле функций не ошибок не чего нет.
Если просто создать php файл с содержанием
Код:
<?php
session_start();

?>
то сессия создается, а если вызвать на страницу сайта это же из файла фукции то сессия не создается в чем может быть причина?

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;
    }
?>
 
Думаю в этом и есть проблема т.к до старта сессии выводится шаблон и тд и этого не избежать т.к сесию нужно мне выводить только около форм с капчей. Может можно как то обойти это?
P.S после включения показа всех ошибок вылезла эта
Рекомендовать Сайт
Код:
Notice: A session had already been started - ignoring session_start() in  T:\home\virtual\second\mkportal\include\functions.php on line  2138

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

Об этом уже думал но зачем если session_start(); нужна только для вывода капчи и только на страницах формы если я в index то будет вызываться постоянно
 
Это абсолютно не повредит поверь.
Хотя я непредставляю что можно писать не использую session?
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху