Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Проблема с глобальными переменными  (Прочитано 47302 раз)
0 Пользователей и 9 Гостей смотрят эту тему.
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« : 14-07-2005 17:49 » 

Вот такая ситуация.
В файле index.php происходит инклудинг одного файла несколько раз, т.е. дело обстоит примерно вот так
Код:

include (sp_csv.php);
<br>
include (sp_csv.php);
<br>
include (sp_csv.php);
<br>
...
Количество раз не имеет значение.
В файле sp_csv.php проверяется глобальная переменная и если ее не существует или она равно 0, то производится ряд действий и глобальная переменная принимает значение 1. Если глоб. переменная равна 1, то делаются другие операции, но глоб. переменная уже не меняется. Но это в теории, на практике же глоб. переменная в этом файле всегда равна 0 или не существует, вот код
Код:
GLOBAL $flag_start_rand;
print "$flag_start_rand=".$flag_start_rand;
if(!isset($_SESSION['flag_start_rand'])| ($_SESSION['flag_start_rand']!=1))
{print "Вызываю start_rand()";
print ("<br>"."product=".$GLOBALS['splist'][0]);
include_once ("start_rand.php");}
else
...
Вот эта переменная $flag_start_rand всегда не существует либо равна нулю. Я что только не делал и так пробовал
$GLOBALS['flag_start_rand'] и объявлял ее в index.php ичего не помогает.
Объясните же мне дураку, почему она не меняется в файле sp_csv.php, точнее почему при следующих вызовах sp_csv.php она снова равна нулю или не существует, вместо того, чтобы быть равной единице.
« Последнее редактирование: 16-12-2007 17:41 от Алексей1153++ » Записан

ещё один вопрос ...
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 14-07-2005 18:00 » 

объяви во включаемом файле global $flag_start_rand.

http://ru3.php.net/manual/ru/function.include.php
Цитата
When a file is included, the code it contains inherits the variable scope of the line on which the include occurs. Any variables available at that line in the calling file will be available within the called file, from that point forward.

Т.е., практически, поисходит вставка файла в указанное директивой место со всеми вытекающими последствиями. Хоть и похожи директивы на ф-ии, но отличаются от них весьма.
« Последнее редактирование: 14-07-2005 18:05 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 15-07-2005 08:18 » 

Щас мануал почитаю (блин, я эту страницу совсем недавно читал, видать невнимательно). Но по поводу GLOBAL, я же объявил во вкдлючаемом файле переменнную flag_start_rand, во втором участке кода.
Записан

ещё один вопрос ...
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 15-07-2005 09:07 » 

Я этот пример понимаю, но это не совсем то, что мне нужно.
Код:
vars.php
<?php

$color 
= &#39;green&#39;;
$fruit = &#39;apple&#39;;

?>


test.php
<?php

echo "A $color $fruit"// A

include &#39;vars.php&#39;;

echo "A $color $fruit"// A green apple

?>


У меня другая ситуация. В подключаемом файле используется (объявляется) глоб. переменнная, которая до этого нигде вообще не была объявлена. И после того, как этот подключаемый файл отработал, эта переменная должна измениться, но почему-то при очередном подключении этого файла, глоб. переменная не сохрангяет значения, которое было ей присвоено при прошлом подключении файла.
 Я где только и что только не писал. Писал и global, GLOBAL, $GLOBALS[] один хрен. В чем я не прав?
« Последнее редактирование: 16-12-2007 17:42 от Алексей1153++ » Записан

ещё один вопрос ...
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #4 : 15-07-2005 09:28 » 

И после того, как этот подключаемый файл отработал, эта переменная должна измениться, но почему-то при очередном подключении этого файла, глоб. переменная не сохрангяет значения, которое было ей присвоено при прошлом подключении файла.
Всё правильно. Инклуд в чём то смахивает на функцию, о чём сказал RXL. И в твоём случае эта переменная при первом инклуде инициализируется каким то значением, а затем при втором инклуде она инициализируется заново с уже дефолтным значением. Прочитай внимательно и вдумчиво цитату RXL.
Цитата
В подключаемом файле используется (объявляется) глоб. переменнная, которая до этого нигде вообще не была объявлена.
ИМХО стоит объявить эту глобальную переменную не в подключаемом файле, а в файле в который ты подключаеш свою проверку. Тогда эта переменная будет видна всё время выполнения основного скрипта, не зависимо от того сколько раз на протяжении работы скрипта ты подключаеш файл с проверкой
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
PantiL
Гость
« Ответ #5 : 15-07-2005 12:12 » 

