Создание базы пользователей приложения и ведение статистики

Только готовые уроки по использованию ВКонтакте API. Flash + PHP + API. НЕ IFrame!

Создание базы пользователей приложения и ведение статистики

Сообщение Александр » 11 янв 2010, 20:11

Создание базы пользователей приложения и ведение статистики посещений (php + mySQL)

Программирование на Action Script 3, в среде Adobe Flash.
Программирование на PHP, в чём угодно, можно даже в блокноте.

Понадобится свой сервер с поддержкой php и mySQL.

Серверная часть
1. Заходим в phpMyAdmin.
Если не знаете как зайти в phpMyAdmin, то почитайте инструкции вашего хостера.

2. Переходим на вкладку SQL, и там где написано "Выполнить SQL-запрос(ы) к базе данных" пишем запрос, создающий базу:
  1. CREATE TABLE IF NOT EXISTS `stat` (
  2.   `uid` int(9),
  3.   `last_date` int(10),
  4.   `visits` int(9) default '1',
  5.   UNIQUE KEY `uid` (`uid`)
  6. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

Нажимаем ОК.

uid - ID пользователя
last_date - дата последнего посещения
visits - количество посещений

3. Создаём новый php-файл.
Можно открыть блокнот и написать этот код в нём.
  1. <?php
  2. // данные доступа к базе данных
  3. $db_host="localhost";       // обычно не нужно изменять
  4. $db_user="user";        // имя пользователя БД
  5. $db_password="pass";        // пароль БД
  6. $db_name = "name";      // имя БД
  7.  
  8. // данные приложения
  9. $app_id = '743131'; // id приложения
  10. $api_secret = 'qwertyuiopasdfghjklzxcvbnm'; // защищенный ключ приложения
  11.  
  12.  
  13. $auth_key  = $_POST['auth_key'];
  14. $viewer_id = $_POST['viewer_id'];
  15.  
  16. $real_key = md5($app_id."_".$viewer_id."_".$api_secret);
  17. if ($auth_key == $real_key){
  18.     // соединение с БД
  19.     $mysqli = new mysqli($db_host, $db_user, $db_password, $db_name);
  20.  
  21.     if (mysqli_connect_errno()) {
  22.         printf("Ошибка соединения: %s\n", mysqli_connect_error());
  23.         exit;
  24.     }
  25.     $mysqli->set_charset("utf8");
  26.  
  27.     // подготовка запроса: если пользователя с таким id ещё нет в БД, то добавляем, если есть, то обновляем запись, прибавляя одно посещение (`visits` = (`visits`+1))
  28.     $stmt = $mysqli->prepare("INSERT INTO `stat` (`uid`, `last_date`, `name`) VALUES (?,?,?) ON DUPLICATE KEY UPDATE  `visits` = (`visits`+1), `last_date`=?;");
  29.     $stmt->bind_param('iisi', $viewer_id, time(), $name, time());
  30.    
  31.     // выполнение запроса
  32.     $stmt->execute();
  33.  
  34.     echo "OK";
  35. }
  36. ?>

Сохраняем этот файл как stat.php

ВАЖНО! Если вы будете расширять функционал без четкого понимания что вы делаете, код может стать уязвимым для взлома.
Обеспечить безопасность кода вы должны самостоятельно. Подробнее читайте в теме Безопасность скриптов, защита от инъекций, XSS (php, sql).

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

mysql и mysqli - это не одно и то же. Использовать mysql не рекомендуется, т.к. поддержка этого расширения будет убрана из PHP в будущем.

Знак вопроса "?" в функции prepare используется там, где должны быть переданные данные.
Проще будет объяснить на простом запросе. Допустим, что в базу дополнительно было добавлено значение name (строка). Учтите, что на практике, хранить имя пользователя ВКонтакте в базе практически никогда не имеет смысла.
Запрос добавления в базу выглядит так:
  1. $stmt = $mysqli->prepare("INSERT INTO `stat` (`uid`, `last_date`, `name`) VALUES (?,?,?)");

В этом запросе добавляются 3 значения, соответственно в запросе 3 знака вопроса.

Далее данные подставляются на свое место:

Первая строка, в данном случае 'iis', предназначена для того чтобы сообщить функции какие данные ей должны были быть переданы (числа, строки). Три значения передаем, значит и в строке должно быть три символа.

Типы бывают:
i - Все INT типы
d - DOUBLE и FLOAT
b - BLOB
s - Строки и другие типы

Указание типов помогает избежать SQL-инъекции (взлома). Но вам все равно нужно учитывать какие данные передает пользователь. Он может передать данные нужного типа, но на которые вы не рассчитывали.

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

Если бы использовали mysql, то код выглядел бы немного проще, но при расширении функционала, он бы значительно усложнился.
 Старый способ
Использовать не рекомендуется.
  1.    // соединение с БД
  2.     mysql_connect($db_host, $db_user, $db_password) or die (mysql_error());
  3.     mysql_select_db($db_name) or die (mysql_error());
  4.     mysql_query("SET NAMES 'utf8'");
  5.  
  6.     // Выполняем запрос: если пользователя с таким id ещё нет в БД, то добавляем, если есть, то обновляем запись, прибавляя одно посещение (`visits` = (`visits`+1))
  7.     $query = 'INSERT INTO `'.$table_name.'` (`uid`, `last_date`) VALUES ("'.$viewer_id.'","'.time().'") ON DUPLICATE KEY UPDATE  `visits` = (`visits`+1), `last_date`="'.time().'";';
  8.     $sql = mysql_query($query);

ВНИМАНИЕ! Поддержка функции mysql_query будет удалена из PHP в будущем.
Данное расширение устарело, начиная с версии PHP 5.5.0, и будет удалено в будущем. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API и соответствующий FAQ для получения более подробной информации. Альтернативы для данной функции:
mysqli_query()
PDO::query()


4. Если вы ещё не создавали crossdomain.xml и не загружали его на свой хостинг, то открываем блокнот, пишем в него код:
  1. <cross-domain-policy>
  2. <allow-access-from domain="*.vkontakte.ru"/>
  3. <allow-access-from domain="*.vk.com"/>
  4. <allow-access-from domain="*.userapi.com"/>
  5. <allow-access-from domain="*.vk.me"/>
  6. </cross-domain-policy>

Сохраняем как crossdomain.xml

5. Загружаем файлы на сервер.
stat.php загружаем в любой каталог на сервере, crossdomain.xml - в корневой каталог сайта.


Приложение
1. Создаём новый документ AS3 и новый Main.as файл. Связываем их.
Если вы не знаете как подключить Main.as, то посмотрите как это было сделано в этом уроке topic9.html (Пункт 7).

2. В файле Main.as пишем код:
  1. package {
  2.     import flash.net.*;
  3.     import flash.display.*;
  4.  
  5.     public class Main extends Sprite {
  6.         public function Main():void {
  7.             // создание запроса
  8.             var stat_loader:URLLoader = new URLLoader();
  9.             var stat_request:URLRequest=new URLRequest("http://flapps.ru/stat.php");// заменяем на ссылку к вашему скрипту
  10.             stat_request.method=URLRequestMethod.POST;
  11.             // добавление параметров в запрос
  12.             var stat_vars:URLVariables = new URLVariables();
  13.             stat_vars['auth_key']=LoaderInfo(root.loaderInfo).parameters.auth_key;// auth_key из FlashVars
  14.             stat_vars['viewer_id']=LoaderInfo(root.loaderInfo).parameters.viewer_id;// ID просматривающего приложение
  15.             stat_request.data=stat_vars;
  16.             // выполнение запроса
  17.             stat_loader.load(stat_request);
  18.         }
  19.     }
  20. }


3. Создаём swf файл и загружаем его в контакт.

4. Проверяем настройки приложения.
Контейнер приложения: Без использования контейнера.

5. Проверяем как работает приложение.
Открываем его в браузере, ждем несколько секунд.
Заходим в phpMyAdmin, смотрим записи в созданной ранее таблице "stat". Если вы всё сделали верно, то увидите новую запись: Ваш id, дату посещения в UNIXTIME и количество посещений (1).
Можете ещё раз открыть приложение в браузере или обновить страничку с ним и посмотреть как обновится количество визитов в базе.

Исходник приложения с серверной частью Чтобы увидеть ссылку - зарегистрируйтесь

За это сообщение автора Александр поблагодарили - 13:
D_Koff, Dav023, gpv123, jameses, Nick Lisogor, paduchin, Roman99, site-eks, Ugly, ukhov, Volgar, wypaa, ZukuZ
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
 
Автор темы
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45
Откуда: Санкт-Петербург
Благодарил (а): 126 раз.
Поблагодарили: 771 раз.

Чтобы убрать блок с рекламой, зарегистрируйтесь на форуме или войдите.

Google
 



Re: Создание базы пользователей приложения и ведение статистики

Сообщение romarius777 » 11 янв 2010, 21:06

Александр, спасибо))
romarius777

 
Сообщения: 24
Зарегистрирован: 03 ноя 2009, 15:30
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: Создание базы пользователей приложения и ведение статистики

Сообщение wole » 12 янв 2010, 11:23

Thx
wole

 
Сообщения: 8
Зарегистрирован: 08 янв 2010, 06:45
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: Создание базы пользователей приложения и ведение статистики

Сообщение VIP » 12 янв 2010, 21:43

Я обоссался от радости
VIP

 
Сообщения: 252
Зарегистрирован: 24 ноя 2009, 18:10
Благодарил (а): 23 раз.
Поблагодарили: 1 раз.

Re: Создание базы пользователей приложения и ведение статистики

Сообщение VIP » 12 янв 2010, 22:00

Всё супер
Последний раз редактировалось VIP 12 янв 2010, 22:10, всего редактировалось 1 раз.
VIP

 
Сообщения: 252
Зарегистрирован: 24 ноя 2009, 18:10
Благодарил (а): 23 раз.
Поблагодарили: 1 раз.

Re: Создание базы пользователей приложения и ведение статистики

Сообщение zagruzkaaa » 12 янв 2010, 22:08

еще бы сделали чтоб статистика выводилась в приложении :) буду благодарен :) хотя и сейчас благодарен))))))))))))
zagruzkaaa

 
Сообщения: 60
Зарегистрирован: 19 ноя 2009, 20:47
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: Создание базы пользователей приложения и ведение статистики

