Не могу установить соединение AS-PHP-MySQLi

Программирование, которое не связано с API и Flash.

Не могу установить соединение AS-PHP-MySQLi

Сообщение Апчхи » 25 окт 2013, 00:09

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

Суть вопроса: есть полноценное приложение, есть БД. Не могу написать нормальный пхп-скрипт для связки. В пхп слаб, кто заметит ошибку - буду благодарен:
AS 3.0
  1. import flash.events.Event;
  2. import flash.display.Sprite;
  3. import flash.text.TextFormat;
  4. import flash.text.TextField;
  5. import flash.media.Sound;
  6. import flash.net.*;
  7. import vk.APIConnection;
  8. import vk.events.*;
  9.  
  10. //Переменные vk
  11. var api_id:Number;
  12. var viewer_id:Number;
  13. var sid:String;
  14. var secret:String;
  15.  
  16. //Заполняю переменные данными
  17. var flashVars:Object = stage.loaderInfo.parameters as Object;
  18. api_id = flashVars['api_id'];
  19. viewer_id = flashVars['viewer_id'];
  20. sid = flashVars['sid'];
  21. secret = flashVars['secret'];
  22.  
  23. var VK:APIConnection = new APIConnection(flashVars);
  24. VK.api("getProfiles", {uids:flashVars.viewer_id, fields:"first_name,last_name"});
  25. // Переменные для имени и фамилии
  26. var userInfoNameF:String = "";
  27. var userInfoNameL:String = "";
  28.  
  29. // Финкция отвечающая за подсоединение к пхп-скрипту и обработку всех данных
  30. function sendData (vars:URLVariables, onSuccess:Function):void {
  31.     var request:URLRequest = new URLRequest();
  32.     request.url = "адрес скрипта";
  33.     request.method = URLRequestMethod.POST;
  34.     request.data = vars;
  35.    
  36.     var loader:URLLoader = new URLLoader();
  37.     loader.dataFormat = URLLoaderDataFormat.VARIABLES;
  38.     loader.addEventListener (Event.COMPLETE, onSuccess);
  39.    
  40.     loader.load(request);
  41. }
  42.  
  43. // Привязка данных к переменным
  44. function loadUserInfo(response:Object):void
  45. {
  46.     userInfoNameF = response[0]['first_name'];
  47.     userInfoNameL = response[0]['last_name'];
  48. }
  49.  
  50. //Данные которые нужно передать
  51. stage.addEventListener(Event.ENTER_FRAME, peredachaDannih);
  52.  
  53. function peredachaDannih (e:Event):void {
  54.     sendData(new URLVariables("password=пароль&do=send&uid=" + flashVars.viewer_id + "&f_name=" + userInfoNameF + "&l_name=" + userInfoNameL), posted);
  55. }
  56.  
  57. function posted(e:Event) {
  58.    
  59. }


PHP:
  1. <?php
  2. $link = mysql_connect("сервер","пользователь", [i]пароль[/i]);
  3. mysql_select_db("БД");
  4. mysql_set_charset('utf8');
  5.  
  6. if($_POST['password'] == "пароль") {
  7.     if($_POST['do'] == "send"){
  8.         $uid = $_POST['uid'];
  9.         $f_name = $_POST['f_name'];
  10.         $l_name = $_POST['l_name'];
  11.        
  12.         INSERT INTO `[i]имя БД[/i]`.`vk_table` (`id`, `uid`, `f_name`, `l_name`) VALUES (NULL, '$uid', '$f_name', '$l_name');
  13.        
  14.         print "result=success";
  15.     }
  16. }
  17.  
  18.  
  19. ?>
Апчхи

 
Автор темы
Сообщения: 79
Зарегистрирован: 26 авг 2013, 23:12
Благодарил (а): 14 раз.
Поблагодарили: 0 раз.

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

Google
 



Re: Не могу установить соединение AS-PHP-MySQLi

Сообщение sasha^ » 25 окт 2013, 07:39

я сейчас ухожу... если никто до меня не напишет - напишу=) но суть в том, что тут нет запроса... и да, это не mysqli, a mysql
и еще.... человек не должен знать пароль от бд!!!! категорически запрещено... все пароли должны быть только на сервере.... а проверка человека - через auth_key(сейчас я могу взять пароль и поменять запросы, тем самым поменяв имена любого человека)
ну и нужно еще фильтровать данные на php, а то я введу какой-нить тупой запрос вместо имени и все - бд очистилась, другими словами сделаю sql-инъекцию...
и да... какого черта делать фамилии и имени в бд, если они получены через vkapi? метод users.get открытый, вот и не нужно засорять бд... если был бы это никней - то ок, а так - нету смысла....
sasha^

 
Сообщения: 711
Зарегистрирован: 10 сен 2012, 16:52
Благодарил (а): 1 раз.
Поблагодарили: 136 раз.

Re: Не могу установить соединение AS-PHP-MySQLi

Сообщение Апчхи » 25 окт 2013, 09:34

1) Пароль я из программы уберу (будет получаться от сервера), просто... так мне легче.
2) У меня пользователь с ограниченными возможностями.
3) Я хочу понять как делать. Благодаря этому сайту я понял как работает один метод и могу уже с десяток настроить :D , мне бы понять как работает передача и всё нужное смогу настроить.
Апчхи

 
Автор темы
Сообщения: 79
Зарегистрирован: 26 авг 2013, 23:12
Благодарил (а): 14 раз.
Поблагодарили: 0 раз.

Re: Не могу установить соединение AS-PHP-MySQLi

Сообщение Александр » 25 окт 2013, 19:03

Апчхи
  1. $mysqli = new mysqli($db_host, $db_user, $db_password, $db_name);
  2.  
  3. if (mysqli_connect_errno()) {
  4.     printf("Ошибка соединения: %s\n", mysqli_connect_error());
  5.     exit;
  6. }
  7. $mysqli->set_charset("utf8");
  8.  
  9. $stmt = $mysqli->prepare("INSERT INTO `vk_table` (`uid`, `f_name`, `l_name`) VALUES (?,?,?)");
  10. $stmt->bind_param('iss', $f_name, $l_name);
  11. $stmt->execute();

По аналогии с topic165.html
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
 
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45
Откуда: Санкт-Петербург
Благодарил (а): 126 раз.
Поблагодарили: 771 раз.

Re: Не могу установить соединение AS-PHP-MySQLi

Сообщение Апчхи » 26 окт 2013, 15:43

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

Код приложения:
  1. import flash.events.*;
  2. import flash.display.*;
  3. import flash.net.*;
  4. import vk.APIConnection;
  5. import vk.events.*;
  6.  
  7. //Переменные
  8. var api_id:Number;
  9. var viewer_id:Number;
  10. var sid:String;
  11. var secret:String;
  12.  
  13. //Заполняем переменные данными
  14. var flashVars:Object = stage.loaderInfo.parameters as Object;
  15. api_id = flashVars['api_id'];
  16. viewer_id = flashVars['viewer_id'];
  17. sid = flashVars['sid'];
  18. secret = flashVars['secret'];
  19.  
  20. var VK:APIConnection = new APIConnection(flashVars);
  21.  
  22. // Тут отличие от topic165.html только в том, что заменил ссылку на ссылку к своему скрипту.
  23.  
  24. function sendData ():void {
  25.             var stat_loader:URLLoader = new URLLoader();
  26.             var stat_request:URLRequest=new URLRequest("http://мой_домен.ru/stat.php");//
  27.             stat_request.method=URLRequestMethod.POST;
  28.             // добавление параметров в запрос
  29.             var stat_vars:URLVariables = new URLVariables();
  30.             stat_vars['auth_key']=LoaderInfo(root.loaderInfo).parameters.auth_key;// auth_key из FlashVars
  31.             stat_vars['viewer_id']=LoaderInfo(root.loaderInfo).parameters.viewer_id;// ID просматривающего приложение
  32.             stat_request.data=stat_vars;
  33.             // выполнение запроса
  34.             stat_loader.load(stat_request);
  35. }


В скрипте я убрал все пароли, кроме пароля к БД, так как сейчас моя цель подключиться и в тестовом режиме передать данные.
Код скрипта:
  1. <?php
  2. // данные доступа к базе данных
  3. $db_host="Мой_хост";       // обычно не нужно изменять
  4. $db_user="Моё_имя_";        // имя пользователя БД
  5. $db_password="Мой_пароль";        // пароль БД
  6. $db_name = "Имя_БД";      // имя БД
  7.  
  8. $uid = $_POST['uid'];
  9. $first_name = $_POST['first_name'];
  10. $last_name = $_POST['last_name'];
  11.  
  12. $mysqli = new mysqli($db_host, $db_user, $db_password, $db_name);
  13.  
  14. if (mysqli_connect_errno()) {
  15.     printf("Ошибка соединения: %s\n", mysqli_connect_error());
  16.     exit;
  17. }
  18. $mysqli->set_charset("utf8");
  19.  
  20. $stmt = $mysqli->prepare("INSERT INTO `vk` (`uid`, `first_name`, `last_name`) VALUES (?,?,?)");
  21. $stmt->bind_param('iss', $first_name, $last_name);
  22. $stmt->execute();
  23.  
  24. ?>


И про всяк случай скрин моей БД:Изображение
Апчхи

 
Автор темы
Сообщения: 79
Зарегистрирован: 26 авг 2013, 23:12
Благодарил (а): 14 раз.
Поблагодарили: 0 раз.

Re: Не могу установить соединение AS-PHP-MySQLi

Сообщение IndieGD » 26 окт 2013, 17:00

В вашем коде
на клиенте:
  1. stat_vars['auth_key']=LoaderInfo(root.loaderInfo).parameters.auth_key;// auth_key из FlashVars
  2. stat_vars['viewer_id']=LoaderInfo(root.loaderInfo).parameters.viewer_id;// ID просматривающего приложение

на сервере:
  1. $uid = $_POST['uid'];
  2. $first_name = $_POST['first_name'];
  3. $last_name = $_POST['last_name'];

Из клиента вы передаете auth_key и viewer_id. А на сервере пытаетесь поймать uid, first_name и last_name, которых в запросе никак не может быть, потому что клиент их не отправлял.

Во-вторых, вот в этой строке:

должно быть так:
  1. $stmt->bind_param('iss', $uid, $first_name, $last_name);

вы же сами указали 'iss' а вяжете только 'ss'.
IndieGD

 
Сообщения: 124
Зарегистрирован: 28 май 2013, 19:20
Благодарил (а): 1 раз.
Поблагодарили: 34 раз.

Re: Не могу установить соединение AS-PHP-MySQLi

Сообщение Апчхи » 26 окт 2013, 17:55

Спасибо, попробую реализовать!
Апчхи

 
Автор темы
Сообщения: 79
Зарегистрирован: 26 авг 2013, 23:12
Благодарил (а): 14 раз.
Поблагодарили: 0 раз.

Re: Не могу установить соединение AS-PHP-MySQLi

Сообщение Апчхи » 26 окт 2013, 18:57

Поправил - не передаёт. Знаю что с помощью api-метода нужные мне параметры получает программа вот так:
  1. VK.api("getProfiles", {uids:flashVars.viewer_id, fields:"first_name,last_name"}, ФункцияВСлучаеУспеха, ФункцияВСлучаеОшибки);


Я сейчас сделал цепочку такой:
AS:
  1.            stat_vars['first_name']=LoaderInfo(root.loaderInfo).parameters.first_name;
  2.             stat_vars['viewer_id']=LoaderInfo(root.loaderInfo).parameters.viewer_id;
  3.             stat_vars['last_name']=LoaderInfo(root.loaderInfo).parameters.last_name;


PHP:
  1. $viewer_id = $_POST['viewer_id'];
  2. $first_name = $_POST['first_name'];
  3. $last_name = $_POST['last_name'];
  4.  
  5. $mysqli = new mysqli($db_host, $db_user, $db_password, $db_name);
  6.  
  7. if (mysqli_connect_errno()) {
  8.     printf("Ошибка соединения: %s\n", mysqli_connect_error());
  9.     exit;
  10. }
  11. $mysqli->set_charset("utf8");
  12.  
  13. $stmt = $mysqli->prepare("INSERT INTO `vk` (`viewer_id`, `first_name`, `last_name`) VALUES (?,?,?)");
  14. $stmt->bind_param('iss', $viewer_id, $first_name, $last_name);
  15. $stmt->execute();


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

 
Автор темы
Сообщения: 79
Зарегистрирован: 26 авг 2013, 23:12
Благодарил (а): 14 раз.
Поблагодарили: 0 раз.

Re: Не могу установить соединение AS-PHP-MySQLi

Сообщение sasha^ » 26 окт 2013, 19:29

есть такое как запрос... URLLoader в эту сторону копать... код писать не буду, но вот свой класс для запросов:
  1. package src {
  2.     import flash.net.*;
  3.     import flash.display.*;
  4.     import flash.events.*;
  5.     import vk.api.serialization.json.JSON;
  6.    
  7.     internal class Query {
  8.         private var data:Object;
  9.         private var loader:Loader;
  10.         private var loaderURL:URLLoader;
  11.         private var func:Function;
  12.         private var errfunc:Function;
  13.        
  14.         public static const IMAGE_LOAD:String = "image_load";
  15.         public static const GET_QUERY:String = "get_query";
  16.         public static const POST_QUERY:String = "post_query";
  17.        
  18.         function Query(type:String,url:String,vars:Object,func:Function,errfunc:Function,game:Main=null) {
  19.             this.func = func;
  20.             this.errfunc = errfunc;
  21.             switch(type) {
  22.                 case Query.IMAGE_LOAD:
  23.                     loader = new Loader();
  24.                     loader.contentLoaderInfo.addEventListener(Event.INIT, onLoadImage);
  25.                     loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onError);
  26.                     loader.load(new URLRequest(url));
  27.                     break;
  28.                
  29.                 case Query.GET_QUERY:
  30.                     query(url,vars,true,game);
  31.                     break;
  32.                
  33.                 case Query.POST_QUERY:
  34.                     query(url,vars,false,game);
  35.                     break;
  36.             }
  37.         }
  38.        
  39.         private function onLoadImage(e:Event):void {
  40.             func(loader);
  41.         }
  42.        
  43.         private function onError(e:IOErrorEvent):void {
  44.             errfunc();
  45.         }
  46.        
  47.         private function onComplete(e:Event):void {
  48.             trace(loaderURL.data);
  49.             GlobalConsts.LOG += "\n" + loaderURL.data;
  50.             func(vk.api.serialization.json.JSON.decode(loaderURL.data));
  51.         }
  52.        
  53.         private function query(url:String,vars:Object,isGet:Boolean,game:Main):void {
  54.             loaderURL = new URLLoader();
  55.             var r:URLRequest = new URLRequest(url);
  56.             r.method = isGet ? URLRequestMethod.GET : URLRequestMethod.POST;
  57.             var urlVars:URLVariables = new URLVariables();
  58.             for(var v:Object in vars) {
  59.                 if(vars[v] as String) urlVars[v] = vars[v] as String
  60.                 else urlVars[v] = vk.api.serialization.json.JSON.encode(vars[v]);
  61.             }
  62.             urlVars["rnd"] = Math.random();
  63.             if(game) {
  64.                 urlVars["viewer_id"] = game.viewer_id;
  65.                 urlVars["auth_key"] = game.auth_key;
  66.             }
  67.             r.data = urlVars;
  68.             loaderURL.addEventListener(Event.COMPLETE, onComplete);
  69.             loaderURL.addEventListener(IOErrorEvent.IO_ERROR, onError);
  70.             loaderURL.load(r);
  71.         }
  72.     }
  73. }


и посылать запросы примерно так:
  1. new Query(Query.POST_QUERY, GlobalConsts.SERVER + script + ".php",
  2.                       vars, success, error, game);


но для твоего случая перепиши как нужно(я показал свой служебный класс и урывок кода для запроса)....
sasha^

 
Сообщения: 711
Зарегистрирован: 10 сен 2012, 16:52
Благодарил (а): 1 раз.
Поблагодарили: 136 раз.

Re: Не могу установить соединение AS-PHP-MySQLi

Сообщение Александр » 26 окт 2013, 19:42

Апчхи
Будет полезно Отладка приложений, взаимодействующих с сервером.

Постепенно все делай.
1. Сначала получи нужные данные во flash.
Сделай trace(param), чтобы убедиться что данные есть. Смысл отправлять запрос на сервер если данных нет?
2. Если данные есть, то убедись, что запрос к серверу происходит и данные передаются.
Это можно увидеть с помощью Charles. Смысл искать ошибку в серверном скрипте, если до него не доходит запрос?
3. Проверь, принимает ли php скрипт данные.
Сделай echo или print_r. Смысл пытаться записать в базу что-то, если данные не приняты?
4. Если данные принимаются в php, то только тогда думай о том как их записать.
Если вдруг почему-то не сохраняются в базу, то пропиши их в php скрипте вручную и ищи проблему просто обратившись к php файлу из адресной строки браузера.
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
 
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45
Откуда: Санкт-Петербург
Благодарил (а): 126 раз.
Поблагодарили: 771 раз.

След.

Вернуться в Программирование на PHP и других языках (без использования API)



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

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

cron