Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Получить значение переменной в другом файле.


Автор: Avaj 10.8.2009, 08:33
Такой нубский вопрос smile :

Как сделать объект видимым для нескольких php-файлов, т.е. например переменная $var1 определена в файле 1.php, и как получить её значение в другом файле?

Автор: azesmcar 10.8.2009, 08:39
session_register?

Автор: Ипатьев 10.8.2009, 08:42
azesmcar, в общем случае сессии не подходят для ответа на такой неконкретный вопрос
И страшно устаревшая функция session_register - в частности.

Avaj, в таком виде, в котором вопрос задан, ответ один - записать её в базу данных.

Автор: azesmcar 10.8.2009, 08:46
Цитата(Ипатьев @  10.8.2009,  08:42 Найти цитируемый пост)
И страшно устаревшая функция session_register - в частности.

имелось ввиду сессия а не сама функция.

Цитата(Ипатьев @  10.8.2009,  08:42 Найти цитируемый пост)
azesmcar, в общем случае сессии не подходят для ответа на такой неконкретный вопрос

Почему? Человек хочет глобальные переменные, что это если не сессия?

Автор: Avaj 10.8.2009, 08:49
azesmcar, Ипатьев, ну в базу пока не надо, а конкретней так :


1.php

Код

<?php

$var1 = "sdffr";

?>




2.php:

Код


<?php

echo $var1; // надо чтоб тут было "sdffr"

?>


Автор: Ипатьев 10.8.2009, 08:50
Сессия  - это в первую очередь сохранение состояния в системе клиент-сервер. И только во вторую - средство передачи данных между скриптами. А если автору надо чтобы и другой клиент имел доступ к этим данным?

Автор: azesmcar 10.8.2009, 08:58
Цитата(Ипатьев @  10.8.2009,  08:50 Найти цитируемый пост)
Сессия  - это в первую очередь сохранение состояния в системе клиент-сервер. И только во вторую - средство передачи данных между скриптами. А если автору надо чтобы и другой клиент имел доступ к этим данным? 

Вот цитата с сайта php.net
Цитата

Session support in PHP consists of a way to preserve certain data across subsequent accesses.

Но совершенно не важно для чего они в первую очередь, важно что они решают задачу в том варианте, в котором я ее понял.
Цитата(Ипатьев @  10.8.2009,  08:50 Найти цитируемый пост)
А если автору надо чтобы и другой клиент имел доступ к этим данным? 

А если автору надо чтобы другой клиент пользовался другой базой данных? А если автору надо чтобы задача решалась без использования баз данных, а если автору надо чтобы эти клиенты находились на разных концах планеты и вообще не имели друг к другу никакого доступа? А если ... (продолжать?)
Какой смысл строить догадки?

Добавлено через 3 минуты и 35 секунд
Цитата(Avaj @  10.8.2009,  08:49 Найти цитируемый пост)
ну в базу пока не надо, а конкретней так :

Может имеет смысл определить все эти переменные в отдельном inc файле и заинклудить его там, где это надо?

Автор: bars80080 10.8.2009, 09:16
Цитата(azesmcar @  10.8.2009,  08:58 Найти цитируемый пост)
А если автору надо чтобы другой клиент пользовался другой базой данных? А если автору надо чтобы задача решалась без использования баз данных, а если автору надо чтобы эти клиенты находились на разных концах планеты и вообще не имели друг к другу никакого доступа? А если ... (продолжать?)
Какой смысл строить догадки?

Цитата(azesmcar @  10.8.2009,  08:58 Найти цитируемый пост)
в котором я ее понял.

именно поэтому и было сказано, что прежде чем говорить о сессиях, надо выяснить чего хочет топикстартер


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

по факту, в такого рода вопросах вдруг оказывается, что в самом деле один файл инклудится в другой, а следовательно вопроса нет как такового

Автор: Ипатьев 10.8.2009, 09:18
Avaj, в общем случае так невозможно. Скрипты выполняются в раздельном окружении, и так написать не получится. Передать можно только скалярные данные между скриптами.
Вопрос надо написать подробно. Что за переменные, для чего они нужны, кто их устанавливает и кто будет читать.
А не повторять то же самое другими словами. Описать реальный пример, в котором это понадобилось

Автор: Ипатьев 10.8.2009, 12:24
Цитата(bars80080 @  10.8.2009,  09:16 Найти цитируемый пост)
по факту, в такого рода вопросах вдруг оказывается, что в самом деле один файл инклудится в другой

А я бы поставил на GET. Интересно, кто выиграет? )))

Автор: MoLeX 10.8.2009, 12:53
а чем include/require не подходит?

Автор: youri 10.8.2009, 12:57
Ипатьев, +100

azesmcar, надо решать проблему стоящую перед ТС, а не помогать ему реализовывать придуманное им решение (http://ibash.org.ru/quote.php?id=10656 , http://phpfaq.ru/humor - первая гипербола)

Автор: Avaj 10.8.2009, 13:23
Ипатьев,  

А реальный пример такой :

Из HTML-формы в переменную $tableName считывается название будущей SQL-таблицы и таблица создаётся в скрипте 1.php:

Код


mysql_query("CREATE TABLE IF NOT EXISTS  $tableName (col1 TEXT, col2 TEXT)");

  


Далее из другой формы вводятся данные $data1 и $data2,  которые должны быть записаны в эту созданную таблицу в скрипте 2.php:

Код


mysql_query("INSERT INTO $tableName (col1, col2) VALUES( '$data1' , '$data2' )");



Но как вы знаете в скрипте 2.php переменная $tableName не содержит имени таблицы, там пусто.

(Извиняюсь, если что-то неправильно понимаю - в PHP недавно.)

Автор: bars80080 10.8.2009, 13:35
Цитата(Avaj @  10.8.2009,  13:23 Найти цитируемый пост)
Но как вы знаете в скрипте 2.php переменная $tableName не содержит имени таблицы, там пусто.

почему не содержит? наверно, потому что не положил  smile 

тут два вариант. если у нас нечто типа визарда, т.е. окошко: "введите имя таблицы", жмём кноку, создаётся таблица, появляется окошко: "введите данные" и т.д.

тогда точно надо делать через сессию. записывать имя таблицы в $_SESSION['tablename'] и всё


второй вариант. создали таблицу, ну и ладно. несколько позже, с какой-то страницы по ссылке "добавить данные" мы переходим на страницу с формой добавления данных. тут уж извини, но имя таблицы должно передаваться от ссылки, а как - это уже в зависимости от задачи.
к примеру, это личная таблица пользователя - тогда записать имя таблицы в БД в учётную запись пользователя.
если это просто некая таблица, и ты приводишь список таблиц которые можно редактировать, то тогда просто делаем соответствующую ссылку:
Код

<a href="edit.php?table=fintiflushki">редактировать таблицу fintiflushki</a>
<a href="edit.php?table=kolotushki">редактировать таблицу kolotushki</a>
...
и в скрипте получаем имя из $_GET





п.с. давать пользователю создавать таблицы - суть дурной тон
значит неверно спланирована структура БД

Автор: azesmcar 10.8.2009, 13:46
Цитата(youri @  10.8.2009,  12:57 Найти цитируемый пост)
azesmcar, надо решать проблему стоящую перед ТС, а не помогать ему реализовывать придуманное им решение (http://ibash.org.ru/quote.php?id=10656 , http://phpfaq.ru/humor - первая гипербола)

Это твое мнение. Ну и решай их по своему, у тебя тоже есть право голоса на форуме если не ошибаюсь. Я считаю что отвечать надо на поставленные вопросы, а не на придуманные.

Автор: lukas 10.8.2009, 13:48
Блин, развели демагогию...

Avaj

Когда ты подключаешь файл методом include, то все переменные до этого будут доступны в этом файле. Но когда таких инклюдов, и всяких require'ов очень много, следить за зоной видимости переменных становится невыносимо. Поэтому вариант один:

Код

$GLOBALS['var_name'] = значение...


а в другом файле просто:

Код

global $var_name;


И тебе станет доступна эта переменная.

Автор: Ипатьев 10.8.2009, 14:35
lukas, демагогия - это ответ про $GLOBALS. А точнее - элементарная неграмотность. 

Avaj, обычно в подобных случаях (форма 2 зависит от формы1) такие данные передаются через адресную строку, т.е. второй пример bars80080.

Но из пользовательского ввода таблицы практически никогда не создаются. Скорее всего, неправильно спроектирована база данных.
Не говоря уже о вопиющей небезопасности такого подхода вообще и приведеннного кода - в частности.

Автор: Avaj 10.8.2009, 15:09
bars80080

Цитата


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

 - это больше подходит.

Ну сначала происходит что-то типа регистрации, для юзера создаётся запись в таблице юзеров и создаётся таблица для его заметок (что-то типа блога).

Цитата


имя таблицы должно передаваться от ссылки

 - т.е. при добавлении в таблицу заметки юзера в скрипт передаётся и имя таблицы? - через скрытое поле в форме?

А как оно попадает в html-файл с формой? 

Автор: youri 10.8.2009, 15:13
Цитата(Avaj @  10.8.2009,  15:09 Найти цитируемый пост)
и создаётся таблица для его заметок (что-то типа блога)

создай таблицу заранее для всех пользователей. Если бы ты сразу рассказал, что ты делаешь - быстрее бы получил ответ ;)

Автор: Avaj 10.8.2009, 15:17
youri

Цитата


создай таблицу заранее для всех пользователей.



Одну на всех?

Цитата


Если бы ты сразу рассказал, что ты делаешь - быстрее бы получил ответ ;) 

 - да я не то что бы пытаюсь написать какой-то крутой "weblog eingine", учюсь просто, и в процессе возник вопрос про переменную, и отзывчивые люди активно помогают smile 

Автор: gcc 10.8.2009, 15:23
ассессор?

Код

class Class
{
    public $s = '6767';
    public function Out() {
        echo $this->s;
    }
}



Автор: Avaj 10.8.2009, 15:34
gcc, я не понял что имел ввиду.

Автор: Ипатьев 10.8.2009, 15:38
Avaj, это была шутка.