Сообщение VIP » 13 янв 2010, 11:12

А нормально есле в БД last_date отображаеться как 1263368432
VIP

 
Сообщения: 252
Зарегистрирован: 24 ноя 2009, 18:10
Благодарил (а): 23 раз.
Поблагодарили: 1 раз.

Re: Создание базы пользователей приложения и ведение статистики

Сообщение psix55 » 13 янв 2010, 15:18

Да
Если хочешь помочь голодному, не давай ему рыбы, дай ему удочку.

За это сообщение автора psix55 поблагодарил:
kostya74
Аватара пользователя
psix55
Модератор
Модератор
 
Сообщения: 1015
Зарегистрирован: 09 дек 2009, 17:16
Благодарил (а): 17 раз.
Поблагодарили: 74 раз.

Re: Создание базы пользователей приложения и ведение статистики

Сообщение Александр » 13 янв 2010, 15:49

zagruzkaaa
PHP скриптом получай нужные данные из базы и выводи их в приложение, подгружая эти данные из этого скрипта. Пример здесь topic102.html

VIP
Написано же "дата посещения в UNIXTIME". Если не знаешь что это, то почитай в интернете.
Чтобы при выводе показать привычный вид даты, в запросе к базе используй FROM_UNIXTIME(last_date). Если понимаешь о чём я.
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
 
Автор темы
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45
Откуда: Санкт-Петербург
Благодарил (а): 126 раз.
Поблагодарили: 771 раз.

Re: Создание базы пользователей приложения и ведение статистики

Сообщение VIP » 14 янв 2010, 19:46

Ещё такой вопросик: как всё это сделать под контейнер или точнее почему оно не работает в контейнере?
VIP

 
Сообщения: 252
Зарегистрирован: 24 ноя 2009, 18:10
Благодарил (а): 23 раз.
Поблагодарили: 1 раз.

След.

Вернуться в Уроки по использованию ВКонтакте API



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0