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

Статус
В этой теме нельзя размещать новые ответы.
Это абсолютно не повредит поверь.
Хотя я непредставляю что можно писать не использую session?
Ну не знаю не очень охото использовать в пустую.
В смысле например этот же mkportal при запуске не одного файла в директории сесий не создается да и SMF тоже
 
Ну сделай проверку что ты на той странице где капча и всё.
 
Зачем в этом случае выкладывать весь код функции 80кб если задействованы в этом случае только две
да, неспользуемые функции можно опустить, но место где вызываются используемые желательно было показать.


Думаю в этом и есть проблема т.к до старта сессии выводится шаблон и тд и этого не избежать т.к сесию нужно мне выводить только около форм с капчей. Может можно как то обойти это?
используй отложенный вывод в php
Для просмотра ссылки Войди или Зарегистрируйся
 
Хороший вариант но не думаю что подходящий для данного случаю который решается одним IFом
 
да, неспользуемые функции можно опустить, но место где вызываются используемые желательно было показать.



используй отложенный вывод в php
Для просмотра ссылки Войди или Зарегистрируйся
Вот место где вызывается фукнция проверки капчи
PHP:
function send_mail() {
global $mkportals, $DB, $std, $print, $mklib, $Skin, $mklib_board;
//session_start();
//$capcha .= $_POST['keystring'];

$mklib->stopspam_check();
//$output .= $_SESSION['captcha_keystring'];

    $blocks .= $Skin->view_block("Рекомендовать Сайт", $output);
    $mklib->printpage("1", "1", "Рекомендовать Сайт", $blocks);

    }
 
У тебя весь сайт запускается из index.php или для "каждой" страницы свой php файл?
 
если надо очень надо session_start не во всех вариантах вызова скрипта, а переписывать глобально лень то можно воспользоваться ф-цией ob_start
она просто будет накапливать вывод в памяти и в это время можно спокойно работать с заголовками просто вызываешь ob_start(); вначале и всё
 
Но тут возникает проблема с перерасходом памяти.
 
Я вот что то догнать не как не могу в фукции первой что я приводил в первом посту вызывается рисунк в виде файла в котором генерируется капча и устанавливается сессия и причем это всё работает то есть сессия создается а вот во второй где проверка уже не работает. Почему? ведидь код рисунка тоже выводится не в начале скрипта а в форме и сессия том работает вот код генерации капчи
PHP:
<?php


class KCAPTCHA{

    // generates keystring and image
    function KCAPTCHA(){
$alphabet = "0123456789"; # do not change without changing font files!
$allowed_symbols = "23456789"; #alphabet without similar symbols (o=0, 1=l, i=j, t=f)
$fontsdir = 'fonts';    
$length = mt_rand(5,6); # random 5 or 6
$width = 120;
$height = 60;
$fluctuation_amplitude = 5;
$no_spaces = true;
$show_credits = false; 
$credits = 'prime'; 
$foreground_color = array(mt_rand(0,100), mt_rand(0,100), mt_rand(0,100));
$background_color = array(mt_rand(200,255), mt_rand(200,255), mt_rand(200,255));

$jpeg_quality = 90;
        //require(dirname(__FILE__).'/kcaptcha_config.php');
        $fonts=array();
        $fontsdir_absolute=dirname(__FILE__).'/'.$fontsdir;
        if ($handle = opendir($fontsdir_absolute)) {
            while (false !== ($file = readdir($handle))) {
                if (preg_match('/\.png$/i', $file)) {
                    $fonts[]=$fontsdir_absolute.'/'.$file;
                }
            }
            closedir($handle);
        }    
    
        $alphabet_length=strlen($alphabet);
        
        do{
            // generating random keystring
            while(true){
                $this->keystring='';
                for($i=0;$i<$length;$i++){
                    $this->keystring.=$allowed_symbols{mt_rand(0,strlen($allowed_symbols)-1)};
                }
                if(!preg_match('/cp|cb|ck|c6|c9|rn|rm|mm|co|do|cl|db|qp|qb|dp|ww/', $this->keystring)) break;
            }
        
            $font_file=$fonts[mt_rand(0, count($fonts)-1)];
            $font=imagecreatefrompng($font_file);
            imagealphablending($font, true);
            $fontfile_width=imagesx($font);
            $fontfile_height=imagesy($font)-1;
            $font_metrics=array();
            $symbol=0;
            $reading_symbol=false;

            // loading font
            for($i=0;$i<$fontfile_width && $symbol<$alphabet_length;$i++){
                $transparent = (imagecolorat($font, $i, 0) >> 24) == 127;

                if(!$reading_symbol && !$transparent){
                    $font_metrics[$alphabet{$symbol}]=array('start'=>$i);
                    $reading_symbol=true;
                    continue;
                }

                if($reading_symbol && $transparent){
                    $font_metrics[$alphabet{$symbol}]['end']=$i;
                    $reading_symbol=false;
                    $symbol++;
                    continue;
                }
            }

            $img=imagecreatetruecolor($width, $height);
            imagealphablending($img, true);
            $white=imagecolorallocate($img, 255, 255, 255);
            $black=imagecolorallocate($img, 0, 0, 0);

            imagefilledrectangle($img, 0, 0, $width-1, $height-1, $white);

            // draw text
            $x=1;
            for($i=0;$i<$length;$i++){
                $m=$font_metrics[$this->keystring{$i}];

                $y=mt_rand(-$fluctuation_amplitude, $fluctuation_amplitude)+($height-$fontfile_height)/2+2;

                if($no_spaces){
                    $shift=0;
                    if($i>0){
                        $shift=10000;
                        for($sy=7;$sy<$fontfile_height-20;$sy+=1){
                            for($sx=$m['start']-1;$sx<$m['end'];$sx+=1){
                                $rgb=imagecolorat($font, $sx, $sy);
                                $opacity=$rgb>>24;
                                if($opacity<127){
                                    $left=$sx-$m['start']+$x;
                                    $py=$sy+$y;
                                    if($py>$height) break;
                                    for($px=min($left,$width-1);$px>$left-12 && $px>=0;$px-=1){
                                        $color=imagecolorat($img, $px, $py) & 0xff;
                                        if($color+$opacity<190){
                                            if($shift>$left-$px){
                                                $shift=$left-$px;
                                            }
                                            break;
                                        }
                                    }
                                    break;
                                }
                            }
                        }
                        if($shift==10000){
                            $shift=mt_rand(4,6);
                        }

                    }
                }else{
                    $shift=1;
                }
                imagecopy($img, $font, $x-$shift, $y, $m['start'], 1, $m['end']-$m['start'], $fontfile_height);
                $x+=$m['end']-$m['start']-$shift;
            }
        }while($x>=$width-10); // while not fit in canvas

        $center=$x/2;

        // credits. To remove, see configuration file
        $img2=imagecreatetruecolor($width, $height+($show_credits?12:0));
        $foreground=imagecolorallocate($img2, $foreground_color[0], $foreground_color[1], $foreground_color[2]);
        $background=imagecolorallocate($img2, $background_color[0], $background_color[1], $background_color[2]);
        imagefilledrectangle($img2, 0, 0, $width-1, $height-1, $background);        
        imagefilledrectangle($img2, 0, $height, $width-1, $height+12, $foreground);
        $credits=empty($credits)?$_SERVER['HTTP_HOST']:$credits;
        imagestring($img2, 2, $width/2-imagefontwidth(2)*strlen($credits)/2, $height-2, $credits, $background);

        // periods
        $rand1=mt_rand(750000,1200000)/10000000;
        $rand2=mt_rand(750000,1200000)/10000000;
        $rand3=mt_rand(750000,1200000)/10000000;
        $rand4=mt_rand(750000,1200000)/10000000;
        // phases
        $rand5=mt_rand(0,31415926)/10000000;
        $rand6=mt_rand(0,31415926)/10000000;
        $rand7=mt_rand(0,31415926)/10000000;
        $rand8=mt_rand(0,31415926)/10000000;
        // amplitudes
        $rand9=mt_rand(330,420)/110;
        $rand10=mt_rand(330,450)/110;

        //wave distortion

        for($x=0;$x<$width;$x++){
            for($y=0;$y<$height;$y++){
                $sx=$x+(sin($x*$rand1+$rand5)+sin($y*$rand3+$rand6))*$rand9-$width/2+$center+1;
                $sy=$y+(sin($x*$rand2+$rand7)+sin($y*$rand4+$rand8))*$rand10;

                if($sx<0 || $sy<0 || $sx>=$width-1 || $sy>=$height-1){
                    continue;
                }else{
                    $color=imagecolorat($img, $sx, $sy) & 0xFF;
                    $color_x=imagecolorat($img, $sx+1, $sy) & 0xFF;
                    $color_y=imagecolorat($img, $sx, $sy+1) & 0xFF;
                    $color_xy=imagecolorat($img, $sx+1, $sy+1) & 0xFF;
                }

                if($color==255 && $color_x==255 && $color_y==255 && $color_xy==255){
                    continue;
                }else if($color==0 && $color_x==0 && $color_y==0 && $color_xy==0){
                    $newred=$foreground_color[0];
                    $newgreen=$foreground_color[1];
                    $newblue=$foreground_color[2];
                }else{
                    $frsx=$sx-floor($sx);
                    $frsy=$sy-floor($sy);
                    $frsx1=1-$frsx;
                    $frsy1=1-$frsy;

                    $newcolor=(
                        $color*$frsx1*$frsy1+
                        $color_x*$frsx*$frsy1+
                        $color_y*$frsx1*$frsy+
                        $color_xy*$frsx*$frsy);

                    if($newcolor>255) $newcolor=255;
                    $newcolor=$newcolor/255;
                    $newcolor0=1-$newcolor;

                    $newred=$newcolor0*$foreground_color[0]+$newcolor*$background_color[0];
                    $newgreen=$newcolor0*$foreground_color[1]+$newcolor*$background_color[1];
                    $newblue=$newcolor0*$foreground_color[2]+$newcolor*$background_color[2];
                }

                imagesetpixel($img2, $x, $y, imagecolorallocate($img2, $newred, $newgreen, $newblue));
            }
        }
        
        header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); 
        header('Cache-Control: no-store, no-cache, must-revalidate'); 
        header('Cache-Control: post-check=0, pre-check=0', FALSE); 
        header('Pragma: no-cache');
        
        if(function_exists("imagejpeg")){
            header("Content-Type: image/jpeg");
            imagejpeg($img2, null, $jpeg_quality);
        }else if(function_exists("imagegif")){
            header("Content-Type: image/gif");
            imagegif($img2);
        }else if(function_exists("imagepng")){
            header("Content-Type: image/x-png");
            imagepng($img2);
        }
    }

    // returns keystring
    function getKeyString(){
        return $this->keystring;
    }
}
 session_start();
      $captcha = new KCAPTCHA();
      if($_REQUEST[session_name()])
       $_SESSION['captcha_keystring'] = $captcha->getKeyString(); 
?>
 
Всё перепробовал что то путевое не получется сделать если только глабально запускать сесию но ради капчи что то не охото этого делать. Может кто знает капчу без сесий и SQL?
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху