Переменная Session Scope не работает - PullRequest
0 голосов
/ 12 января 2012

У меня проблемы с попыткой установить переменные сеанса с другой страницы.

У меня есть класс капчи (CaptchaSecurityImages.php от Саймона Джарвиса), и хотя код может быть немного устаревшим (последнее обновление 07/07/07), он работает на моей локальной машине, а не на моем сервере GoDaddy.

Эта функция вызывается для генерации кода капчи и установки переменной сеанса. Я немного изменил код, чтобы можно было задавать имена пользовательских переменных сеанса ($ sessionvar)

<?php
session_start();
class CaptchaSecurityImages {

var $font = 'monofont.ttf';

function generateCode($characters) {
    /* list all possible characters, similar looking characters and vowels have been removed */
    $possible = '23456789bcdfghjkmnpqrstvwxyz';
    $code = '';
    $i = 0;
    while ($i < $characters) { 
        $code .= substr($possible, mt_rand(0, strlen($possible)-1), 1);
        $i++;
    }
    return $code;
}

function CaptchaSecurityImages($width='120',$height='40',$characters='6',$sessionvar='security_code') {
    $code = $this->generateCode($characters);
    if (!isset($_SESSION)) { session_start(); }
    $_SESSION[$sessionvar] = $code; // doesnt actually set anything

    /* font size will be 75% of the image height */
    $font_size = $height * 0.75;
    $image = @imagecreate($width, $height) or die('Cannot initialize new GD image stream');
    /* set the colours */
    $background_color = imagecolorallocate($image, 255, 255, 255);
    $text_color = imagecolorallocate($image, 20, 40, 100);
    $noise_color = imagecolorallocate($image, 100, 120, 180);
    /* generate random dots in background */
    for( $i=0; $i<($width*$height)/3; $i++ ) {
        imagefilledellipse($image, mt_rand(0,$width), mt_rand(0,$height), 1, 1, $noise_color);
    }
    /* generate random lines in background */
    for( $i=0; $i<($width*$height)/150; $i++ ) {
        imageline($image, mt_rand(0,$width), mt_rand(0,$height), mt_rand(0,$width), mt_rand(0,$height), $noise_color);
    }
    /* create textbox and add text */
    $textbox = imagettfbbox($font_size, 0, $this->font, $code) or die('Error in imagettfbbox function');
    $x = ($width - $textbox[4])/2;
    $y = ($height - $textbox[5])/2;
    imagettftext($image, $font_size, 0, $x, $y, $text_color, $this->font , $code) or die('Error in imagettftext function');
    /* output captcha image to browser */
    header('Content-Type: image/jpeg');
    imagejpeg($image);
    imagedestroy($image);
}
}
$width = isset($_GET['width']) ? $_GET['width'] : '120';
$height = isset($_GET['height']) ? $_GET['height'] : '40';
$characters = isset($_GET['characters']) && $_GET['characters'] > 1 ? $_GET['characters'] : '6';
$sessionvar = isset($_GET['session']) ? $_GET['session'] : 'security_code';
$captcha = new CaptchaSecurityImages($width,$height,$characters, $sessionvar);

// if the next line was enabled, the session would be set
//echo $_SESSION[$sessionvar];

?>

Страница с таким названием выглядит примерно так:

<?php 
if (!isset($_SESSION)) { session_start(); } 
echo $_SESSION['paysecuritycode']; // should output something when the page is refreshed
?>
<html>
...
<body>
<img src='captchacode.inc.php?width=100&amp;height=40&amp;characters=5&amp;session=paysecuritycode'; />
</body>
</html>

Так, когда вызывается echo $ _SESSION ['paysecuritycode'], нет отображения? Чего не хватает? Можно ли устанавливать переменные из функции вместо класса, конечно?

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

Существуют ли какие-либо требования к сессиям / PHP, о которых мне нужно знать, чтобы эта работа работала ??

Ответы [ 2 ]

4 голосов
/ 21 ноября 2012

Хорошо, я нашел следующее решение (мне не нравится идея загрузить полную платформу, но она работает).Может быть, кто-то еще найдет это полезным:

<?php
define( '_JEXEC', 1 );
define( 'JPATH_BASE', realpath(dirname(__FILE__).'/../..' ));
define( 'DS', DIRECTORY_SEPARATOR );

require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );
$mainframe =& JFactory::getApplication('site');
$mainframe->initialise();

$session =& JFactory::getSession();
$session->set('security_code', $code);

Замените session_start(); на первую часть кода, который я разместил, и $_SESSION['captcha_word'] = $code; на две последние строки.

1 голос
/ 12 января 2012

Я предполагаю, что вы устанавливаете и читаете различные переменные сеанса.Вы устанавливаете $_SESSION[$sessionvar] = $code;, но пытаетесь прочитать $_SESSION['paysecuritycode'].$_SESSION['paysecuritycode'] не пусто, только когда $sessionvar установлено на 'paysecuritycode', но по умолчанию оно установлено на 'security_code'.

Кроме того, if (!isset($_SESSION)) { session_start(); } бесполезно в первом сценарии, так как будет вызыватьпредупреждение, если сеанс еще не запущен (заголовки уже отправлены header('Content-Type: image/jpeg');).

...