[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: При запросе аяксом ф-я global не делает свое дело
Xes
Есть сложность одна, к которой я уже ни однократно возвращаюсь но решить не могу, т.к. на мой взгляд, все верно.
Вот здесь наглядно посмотреть.
http://listhotel.ru/gostinitsy-nizhnego-novgoroda/

При первой загрузки страницы Вы видите баннер "Реклама за 100 рублей", нажмите на кнопочку сортировать по номерам (или любую другую) происходит AJAX запрос к томуже файлу который загружал основной контент этой страницы, но почемуто рекламный блок пропадает. Код очень длинный весь его приводить не буду привиду основные части чтобы было понятно что запрос произходит к одному и томуже файлу, но при этом кудато теряется рекламный блок.

В файле так вызывается рекламный блок
	$content_out .= GetReklama1();

Функция имеет следующее начало
function GetReklama1(){
global $cityen;
$cityen = !empty($cityen) ? $cityen : null;
static $off_reklama = false;
$reklama = null;
.....

return $reklama;


Я обноружил следующее переменная $cityen почемуто в функции GetReklama1 пустая получается при AJAX запросе к файлу. Обнаружил так просто написал
return $cityen.$reklama;


Так же изменил код чтобы не было global $cityen; а значение непосредсвенно передовалось в функцию, код:
	
//Вызов все в том же файле который формирует первоначально содержимое элемента id="content", и ajax запрос идет к этому же файлу
$content_out .= GetReklama1($cityen);

Функция GetReklama1 переделанная
function GetReklama1($cityen){
//global $cityen;
$cityen = !empty($cityen) ? $cityen : null;
static $off_reklama = false;
$reklama = null;
.....

return $reklama;

Все прекрасно работает. Баннер не пропадает $cityen всегда существует.
Вопрос в том, почему пропадет значение переменной при попытки получить его функцией global $cityen;




Спустя 25 минут, 37 секунд (12.01.2012 - 22:36) johniek_comp написал(а):
у тебя поиск не работает

Спустя 5 минут, 9 секунд (12.01.2012 - 22:41) Игорь_Vasinsky написал(а):
Цитата
global $cityen;

так расширяется зона видиости до глобальной, а вызывается она потом просто как -$cityen;

Спустя 6 минут, 24 секунды (12.01.2012 - 22:48) Xes написал(а):
johniek_comp, пример текста?

Ан, анапа - работает.

Спустя 2 минуты, 28 секунд (12.01.2012 - 22:50) Xes написал(а):
Цитата (Игорь_Vasinsky @ 12.01.2012 - 19:41)
Цитата
global $cityen;

так расширяется зона видиости до глобальной, а вызывается она потом просто как -$cityen;


И почему пропадает баннер .... я конечно могу партяку вывесеть но это ни кому не интересно.
Вопрос в том что почемуто когда я пытаюсь дотать значение так global $cityen; оно не достается, причем только при AJAX запросе. И при первой загрузке сраницы все ок.

Спустя 2 минуты, 39 секунд (12.01.2012 - 22:53) Игорь_Vasinsky написал(а):
попробуй массив вернуть

function GetReklama1(){
global $cityen;
$cityen = !empty($cityen) ? $cityen : null;
static $off_reklama = false;
$reklama = null;
.....

return $arr = array($cityen, $reklama);


да и не видно какона значения набирает внутри функции, вообще можно аргументом подставить

Спустя 8 минут, 26 секунд (12.01.2012 - 23:01) Xes написал(а):
Цитата (Игорь_Vasinsky @ 12.01.2012 - 19:53)
попробуй массив вернуть

Ну мне неудобно массив возвращать. Так как это выводится на печать в уже рабочем виде я безпроблем могу так написать
	return $cityen.$reklama;


Теперь внимание сама фишка о которой я пытаюсь сказать.
Например таже страница нижний новгород при первой загрузке скрипта все укей при загрузке его аяксом global $cityen; почемуто не получает значение из более высокого уровня хотя оно существует. О том что оно существует и оно верное можно убедиться если непосредсвенно передать это значение в функцию $content_out .= GetReklama1($cityen); - при таком способе вызова (передачи параметра $cityen) все работает и при запросе страницы аяксом.
Вот как бы ия в растеренности почему так происходит.

Сделал на время на сайте вот это return $cityen.$reklama; можно посмотреть.

Вот вся функция чтобы не думалось что там чето может наложиться.
Свернутый текст
<?
function
GetReklama1(){
global $cityen;
$cityen = !empty($cityen) ? $cityen : null;
static $off_reklama = false;
$reklama = null;
if($cityen){
if($off_reklama == false){
$off_reklama = true;
$query = "SELECT `linkuri`, `index`, `img`, `title` FROM `reklama1` WHERE `cityen`='".mysql_real_escape_string($cityen)."' AND `dshow`>='".date("Y-m-d")."' ORDER BY `dsort` DESC";
$sql = mysql_query($query) or die('Error!');
if(mysql_num_rows($sql) > 0){
while($sqlrow = mysql_fetch_array($sql)){
if(file_exists($_SERVER['DOCUMENT_ROOT'].'/city/'.$cityen.'/reklama1/'.$sqlrow['img']) && is_file($_SERVER['DOCUMENT_ROOT'].'/city/'.$cityen.'/reklama1/'.$sqlrow['img']))
$imgurl = URLSITE.'/city/'.$cityen.'/reklama1/'.$sqlrow['img'];
else
$imgurl = URLSITE.'/images/reklama1_noimg.gif';
$alink = $sqlrow['index'] ? '<a href="'.$sqlrow['linkuri'].'" title="'.$sqlrow['title'].'" target="_blank"></a>' : '<noindex><a href="'.$sqlrow['linkuri'].'" title="'.$sqlrow['title'].'" target="_blank"></a></noindex>';
$reklama .= '<div class="reklama_1a" style="background:url('.$imgurl.') no-repeat 50% 50%;">'.$alink.'</div>';
}
$reklama = '<div class="reklama_1">'.$reklama.'</div>';
}else{
if($_SERVER['SCRIPT_NAME'] != '/hotel.php'){
$reklama = '<div class="reklama_1"><div class="reklama_1a" style="background:url('.URLSITE.'/images/reklama1_offer1.gif) no-repeat 50% 50%"><a href="'.URLSITE.'/reklama" title="Условия размещения рекламы на сайте ListHotel"></a></div></div>';
}
}
}
}

return $cityen.$reklama;
}
?>

Спустя 18 часов, 37 минут, 10 секунд (13.01.2012 - 17:38) Xes написал(а):
Вобщем вопрос походу перекачевывает из разряда "Наверное я где-то накосячил" в область понимания как работает php. Чтото типа такого.

Не поленился, написал приметивные файлы и функции повторяющие туже структуру о которой я говорил выше. Приведу пример кода и как это работает.
Ошибки все теже пропадает значение переменной при запросе аяксом.

1-ое Основной файл
Свернутый текст

<?
error_reporting(E_ALL);
header('Content-type: text/html; charset=utf-8');
$text = 'Start';
require($_SERVER['DOCUMENT_ROOT'].'/2.php');
?>
<script type="text/javascript" src="/js/ajax.js"></script>
<
script type="text/javascript" src="/js/listhotel.js"></script>
<
a href="" onclick="Test();return false;">тыц</a>
<
div id="out"><? echo $text_out; ?></div>

2-е Файл инклюда который формирует значение переменной $text_out
Свернутый текст
<?php
$text_out = Test1();
function Test1(){
global $text;
$text .= '_NEXT_TEXT';
return $text;
}
?>

3-е js функции
Свернутый текст
function Test(){
var file = '/module/ajax/ajax.php';
var query = 'gotofun=Test&text=' + 'Zapros';
var ElemInArrayRequest = [query, file];
ArrayRequest.push(ElemInArrayRequest);
Request();
};

function RecTest(){
document.getElementById('out').innerHTML = RES.data;
}

4-е аякс функция оброботчик
Свернутый текст

function Test(){
$text = $_POST['text'];
require($_SERVER['DOCUMENT_ROOT'].'/2.php');
$data_json = array('gotofun' => 'RecTest', 'data' => $text_out);
echo json_encode($data_json);
}

В результате при запуске 1.php Мы видем
Цитата
тыц
Start_NEXT_TEXT

Тыкаем по тыц происходит запрос и в результате
Цитата
тыц
_NEXT_TEXT

Как видем это косяк значение переменной передонной из js text=' + 'Zapros';
было потерено.

Далее файл 2 был переписан так чтобы global не использовалось а непосредственно передовать значение в функцию
Свернутый текст
<?php
$text_out = Test1($text);
function Test1($text){
//global $text;
$text .= '_NEXT_TEXT';
return $text;
}
?>

В результате запроса при клике по ссылки мы видем на экране
тыц
Zapros_NEXT_TEXT

Все работает.

Есть мысли по этому поводу? Какая то фантастика прям таки.

Спустя 2 часа, 1 минута, 20 секунд (13.01.2012 - 19:40) killer8080 написал(а):
Xes
Никаких чудес, все работает как должно работать.

Спустя 15 минут, 22 секунды (13.01.2012 - 19:55) Xes написал(а):
killer8080 объясни мне тогда почему при запросе аяксом пропадет значение переменной. Я посылаю запрос query = 'gotofun=Test&text=' + 'Zapros';

Помоему должно быть значение Zapros_NEXT_TEXT, как я привел в последнем варианте. Почему global не делает досупной переменную $text хотя она раньше была определена вот тут $text = $_POST['text']; и равна 'Zapros'? Вместо того чтобы сделать ее доступной внутри функции global просто затирает это значение.

Спустя 11 минут, 13 секунд (13.01.2012 - 20:06) killer8080 написал(а):
Xes
У тебя там несколько грубых ошибок.
Во первых объвлять функцию внутри функции некорректно. Если дважды вызвать Test(), будет fatal error.
Во вторых ошибка в логике. Функция Test1() ищет переменную $text в глобальной области, а ее там нет! Потому что объявил ты её внутри функции Test(). В глобальной области её не существует. Чтоб это работало, нужно внутри Test() так же объявить переменную глобальной.

Спустя 51 минута, 13 секунд (13.01.2012 - 20:58) Xes написал(а):
killer8080 Спасибо помог, все действительно так как и сказал.
Добавлю лишь может кто тоже с такми сталкнется..
Юзаю функцию extract($sqlrow, EXTR_OVERWRITE);
Необходимо сначало объявить переменную глобальной а потом заюзать эту функцию иначе не работает, видимо если в обратном порядке то $cityen полученную врезультате применения extract глобальной сделать уже нельзя, она остается локальной.

global $cityen;
extract($sqlrow, EXTR_OVERWRITE);


Если без этой функции то не имеет значения порядок.

Спустя 6 минут, 25 секунд (13.01.2012 - 21:04) killer8080 написал(а):
Xes
да не за что wink.gif

Спустя 15 минут, 18 секунд (13.01.2012 - 21:19) twin написал(а):
Цитата (Xes @ 13.01.2012 - 17:58)
Юзаю функцию extract($sqlrow, EXTR_OVERWRITE);
Необходимо сначало объявить переменную глобальной а потом заюзать эту функцию иначе не работает, видимо если в обратном порядке то $cityen полученную врезультате применения extract глобальной сделать уже нельзя, она остается локальной.

Так а не юзай...
Я иногда поражаюсь разрботчикам PHP... Ну накой придумали такую функцию... Вернее не так, они хотели как лучше. Но юзать её нужно очень аккуратно и подконтрольно. Не так - точно.

По сабжу, вернее по предыдущему посту.

Тут еще одна ошибка гупость - попытка обьявить переменную глобальной в глобальной же области видимости...

Всё не верно. Руки оторвать. По самую майку.

Немедленно пересмотри архитектуру, пока не началось. ph34r.gif

Спустя 7 минут, 30 секунд (13.01.2012 - 21:27) Xes написал(а):
Цитата (twin @ 13.01.2012 - 18:19)
Так а не юзай...
Я иногда поражаюсь разрботчикам PHP... Ну накой придумали такую функцию... Вернее не так, они хотели как лучше. Но юзать её нужно очень аккуратно и подконтрольно. Не так - точно.

А что не так? Я так почитал о ней относительно неизвестных мне переменных пришедших от юзера я ее не использую. Исползую для извлечения данных из БД для того чтобы удобно было в дальнейшем писать в шаблонах не $sqlrow['cityru'] просто $cityru. И не надо лишних строк делать типа $cityru = $sqlrow['cityru'];

Насчет структуры уже переделал без global, просто в функцию значения передал.

Спустя 38 минут, 55 секунд (13.01.2012 - 22:06) twin написал(а):
По идее ты прав, я сам иногда грешу. Только вот момент - через месяц ты забудешь, что там где и как.
Впрочем все решается комментами. Хотя они не уменьшают объема кода.

А если их нет... Бедный последователь.

Врочем, если ты пишешь только для себя любимого, вполне годится. Сам накуралесил - сам и разгребай. smile.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.