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

Программирование, которое не связано с API.
Апчхи
Сообщения: 79
Зарегистрирован: 26 авг 2013, 23:12

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

Сообщение Апчхи »

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

Суть вопроса: есть полноценное приложение, есть БД. Не могу написать нормальный пхп-скрипт для связки. В пхп слаб, кто заметит ошибку - буду благодарен:
AS 3.0

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

import flash.events.Event;import flash.display.Sprite;import flash.text.TextFormat;import flash.text.TextField;import flash.media.Sound;import flash.net.*;import vk.APIConnection;import vk.events.*; //Переменные vkvar api_id:Number;var viewer_id:Number;var sid:String;var secret:String; //Заполняю переменные даннымиvar flashVars:Object = stage.loaderInfo.parameters as Object;api_id = flashVars['api_id'];viewer_id = flashVars['viewer_id'];sid = flashVars['sid'];secret = flashVars['secret']; var VK:APIConnection = new APIConnection(flashVars);VK.api("getProfiles", {uids:flashVars.viewer_id, fields:"first_name,last_name"});// Переменные для имени и фамилииvar userInfoNameF:String = "";var userInfoNameL:String = ""; // Финкция отвечающая за подсоединение к пхп-скрипту и обработку всех данныхfunction sendData (vars:URLVariables, onSuccess:Function):void {    var request:URLRequest = new URLRequest();    request.url = "[i]адрес скрипта[/i]";    request.method = URLRequestMethod.POST;    request.data = vars;        var loader:URLLoader = new URLLoader();    loader.dataFormat = URLLoaderDataFormat.VARIABLES;    loader.addEventListener (Event.COMPLETE, onSuccess);        loader.load(request);} // Привязка данных к переменнымfunction loadUserInfo(response:Object):void{    userInfoNameF = response[0]['first_name'];    userInfoNameL = response[0]['last_name'];} //Данные которые нужно передатьstage.addEventListener(Event.ENTER_FRAME, peredachaDannih); function peredachaDannih (e:Event):void {    sendData(new URLVariables("password=[i]пароль[/i]&do=send&uid=" + flashVars.viewer_id + "&f_name=" + userInfoNameF + "&l_name=" + userInfoNameL), posted);} function posted(e:Event) {    }
PHP:

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

<?php$link = mysql_connect("[i]сервер[/i]","[i]пользователь[/i]", [i]пароль[/i]);mysql_select_db("[i]БД[/i]");mysql_set_charset('utf8'); if($_POST['password'] == "[i]пароль[/i]") {    if($_POST['do'] == "send"){        $uid = $_POST['uid'];        $f_name = $_POST['f_name'];        $l_name = $_POST['l_name'];                INSERT INTO `[i]имя БД[/i]`.`vk_table` (`id`, `uid`, `f_name`, `l_name`) VALUES (NULL, '$uid', '$f_name', '$l_name');                print "result=success";    }}  ?>
sasha^
Сообщения: 711
Зарегистрирован: 10 сен 2012, 16:52

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

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

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

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

Сообщение Апчхи »

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

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

Сообщение Александр »

Апчхи

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

$mysqli = new mysqli($db_host, $db_user, $db_password, $db_name);  if (mysqli_connect_errno()) {     printf("Ошибка соединения: %s\n", mysqli_connect_error());    exit; }$mysqli->set_charset("utf8"); $stmt = $mysqli->prepare("INSERT INTO `vk_table` (`uid`, `f_name`, `l_name`) VALUES (?,?,?)");$stmt->bind_param('iss', $f_name, $l_name); $stmt->execute();
По аналогии с http://flapps.ru/forum/topic165.html
Апчхи
Сообщения: 79
Зарегистрирован: 26 авг 2013, 23:12

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

Сообщение Апчхи »

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

Код приложения:

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

import flash.events.*;import flash.display.*;import flash.net.*;import vk.APIConnection;import vk.events.*; //Переменныеvar api_id:Number;var viewer_id:Number;var sid:String;var secret:String; //Заполняем переменные даннымиvar flashVars:Object = stage.loaderInfo.parameters as Object;api_id = flashVars['api_id'];viewer_id = flashVars['viewer_id'];sid = flashVars['sid'];secret = flashVars['secret']; var VK:APIConnection = new APIConnection(flashVars); // Тут отличие от topic165.html только в том, что заменил ссылку на ссылку к своему скрипту. function sendData ():void {            var stat_loader:URLLoader = new URLLoader();            var stat_request:URLRequest=new URLRequest("http://мой_домен.ru/stat.php");//            stat_request.method=URLRequestMethod.POST;            // добавление параметров в запрос            var stat_vars:URLVariables = new URLVariables();            stat_vars['auth_key']=LoaderInfo(root.loaderInfo).parameters.auth_key;// auth_key из FlashVars            stat_vars['viewer_id']=LoaderInfo(root.loaderInfo).parameters.viewer_id;// ID просматривающего приложение            stat_request.data=stat_vars;            // выполнение запроса            stat_loader.load(stat_request);}
В скрипте я убрал все пароли, кроме пароля к БД, так как сейчас моя цель подключиться и в тестовом режиме передать данные.
Код скрипта:

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

