Передача переменных между страницами IFrame (php)

Готовые уроки IFrame + ВКонтакте API
GORDIY
Сообщения: 28
Зарегистрирован: 05 окт 2013, 19:11

Передача переменных между страницами IFrame (php)

Сообщение GORDIY »

Итак, начьнемс) ;)

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

Но при этом существует одна немаловажная проблема: При переходе между страницами приложения переменные уже не передаются..

На форуме уже есть тема с решением данной проблемы http://flapps.ru/forum/topic1117.html, но так как я как и многие другие только изучаю PHP описанный там способ Показался мне слишком громоздким и сложноватым..
Перечитывая кучи (флуда) комментов на разных форумах из кучи шлака нашел скомбинировал и пришел к болие легкому решению даной задачи

Нам понадобится всего пару строчек кода и начальные знания PHP

Создаем файл start.php с следуйщим кодом:

Код: Выделить всё

 <?phpsession_start(); // включаем сесии$_SESSION = $_GET; // записываем переменные в сесию /*Тут можно добавить код, который будет вести статистику, добавлять в базу нового пользователя и т.д.*/ header( 'Location: index.php' );  // Переадресация на главную страницу приложения?> 
В файле index.php в самом начале скрипта добавим:

Код: Выделить всё

 <?php session_start(); //включаем сесии  //дальше ваш код  ?> 
Теперь идем в настройки приложения вконтакте и в строке "адрес приложения" указываем адрес: http://WWW.ваш_сайт.ru/start.php

Вот собственно и все, просто и красиво 8-)

Дальше в любом месте вы можете вытянуть нужные вам даные ну например вот так:

Код: Выделить всё

  $viewer_id = $_SESSION['viewer_id']; 
Все)


ЛОВИТЕ МЕГА БОНУС :twisted:

Заносим пользователя в базу данных:

И так:

1. Создаём базу в phpMyAdmin.

Код: Выделить всё

 CREATE TABLE IF NOT EXISTS `user` (  `uid` int(20) NOT NULL,  `first_name` varchar(30) NOT NULL,  `last_name` varchar(30) NOT NULL,  `data_reg` date NOT NULL,  `time_reg` time NOT NULL,  `data_visit` date NOT NULL,  `time_visit` time NOT NULL,  `visits` int(11) NOT NULL DEFAULT '1',  PRIMARY KEY (`uid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

Теперь мы имеем таблицу с такими полями:
uid - ИД пользователя
first_name - имя пользователя
last_name - фамилия
data_reg - дата регистрации (первого входа в приложение)
time_reg - время регистрации (первого входа в приложение)
data_visit - Дата последнего входа в приложение
time_visit - время последнего входа в приложение
visits - количество посещений (запусков) приложения


2. Создаём php-файл Который проверяет есть ли пользователь с таким ид в базе данных:
если есть то обновляем дату и время последнего визита и добавляем 1 к посещениям, если нет заносим его в базу данных

Файл start.php

Код: Выделить всё

 <?phpsession_start();$_SESSION = $_GET; //////////////////////////////////////////////////////// $db_host='localhost';  // имя хоста сервера базы данных   обычно не нужно изменять$db_database="name";  //имя базы данных$db_username="root";       //имя пользователя БД$db_password="";      // пароль$table_name = "user"; // имя таблицы статистики. Если вы не меняли его в запросе, создающем БД, то и здесь менять его не надо   $viewer_id = $_GET['viewer_id']; //Записываем ИД пользователя в переменную $viewer_id  //------------------ Получаем ИМЯ и ФАМИЛИЮ -------------------------------//$resp = file_get_contents('https://api.vk.com/method/users.get?user_id='.$viewer_id.'&v=5.2');  // Посылаем запрос к API Вконтакте  и записываем ответ в переменную $resp$data = json_decode($resp, true);  //Декодируем получиный ответ и записываем в переменную $data foreach($data["response"] as $response); //Получиные данные записываем в масив $response   $first_name = $response['first_name']; // Записываем ИМЯ в переменную   $first_name  $last_name = $response['last_name'];   //Записываем ФАМИЛИЮ в переменную  $last_name//-----------------------------------------------------------------------------//  if ($viewer_id){    // соединение с БД    mysql_connect($db_host, $db_username, $db_password) or die (mysql_error());   // подключиться к базе данных    mysql_select_db($db_database) or die (mysql_error());  //выбираем имя базы данных     // Выполняем запрос: если пользователя с таким id ещё нет в БД, то добавляем, если есть, то обновляем запись, обновляя Время  (data_visit = NOW(), time_visit = NOW()) и прибавляя  одно посещение (`visits` = (`visits`+1))    $query = 'INSERT INTO '.$table_name.' (uid, first_name, last_name, data_reg, time_reg, data_visit, time_visit) VALUES ("'.$viewer_id.'", "'.$first_name.'", "'.$last_name.'", NOW(), NOW(), NOW(), NOW() ) ON DUPLICATE KEY UPDATE  visits = (visits+1),  data_visit = NOW(), time_visit = NOW()';    $sql = mysql_query($query);} ////////////////////////////////////////////////////////////////////////// header( 'Location: index.php' );  // Переадресация на главную страницу приложения?> 
Конечно с временем и датой можно было поступить по другому да и имя и фамилию можно было не записывать, но мне нравится именно так 8-)

Вроде все, надеюсь ничего не забыл. Благодарю за внимание, приятного пользования ;) :geek:
sasha^
Сообщения: 711
Зарегистрирован: 10 сен 2012, 16:52

Re: Передача переменных между страницами IFrame (php)

Сообщение sasha^ »

GORDIY, урок норм)) но это я и так знал... но многим, уверен, поможет! молодец ;)
1) ну и кстати лучше писать в куки, а не сессии, чтобы из js иметь доступ(вдруг там нужно...)
2) время, кстати, в 100500 раз лучше и нужно писать! в UNIX, а не YYYY-MM-DD HH:MM:SS и тогда всего будет 2 поля, и да, непонятно почему их 4=)..
3) имя и фамилию никто не пишет в бд! это глупость.. нужно их получать через api, тем более что users.get открытый метод...
4) использовать без необходимости методы с сервера - тоже тупо... только если уж не можно(нужно 100% проверить юзера), тогда и использовать...
5) нету проверки auth_key а значит я могу передать любой айди(и не свой) и все будет ок:)
6) все данные нужно фильтровать, например, viewer_id не мешало бы проверить на то что оно число, иначе будет sql-инъекция... $viewer_id = intval($_GET['viewer_id']); // обезопасили себя...(привели его к числу..)
Serge
WEB Team
WEB Team
Сообщения: 520
Зарегистрирован: 04 мар 2011, 21:55

Re: Передача переменных между страницами IFrame (php)

Сообщение Serge »

1) а лучше MVC
3) я пишу. Чтобы пользователь мог указать реальные данные, а не те, что в АПИ. Это важно.

А больше нечего ответить :)
sasha^
Сообщения: 711
Зарегистрирован: 10 сен 2012, 16:52

Re: Передача переменных между страницами IFrame (php)

Сообщение sasha^ »

Serge,
1) а при чем тут mvc? :) это же вроде model-view-controller... т.е. принцип создания приложений... а у нас вопрос о том куда лучше сохранять $_GET, в сессии или куки)) или ты о том что это должно быть отдельной частью, относящийся к логике?)
3) ну так тут пишется только из API, а значит смысла нет... а когда реальные данные - конечно есть смысл, но здесь совсем другое... ток главное не слишком много данных просить)):
7. Использовать персональные данные пользователей без получения разрешения пользователей. В любом случае запрещается запрашивать у пользователей такие персональные данные, как email, пароли, номера телефонов, паспортные данные и другую личную информацию.
Serge
WEB Team
WEB Team
Сообщения: 520
Зарегистрирован: 04 мар 2011, 21:55

Re: Передача переменных между страницами IFrame (php)

Сообщение Serge »

Не совсем корректно наверное сказать просто MVC, действительно. В случае с MVC обработка идет через один файл - index.php, правда при переходах всё равно он будет вызывать заново и теряться данные... Но можно "приспособить" это дело таким образом, что все данные будут передаваться ajax-ом, а на выходе просто менять содержимое страницы.
Не знаю почему, но именно такой метод мне показался наиболее удобным. Правда у меня не было приложений с больше чем 5ю разнотипными страницами...

А на счет сессий и кук - куки плохо, они могут быть выключены. Сессии - лучше, я не вдавался в подробности их работы (хотя использую :D), но у них же время жизни ограничено и в теории, если приложение открыто, но активности никакой нет - она умрёт.
sasha^
Сообщения: 711
Зарегистрирован: 10 сен 2012, 16:52

Re: Передача переменных между страницами IFrame (php)

Сообщение sasha^ »

Serge, насчет кук согласен... но сессии, если включены куки хранят свои данные именно там, а если нет - в строке запроса(get)... другими словами куки тоже норм.. темболее у всех юзеров ВК включены куки! т.к. и вк туда сохраняет данные... потому тут лучше не спорить)))куки используют все магазины для корзины и еще много разных сайтов(популярный), а точнее говоря почти все... потому это проблемы чела если они не включены, но именно в ВК они будут включены!) :)
GORDIY
Сообщения: 28
Зарегистрирован: 05 окт 2013, 19:11

Re: Передача переменных между страницами IFrame (php)

Сообщение GORDIY »

sasha^ писал(а): время, кстати, в 100500 раз лучше и нужно писать! в UNIX, а не YYYY-MM-DD HH:MM:SS и тогда всего будет 2 поля, и да, непонятно почему их 4=)
А как ты храниш Время в UNIX? Тоесть какой тип даных и как заносиш в таблицу? Предпологаю что можно в инт но мне чтото это несовсем нравится, пробовал в TIMESTAMP но он пишет дату в формате 2013-10-13 10:31:37 а как исправить не нашол, хотя многие пишут что он пишет и в UNIX...
Serge
WEB Team
WEB Team
Сообщения: 520
Зарегистрирован: 04 мар 2011, 21:55

Re: Передача переменных между страницами IFrame (php)

Сообщение Serge »

GORDIY
это пхп май админ рисует таймстамп в виде даты, при выборке всё будет нормально
GORDIY
Сообщения: 28
Зарегистрирован: 05 окт 2013, 19:11

Re: Передача переменных между страницами IFrame (php)

Сообщение GORDIY »

Serge писал(а):это пхп май админ рисует таймстамп в виде даты, при выборке всё будет нмально
При выборке дата тоже рисуетсяор как [4] => 2013-10-13 10:31:37
Serge
WEB Team
WEB Team
Сообщения: 520
Зарегистрирован: 04 мар 2011, 21:55

Re: Передача переменных между страницами IFrame (php)

Сообщение Serge »

GORDIY
не может быть. TIMESTAMP использую всюду, при выборке в php выдает число.
Ответить