|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Aug 2015
Сообщений: 8
|
Проблема с подключением к php файлу. Ошибка #1009.
Собственно. Создал я, значит, кнопку переключения между глобальной и локальной таблицей рекордов. Радостно написал код подключения к внешнему пхп файлу. Запустил... И тут(О, нет!!!) flash на меня начинает материться:
"TypeError: Error #1009: Cannot access a property or method of a null object reference. at leaderboard_fla::changer_mc_2/completeHandler() at flash.events::EventDispatcher/dispatchEventFunction() at flash.events::EventDispatcher/dispatchEvent() at flash.net::URLLoader/onComplete()" После этого удара ниже пояса, я проверил свой код ещё 9000+ раз. Результата - ноль. Пожалуйста, подскажите, чём заключается моя ошибка и как её исправить? Непосредственно исходник(для пущей верности):1(DinosaurJump).7z. И, если вам интересно, код PHP файлика, с которым связывается данная программа*:
*Он отвечает правильно по всем статьям. Да и класс для работы с SQL отвечает верным массивом. (Проверено) . |
|
|||||
Регистрация: Aug 2015
Сообщений: 8
|
Цитата:
Цитата:
Цитата:
Чуть не забыл. Код В кнопке*: import flash.events.Event; import flash.display.MovieClip; import flash.events.MouseEvent; import flash.net.*; this.addEventListener(Event.ENTER_FRAME, ef); this.addEventListener(MouseEvent.CLICK, changeTables); var par:MovieClip = MovieClip(parent); var TableType:int = par.highscoreType; var loader:URLLoader = new URLLoader(); function ef(e:Event){ if (TableType != par.highscoreType){ par.highscoreType = TableType } this.gotoAndStop(TableType); if (par.currentFrameLabel != "frame_leaderboard"){ this.removeEventListener(Event.ENTER_FRAME, ef); this.removeEventListener(MouseEvent.CLICK, changeTables); } } function changeTables(e:MouseEvent){ if(TableType == 2){ TableType = 1; setTables(par.tRexObj.myLeaderboard); }else if(TableType == 1){ TableType = 2; getWorldHighscores(); setTables(par.tRexObj.myLeaderboard); }else{ trace("Incorrect TableType: \""+TableType+"\"."); } } function setTables(arr:Array){ par.TraceHighscores(arr); } //Функция, которая подключается к php function getWorldHighscores() { par.setMouseLoading(); var request:URLRequest=new URLRequest("http://newground.hol.es/dj/getScores.php"); request.method=URLRequestMethod.POST; loader.dataFormat=URLLoaderDataFormat.VARIABLES; loader.addEventListener(Event.COMPLETE, completeHandler); var variables:URLVariables = new URLVariables(); variables['count'] = 5; request.data=variables; loader.load(request); } //функция по окончанию загрузки. function completeHandler(evt:Event) { var RetArr:Array = new Array; par.unsetMouseLoading(); var hgihsc:String = evt.target.data.highscores; RetArr = hgihsc.split("||"); for (var i:int = 0; i<RetArr.length;i++){ RetArr[i] = RetArr[i].split("@@"); } setTables(RetArr); loader.removeEventListener(Event.COMPLETE, completeHandler); } _________________________________________________________________________________________________ *Кнопка, непосредственно - мувиклип, в разных кадрах которого расположены 2 кнопки(для графической составляющей.) И, по каким-то мистическим причинам, работает данная она только так. Иначе флеш начнёт гнуть 3-х этажные маты про ошибку #1009. Добавлено через 1 час 1 минуту Странно... Короче переделал я, значит код под ваш класс. Всё работает. Флеш получает первые 5 записей из бд. И Правильно их трейсит. Но далее случается такая белиберда: TypeError: Error #2007: Parameter text must be non-null. at flash.text::TextField/set text() at leaderboard_fla::MainTimeline/traceInTxtFields() at leaderboard_fla::MainTimeline/TraceHighscores() at leaderboard_fla::changer_mc_2/setTables() at leaderboard_fla::changer_mc_2/onComplete() at Function/http://adobe.com/AS3/2006/builtin::call() at classes::Packet/onComplete() at flash.events::EventDispatcher/dispatchEventFunction() at flash.events::EventDispatcher/dispatchEvent() at flash.net::URLLoader/onComplete() В общем теперь функции выглядят так: function getGlobalHighscores() { par.setMouseLoading(); var obj:Object = new Object; obj.count = 5; var packet:Packet = new Packet("someServerMethod", onComplete, "http://newground.hol.es/dj/", "getScores.php"); } function onComplete(netObj:Object){ par.unsetMouseLoading(); var RetArr:Array = new Array; var hgihsc:String = netObj.highscores; RetArr = hgihsc.split("||"); for (var i:int = 0; i<RetArr.length;i++){ RetArr[i] = RetArr[i].split("@@"); } //trace(String(RetArr)); setTables(RetArr); } Последний раз редактировалось Nokard; 04.08.2015 в 10:36. |
|
|||||
Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
|
с сервера у вас приходит строка:
highscores=Nokard||999999@@a||300000@@Electro||200000@@b||100000 далее нужно разбить ее на массив пар : получаем такой массив : ["Nokard||999999","a||300000","Electro||200000","b||100000"]; далее нужно сохранить данные в ОБЪЕКТ: var highScoreObj:Object = {}; var pairsArray:Array; for (var i:int = 0; i<RetArr .length;i++){ pairsArray = RetArr[i].split("||"); highScoreObj[pairsArray[0]] = pairsArray[1]; } там его парсим циклом for each но я не знаю зачем так заморачитьвася и придумывать свой костыльный формат данных, используйте JSON - для такого случая, тогда у вас строка(которую вы грузите с сервера) будет иметь вид: и тогда ваша функция будет выглядеть как-то так: в крайнем случае можно посмотреть в сторону XML. Последний раз редактировалось Isfet; 04.08.2015 в 13:14. |
|
|||||
Регистрация: Aug 2015
Сообщений: 8
|
Здесь надо сохранять не в объект, а в 2-х мерный массив. Данные функции работают с массивами. Их и сортировать легче, и через циклы проводить...
Цитата:
Нууу... Ошибка уже исправлена и без jsonа. Переписал код и всё пошло как по маслу. Если вкратце, то проблема была в функции, выводящей рекорды непосредственно в txt field-ы если вспомнить, то ей передавался массив, состоящий из 4-х элементов. А полей - то у меня - 5. Вот она и пыталась вывести undefined в текстовое поле. Решением оказалось добавление в тело функции этих строк: В общем спасибо всем, кто откликнулся на мою просьбу. И отдельно я хочу поблагодарить caseyryan. За предоставленный им класс. |
|
|||||
Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
|
вот в этой строке вы парсите неправильно , вы перемешиваете переменные, и когда то вы на эту ошибку наткнетесь, когда у вас данные не будут сходиться.
вы получаете вот такую строку с сервера и после этой записи массив будет выглядеть так и потом вы по этому массиву пробегаетесь Добавлено через 45 секунд я и не говорил что без джейсона не будет работать, не хотите делать правильно - ваше дело. |
|
|||||
Регистрация: Aug 2015
Сообщений: 8
|
Цитата:
__________________
Создать проект всегда готов, github для слабаков. |
|
|||||
Цитата:
Во флеше есть всего 2 метода для работы с JSON. JSON.stringify() и JSON.parse(); Первый принимает объект и превращает его в JSON строку. Второй наоборот, берет JSON строку и превращает в обычный флеш Object. Вот и все заморочки. В пыхе так же есть методы для создания и чтения JSON (json_encode()). Берем просто ассоциативный массив и передаем его в json_encode() получается примерно так:
Все легко и просто. Не надо никаких костылей |
Часовой пояс GMT +4, время: 01:04. |
|
« Предыдущая тема | Следующая тема » |
|
|