Надо сделать одну таблицу для блогов всех пользователей. Тогда все вопросы разом пропадут. 
А насчет различных способов передачи данных от скрипта к скрипту следует почитать учебник, для общего развития.

Автор: Avaj 10.8.2009, 15:45
Цитата


Надо сделать одну таблицу для блогов всех пользователей. Тогда все вопросы разом пропадут. 



Наверно так и надо, но мне кажется, что не так оно обычно устроено.

Или иметь много небольших таблиц значительно накладней, чем одну большую?

Автор: Ипатьев 10.8.2009, 15:56
Как раз наоборот. Именно так оно обычно и устроено. 
И накладность тут совсем не при чем. Есть такое понятие - архитектура базы данных. Она первична. Как сопромат в строительстве. Как сказано по одной из ссылок выше, высотные здания строят из железобетона, а не из дерева не потому, что он дешевле. И не потому, что дороже. Дело вообще не в "накладности". 

Однотипные данные в базе хранятся в одной таблице. 
К примеру, все сообщения всех тем в этом форуме хранятся в одной таблице.

Автор: lukas 11.8.2009, 09:28
Цитата(Ипатьев @  10.8.2009,  14:35 Найти цитируемый пост)
lukas, демагогия - это ответ про $GLOBALS. А точнее - элементарная неграмотность. 


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

Если иначе, наверно стоило человеку объяснить что php-скрипт выполняется один раз и после выполнения все объявленные переменные очищаются. 

Автор: youri 11.8.2009, 18:48
Цитата(lukas @  11.8.2009,  09:28 Найти цитируемый пост)
Я не виноват, что человек не может нормально выразить свои мысли

начинающий тоже не виноват в том, что он начинающий

Автор: Avaj 12.8.2009, 10:43
Всем спасибо.  smile 

Так правильно ли я понял, что для передачи значений от скрипта скрипту надо использовать сессии?

Автор: NewDima 12.8.2009, 10:48
Резюмирую вышесказанное:
1. если скрипты взаимодействуют в течении одного времени интерпритации, то ничего, кроме подключения модулей методами include/require, делать не нужно 
2. если скрипты связаны только пользователем, который к ним обращается, то можно использовать сессию, либо помещать нужные параметры в строку адреса, и на последующих шагах анализировать установленный параметр

Автор: Ипатьев 12.8.2009, 11:05
Цитата(Avaj @  12.8.2009,  10:43 Найти цитируемый пост)
Так правильно ли я понял, что для передачи значений от скрипта скрипту надо использовать сессии? 

Нет.

Автор: Avaj 13.8.2009, 05:25
Ипатьев, но http://www.softtime.ru/bookphp/gl8_1.php написано так:

Цитата


Сессии и cookies предназначены для хранения сведений о пользователях при переходах между несколькими страницами. При использовании сессий данные сохраняются во временных файлах на сервере. Файлы с cookies хранятся на компьютере пользователя, и по запросу отсылаются броузером серверу.


Автор: youri 13.8.2009, 08:14
Цитата(Avaj @  13.8.2009,  05:25 Найти цитируемый пост)
но здесь написано так

там не написано, что "для передачи значений от скрипта скрипту надо использовать сессии", там написано для хранения информации о пользователе. Например, возьмем твою идею и допустим, что таблицы называются notes_<id пользователя>. Тогда в сессии можно хранить id пользователя, а по id пользователя ты сможешь легко узнать имя таблицы. Можно было бы хранить имя таблицы в сессии, если не учитывать, что имя таблицы легко определяется по id и что под каждого пользователя отдельные таблицы не создают. Еще в сессии хранят список товаров, помещенных в корзину (в случае какого-нибудь электронного магазина)
Для передачи значений от одной страницы к другой (а не от скрипта к скрипту) используются параметры запроса (то что после знака вопроса в ссылке, например)

Автор: gcc 13.8.2009, 08:26
а что делают эти скрипты?

можно демона написать на сокетах, share memory, mysql, серилизировать данные куда-то в файл на сервере

Добавлено позже
а что делают эти скрипты?

можно демона написать на сокетах, share memory, mysql, серилизировать данные куда-то в файл на сервере

Автор: bars80080 13.8.2009, 09:37
Avaj, я не стал ничего писать, потому что к этому 
Цитата(Ипатьев @  10.8.2009,  15:56 Найти цитируемый пост)
Однотипные данные в базе хранятся в одной таблице

собственно добавить нечего


это как основополагающая статья в конституции SQL, которая правке не подлежит.

если у тебя одинаковые данные, то они по определению должны находиться в одной таблице. нужно ведь всего лишь ввести одно дополнительное поле id_user и всё.
мало того, определяя все записи в одну таблицу ты получаешь неисчислимые преимущества в виде сортировок, удобного поиска ключевых слов во всех блогах сразу, сравнения пользователей.
наличие же отдельной таблицы не даёт вообще никаких преимуществ, и приэтом делает систему громозкой и совершенно не гибкой. как в управлении таблицами, так и в работе с данными

Автор: Avaj 15.8.2009, 06:39
Всем спасибо, разобрался.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)