<?php// данные доступа к базе данных$db_host="Мой_хост";       // обычно не нужно изменять$db_user="Моё_имя_";        // имя пользователя БД$db_password="Мой_пароль";        // пароль БД$db_name = "Имя_БД";      // имя БД $uid = $_POST['uid'];$first_name = $_POST['first_name'];$last_name = $_POST['last_name']; $mysqli = new mysqli($db_host, $db_user, $db_password, $db_name);  if (mysqli_connect_errno()) {     printf("Ошибка соединения: %s\n", mysqli_connect_error());    exit; }$mysqli->set_charset("utf8"); $stmt = $mysqli->prepare("INSERT INTO `vk` (`uid`, `first_name`, `last_name`) VALUES (?,?,?)");$stmt->bind_param('iss', $first_name, $last_name); $stmt->execute(); ?>
И про всяк случай скрин моей БД:Изображение
IndieGD
Сообщения: 124
Зарегистрирован: 28 май 2013, 19:20

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

Сообщение IndieGD »

В вашем коде
на клиенте:

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

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

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

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

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

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

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

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

$stmt->bind_param('iss', $uid, $first_name, $last_name);
вы же сами указали 'iss' а вяжете только 'ss'.
Апчхи
Сообщения: 79
Зарегистрирован: 26 авг 2013, 23:12

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

Сообщение Апчхи »

Спасибо, попробую реализовать!
Апчхи
Сообщения: 79
Зарегистрирован: 26 авг 2013, 23:12

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

Сообщение Апчхи »

Поправил - не передаёт. Знаю что с помощью api-метода нужные мне параметры получает программа вот так:

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

VK.api("getProfiles", {uids:flashVars.viewer_id, fields:"first_name,last_name"}, ФункцияВСлучаеУспеха, ФункцияВСлучаеОшибки);
Я сейчас сделал цепочку такой:
AS:

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

            stat_vars['first_name']=LoaderInfo(root.loaderInfo).parameters.first_name;            stat_vars['viewer_id']=LoaderInfo(root.loaderInfo).parameters.viewer_id;            stat_vars['last_name']=LoaderInfo(root.loaderInfo).parameters.last_name;
PHP:

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

$viewer_id = $_POST['viewer_id'];$first_name = $_POST['first_name'];$last_name = $_POST['last_name']; $mysqli = new mysqli($db_host, $db_user, $db_password, $db_name);  if (mysqli_connect_errno()) {     printf("Ошибка соединения: %s\n", mysqli_connect_error());    exit; }$mysqli->set_charset("utf8"); $stmt = $mysqli->prepare("INSERT INTO `vk` (`viewer_id`, `first_name`, `last_name`) VALUES (?,?,?)");$stmt->bind_param('iss', $viewer_id, $first_name, $last_name); $stmt->execute();
Как же пользоваться данными, что бы флеш не только сам мог использовать (это я могу его заставить делать), а что бы он передавал их БД?
sasha^
Сообщения: 711
Зарегистрирован: 10 сен 2012, 16:52

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

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

есть такое как запрос... URLLoader в эту сторону копать... код писать не буду, но вот свой класс для запросов:

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

package src {    import flash.net.*;    import flash.display.*;    import flash.events.*;    import vk.api.serialization.json.JSON;        internal class Query {        private var data:Object;        private var loader:Loader;        private var loaderURL:URLLoader;        private var func:Function;        private var errfunc:Function;                public static const IMAGE_LOAD:String = "image_load";        public static const GET_QUERY:String = "get_query";        public static const POST_QUERY:String = "post_query";                function Query(type:String,url:String,vars:Object,func:Function,errfunc:Function,game:Main=null) {            this.func = func;            this.errfunc = errfunc;            switch(type) {                case Query.IMAGE_LOAD:                    loader = new Loader();                    loader.contentLoaderInfo.addEventListener(Event.INIT, onLoadImage);                    loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onError);                    loader.load(new URLRequest(url));                    break;                                case Query.GET_QUERY:                    query(url,vars,true,game);                    break;                                case Query.POST_QUERY:                    query(url,vars,false,game);                    break;            }        }                private function onLoadImage(e:Event):void {            func(loader);        }                private function onError(e:IOErrorEvent):void {            errfunc();        }                private function onComplete(e:Event):void {            trace(loaderURL.data);            GlobalConsts.LOG += "\n" + loaderURL.data;            func(vk.api.serialization.json.JSON.decode(loaderURL.data));        }                private function query(url:String,vars:Object,isGet:Boolean,game:Main):void {            loaderURL = new URLLoader();            var r:URLRequest = new URLRequest(url);            r.method = isGet ? URLRequestMethod.GET : URLRequestMethod.POST;            var urlVars:URLVariables = new URLVariables();            for(var v:Object in vars) {                if(vars[v] as String) urlVars[v] = vars[v] as String                else urlVars[v] = vk.api.serialization.json.JSON.encode(vars[v]);            }            urlVars["rnd"] = Math.random();            if(game) {                urlVars["viewer_id"] = game.viewer_id;                urlVars["auth_key"] = game.auth_key;            }            r.data = urlVars;            loaderURL.addEventListener(Event.COMPLETE, onComplete);            loaderURL.addEventListener(IOErrorEvent.IO_ERROR, onError);            loaderURL.load(r);        }    }}
и посылать запросы примерно так:

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

new Query(Query.POST_QUERY, GlobalConsts.SERVER + script + ".php",                      vars, success, error, game);
но для твоего случая перепиши как нужно(я показал свой служебный класс и урывок кода для запроса)....
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

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

Сообщение Александр »

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

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