Инклуд ни чем не смахвает на функцию, это просто файл, содержимое которого интерпритатор ставит на место строки include "file.php"; Я не пойму в чем проблема возникает, я писал скрипт с довольно сложным ветвлением инклудов и никаких проблем не было. Проинициализируй перменные где-нибудь в начале скрипта, можно даже приинклудить файл с инициализацией и все дорлжно быть нормально.
Записан
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #6 : 15-07-2005 12:23 » 

Цитата
Инклуд ни чем не смахвает на функцию
Ну так уж и ничем Улыбаюсь
Вот тебе пример :
В функцию ты подаёш параметр, который внутри неё и используеш.
В файл ты инклудиш другой файл, который и используеш внутри основного файла.

Неужто нет никакой похожести ? Ага
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #7 : 15-07-2005 12:29 » 

Кстати, nikedeforest, если в файле sp_csv.php ты делаеш только какие то проверки, то не проще ли реализовать это как функцию(функции) и проинклудить один раз в самом начале скрипта, а по ходу только вызывать нужную функцию ? ИМХО я бы только так и делал вместо того чтобы н раз инклудить один и тот же файл Улыбаюсь
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 15-07-2005 16:09 » 

index.php
Код:
<?php
if ( !isset($_SESSION[&#39;flag_start_rand&#39;]) | ($_SESSION[&#39;flag_start_rand&#39;] != 1) )
{
    print(
"Вызываю start_rand()");
    print(
"<br>" "product=" $GLOBALS[&#39;splist&#39;][0]);
    
include_once("start_rand.php");
}
?>

start_rand.php
Код:
<?php
global $flag_start_rand 1;
?>
« Последнее редактирование: 16-12-2007 17:43 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 15-07-2005 17:59 » new

А так можно делать, а то у меня кажется ругательства были на
Код:
<?php
global $flag_start_rand 1;
?>

И я делал так
Код:
<?php
global $flag_start_rand;
$flag_start_rand=1
?>

Кстати может именно из-за этого идет  сбрасывание значения переменной?
Код:
<?php
if ( !isset($_SESSION[&#39;flag_start_rand&#39;]) | ($_SESSION[&#39;flag_start_rand&#39;] != 1) )
{
    print(
"Вызываю start_rand()");
    print(
"<br>" "product=" $GLOBALS[&#39;splist&#39;][0]);
    
include_once("start_rand.php");
}
?>

Я делаю точно также, слово в слово Улыбаюсь.
« Последнее редактирование: 16-12-2007 17:45 от Алексей1153++ » Записан

ещё один вопрос ...
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 15-07-2005 19:17 » 

Твоя правда - в global присвоение недопустимо. По этому, да бы не путаться в правилах, я без всяких global делаю сразу $_GLOBAL['flag_start_rand'] = 1;
« Последнее редактирование: 16-12-2007 17:46 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 16-07-2005 10:23 » 

Цитата
По этому, да бы не путаться в правилах, я без всяких global делаю сразу $_GLOBAL['flag_start_rand'] = 1;
Я тоже так ofc делаю, только пишу $GLOBALS['flag_start_rand']=1 Улыбаюсь.
Ребята, дело труба. Нихрена не получается. Что такого в этом особенного не знаю. Вот что я попробовал делать (думал, что это наверняка).
файл sp_csv.php
Код:
if(!isset($GLOBALS['flag_start_rand']) | ($GLOBALS['flag_start_rand']!=1))
{print "Вызываю start_rand()";
print ("<br>"."product=".$GLOBALS['splist'][0]);
include_once ("start_rand.php");
$GLOBALS['flag_start_rand']=1;
}
Т.е. по сути дела, сейчас с глобальной переменной работает только один файл sp_csv.php, он проверяет переменную, он же ее изменяет в случае если надо, в других файлах нет даже упоминаний о ней. Но один хрен, значение переменной не сохраняется. ПОЧЕМУ?Не понялНе понялНе понялНе понял??
p.s. А не может влиять то, что в подключаемом файле sp_csv.php РНР скрипт идет в перемежку с HTML, т.е. файл имеет такую конструкцию
Код:
<html>
<head>
<?php
.....
?>

</head>
<body>
<?php
...
?>

</body>
</html>

« Последнее редактирование: 16-12-2007 17:46 от Алексей1153++ » Записан

ещё один вопрос ...
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 18-07-2005 18:37 » 

Народ, вы мне объясните пожайлуста вот какое дело. Если я использую суперглобальный массив $GLOBALS[], то все элементы этогно массива доступны в любой части скрипта? Т.е. я имею ввиду, что мне даже инклудить ненадо файл, в котором объявлялась и использовалась переменная, как с обычными переменными.
Записан

ещё один вопрос ...
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 18-07-2005 20:48 » 

nikedeforest, в описанной тобой ситуации - да. Вообще, если ты не знаешь все, что предполонгается делать в таком включаемом файле, или просто делаешь задел на будущее, то  стоит сделать этот отдельный файл. Правда, в таком случае проше сделать ф-ию и вынести ее в отдельный файл, который надо будет подгрузить, а из контрольной точки вызвать ф-ию. Если задача тривиальна и встречается в коде лишь раз, то лучше ее включитьк код.
Используй include_once()
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 21-07-2005 09:05 » 

Да вот даже по поводу in clude_once. Я думал, что если идет такой скрипт к примеру

файл ndex.php
Код:
include_once ("config.php");
include ("sp_csv.php");
...
include ("sp_csv.php");
...
include ("sp_csv.php");
..
файл sp_csv.php
Код:
include_once ("config.php");
...

Раньше я предполагал что инклудинг файла config.php произойдет всего один раз, когда мы его подключаем в самом начале файла index.php, а в остальных он подключаться не будет так все остальные подключения делаются на базе index.php, но оказалось, что файл config.php будет подключен здесь ровно  4 раза. Получается, что в данном случае include_once () бесполезен. А вот представьте теперь, что в config.php у меня инициализируется какая-то переменнная, которая потом изменяется в файле index.php и получается, что при каждом вызове config.php у меня происходит сброгс значения переменной, что же мне делать в этом случае, если мне не нужно, чтобы переменная сбрасывалась.
Записан

ещё один вопрос ...
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 21-07-2005 10:15 » 

Если ты подгружаешь файл через include_once() в программе и во всех подгружаемых файлах, то загружен файл будет только один раз. Ищи где у тебя остались include().

Совет: используй всегда форму include_once() или require_once(), за исключением специальных случаев, когда это требует логика программы.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #16 : 21-07-2005 12:29 » 

Цитата
Ищи где у тебя остались include().
Да вроде нигде, но покапаюсь еще, потом напишу. Вот еще вопрос:
если у меня в файле index.php использовалась переменная, а затем я к нему подсоединяю другой файл (через include) и в этом присоединяемом файле я пытаюсь использовать переменную из index.php, то у меня ничего не выйдет, т.е. я буду юзать как локальную получается? Я так понимаю в этом случае надо использовать $GLOBALS?
Записан

ещё один вопрос ...
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 21-07-2005 13:19 » 

Уже проверил по поводу дополнительных инклудов, как не крути файл инклудиться больше одного раза
Записан

ещё один вопрос ...
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #18 : 21-07-2005 14:38 » 

По поводу $GLOBALS. Есть ли различие в том как я подключаю файл, т.е. различие вот в чем
include ("sp_csv.php");
include ("www.что-нибудь.com/sp_csv.php");
Я подключаю файл sp_csv.php вторым способом и в файле не могу работать с глобальными переменными (там их не видно), а вот другой файл я подключаю первым способом и там глобальные переменные видны. Может дело в способе подключения? Или это не влияет?
Записан

ещё один вопрос ...
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #19 : 21-07-2005 15:54 » 

Народ, еще один вопрос. Я подключаю файл, при этом передаю ему параметр вот как я делаю
Код:
include ("www.что-нибудь.com/sp_csv.php?product=special");
Этот способ работает, но так я не могу работать с глобальными переменными. Как мне передать параметр, но при этом используя относительный адрес, т.е. так
Код:
include("sp_csv.php?product=special");
Но так делать нельзя (по крайней мере у меня так не работает, да и в мануале на рнр.нет написано что так нельзя). Но как мне сделать через отнгосительный адрес? Пробовал использовать set_include_path, но не помогло. Надежда только на вас Улыбаюсь.
Записан

ещё один вопрос ...
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #20 : 21-07-2005 20:20 » 

Уже проверил по поводу дополнительных инклудов, как не крути файл инклудиться больше одного раза
Проверяй пока не найдешь. Пойми: чудеса в природе встречаются, но они к программированию отношения не имеют. Ищи...
По поводу $GLOBALS. Есть ли различие в том как я подключаю файл, т.е. различие вот в чем
include ("sp_csv.php");
include ("www.что-нибудь.com/sp_csv.php");
Я подключаю файл sp_csv.php вторым способом и в файле не могу работать с глобальными переменными (там их не видно), а вот другой файл я подключаю первым способом и там глобальные переменные видны. Может дело в способе подключения? Или это не влияет?
Маны и еще раз маны!
Советую перестать извращаться и заняться изучением. Я и сам не мало намучился, пока вник в принципы языка - помогут только маны и эксперименты.
Если зайдешь в тупик - спрашивай, но только ты то же напрягайся.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #21 : 21-07-2005 20:29 » 

Я проверил неоднократно. Если адрес относительный, то к глобальным переменным я обращаюсь нормально, если же абсолютный, то ничего не выходит.
Мануал по include читал ни один раз и там пример есть и судя из него, нельзя передавать параметр при относительной адресации.
Я уже чего ни пробовал и писал об этом, но мои знания в этой области слижком малы, я не знаю к чему подобраться, не знаю какую функцию еще можно капать. Reqiure ядумаю не в счет, она вроде почти такая же как include. Ты хоть поттолкни в каком направлении искать.
ps. Ты меня за халявщика не держи, я искал долго, но сейчас я даже не знаю куда копать, и надеюсь на помощь тех кто с этим когда-то столкнулся.
« Последнее редактирование: 21-07-2005 20:34 от nikedeforest » Записан

ещё один вопрос ...
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #22 : 21-07-2005 20:36 » 

nikedeforest, если тебе кажется, что компьютер умнее тебя, то вариантов остается не так много....
Я все же пологаю, что компьютер - тупая железка. Переименуй свой загадочный файл в 'aaaaaaaaa.php' и создай файл 'нормальный.php':
Код:
<?php
print "Все очень плохо...<BR />";
include(&
#39;aaaaaaaaa.php&#39;);
Потом посмотри, как реально бывает.
« Последнее редактирование: 16-12-2007 17:47 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #23 : 21-07-2005 20:38 » 

не совсем понял. Если ты в смысле, что я мало пытался, то ты не прав. Я пытался вместо полного адреса типа www.djf.ru/sp_csv.php?product=special подставлять перед sp_csv?product=special dirname(), не помогло. Пробовал ставить точку, тупо сто раз пытался заставить прокатить include (sp_csv.php?product=special), но в замен всегда получаю
Цитата
Warning: main(sp_csv.php?product=special): failed to open stream: No such file or directory
Warning: main(): Failed opening 'sp_csv.php?product=special' for inclusion (include_path='.:/usr/local/lib/php')
« Последнее редактирование: 16-12-2007 17:48 от Алексей1153++ » Записан

ещё один вопрос ...
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #24 : 21-07-2005 20:47 » 

Смысл - в проверке каждой попытки  подгрузить файл.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #25 : 21-07-2005 20:53 » 

Я опять не понял что ты имеешь ввиду? Если такой момент, что типа я не узнаю подгружен файл или нет, то ты зря. Я вывожу сообщение о том, что файл подгружен и вывожу глобальные переменные.
Записан

ещё один вопрос ...
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #26 : 21-07-2005 21:04 » 

Пробовал кстати через фрейм подключать (у меня файл sp_csv.php выводит изображение и текст кое какой), но в этом случае глобальных перемен мне тоже не видать.
Записан

ещё один вопрос ...
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #27 : 21-07-2005 21:07 » 

Смысл найти места, где он подгружается.
Коли, как ты утверждаешь, везде используется include_once(), то ищи место, где не так. Например, поставь перед кадым include_once() такое: print("ф-ия такая-то(): гружу файл такой-то<BR />");. В самом файле поставь: print("Типа я ту <BR />");.
Ищи, где эти надписи идут друг за другом, а где нет. Коли есть где нет, то и есть непросмотренный код.
Пользуйся поиском среди файлов по содержимомую
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #28 : 21-07-2005 21:09 » 

Нет, ты не понимаешь, я пробовал вообще не подгружать, тогда в этих файлах не видно переменных котоые мне нужны.
Записан

ещё один вопрос ...
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #29 : 21-07-2005 21:13 » 

Подгрузка скорее всего просто необходима, а переменные наверное не видны из-за того, что файл sp_csv.php я подключаю через абсолютный адрес, вот из-за чего скорее всего include_once подключает еще раз.
зы: короче мне просто необходимо каким-нибудь образом подключить файл через относительный адрес и чтобы при этом я мог передать значение переменной. Не ужели этого нельзя сделать?
« Последнее редактирование: 21-07-2005 21:17 от nikedeforest » Записан

ещё один вопрос ...
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines