Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   URLLoader загрузка переменных (http://www.flasher.ru/forum/showthread.php?t=126610)

firsoff 23.06.2009 16:58

URLLoader загрузка переменных
 
Вложений: 1
пытаюсь из формы передать POST запрос и получить от скрипта ответ. наталкиваюсь на ошибку:
--------------------------------------------------------------------
Error: Error #2101: Строка, переданная в URLVariables.decode(), должна быть строкой запроса закодированного URL-адреса и содержать пары имя/значение.
at Error$/throwError()
at flash.net::URLVariables/decode()
at flash.net::URLVariables()
at flash.net::URLLoader/onComplete()
---------------------------------------------------------------------
Код:
Код AS3:

_request = new URLRequest('http://mysite.com/test.php');
_request.method = URLRequestMethod.POST;
 
_variables = new URLVariables();
_variables.test = '1';
_request.data = _variables
 
_urlLoader = new URLLoader();
_urlLoader.dataFormat = URLLoaderDataFormat.VARIABLES;
 
_urlLoader.addEventListener(Event.COMPLETE, onComplete);
_urlLoader.load(_request);

Пример классический, из кукбука по AS3.
в test.php:
PHP код:

<?php
echo '1'
?>

т.е. просто заглушка.

Опытным путем замечено если убрать URLLoaderDataFormat.VARIABLES; то все работает без ошибок. в чем подвох, во вложении - архив с проектом ( FlashDevelop )

willis83 23.06.2009 17:14

возможно пара имя\значение имеется ввиду не просто единица а например var=1

firsoff 23.06.2009 18:04

_variables.test = '1';
это и есть пара - имя/значение

willis83 23.06.2009 18:17

я про php

mre 23.06.2009 18:18

URLLoaderDataFormat.VARIABLES - это формат ответа, а не запроса.

AlexDesinger 24.06.2009 03:26

PHP код:

<?php 
$test 
$_POST['test'];
echo 
'test='$test;
?>

примерно так...могу ошибаться, надо тестить.
Я тоже сейчас маюсь с этой поблемой, не хочу плодить тем, надеюсь мне тут ответит кто-нибудь, скажите, если в php файле написаны не только имя=значение, а еще код, который выполняется на сервере, то flash не сможет распознать в этом коде переменные, которые я ему вывожу с помощью echo?
Дело в том, что если в php присутствуют строки - приема переменной и вывод ее, то flash без проблем все это грузит, а если написать хоть чего еще, то все - ошибка, которая написана вверху поста. Подскажите как лучше поступить?

mre 24.06.2009 12:33

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

AlexDesinger 24.06.2009 14:13

Цитата:

Писать можно что угодно, для флеша имеет значение только результат работы скрипта.
вы имете ввиду echo параметр=значение?
mre, подскажи плиз алгоритм, я уже третий день пытаюсь вникнуть =(((

dimarik 24.06.2009 14:50

Цитата:

Сообщение от AlexDesinger (Сообщение 830373)
вы имете ввиду echo параметр=значение?
mre, подскажи плиз алгоритм, я уже третий день пытаюсь вникнуть =(((

На выхлопе php-скрипта должно быть key=value&key2=value&key3=value и никак иначе. Почитайте раздел Structure.

AlexDesinger 24.06.2009 15:18

Цитата:

На выхлопе php-скрипта
вот только б понять где у него выхлоп и как его организовать. =)

mre 24.06.2009 15:25

"Выхлоп" - это все, что выводят print и echo.
Соответственно, при URLLoaderDataFormat.VARIABLES этот "выхлоп" должен содержать пары имя/значение.

AlexDesinger 24.06.2009 15:53

я вот так пытаюсь загрузить переменные
Код AS3:

public static function LoadData(Path:String,ID:Number) {
                        var filePath:String=my_Path+"/pict/"+"pict"+my_ID+".jpg";
                        var variables:URLVariables=new URLVariables("filePath="+filePath);
 
                        DataRequest=new URLRequest("dataloader.php");
                        DataRequest.method=URLRequestMethod.POST;
                        DataRequest.data=variables;
 
                        DataLoader=new URLLoader();
                        DataLoader.dataFormat=URLLoaderDataFormat.VARIABLES;
 
                        DataLoader.addEventListener(ProgressEvent.PROGRESS,DataPROGRESS);
                        DataLoader.addEventListener(Event.COMPLETE,DataCOMLETE);
                        DataLoader.addEventListener(IOErrorEvent.IO_ERROR,DataERROR);
 
                        DataLoader.load(DataRequest);
                }
                private static function DataPROGRESS(e:ProgressEvent):void {
                        var tempLoader:URLLoader=URLLoader(e.target);
                        MainClass.my_PhotoItem.ttt.text="DATALOADER_PROGRESS";
                }
                private static function DataCOMLETE(e:Event):void {
                        var tempLoader:URLLoader=URLLoader(e.target);
                        var myVars:URLVariables=new URLVariables(tempLoader.data);
                        my_Title=myVars.tttitle;
                        MainClass.my_PhotoItem.ttt.text=my_Title;
                }
                private static function DataERROR(e:IOErrorEvent):void {
                        var tempLoader:URLLoader=URLLoader(e.target);
                        MainClass.my_PhotoItem.ttt.text="ERROR";
                }

PHP код:

<?php
$file 
$_POST['filePath'];
if(
file_exists($file)){
 
$exif=exif_read_data($file);
 
$title=$exif['COMPUTED']['UserComment'];

 echo 
'tttitle='$title;

} else {
 
header("HTTP/1.0 404 Not Found")
}
?>

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

mre 24.06.2009 16:16

Грамотность кода AS3 оставляет желать лучшего. Приватные статические методы - это жесть.
По теме. Скорей всего, скрипт не доходит до строчки с echo - либо там ошибка, либо идет по else.
По окончании загрузки протрейсите ответ и все станет ясно.

AlexDesinger 24.06.2009 16:20

Цитата:

По окончании загрузки протрейсите ответ и все станет ясно.
Как же я могу протрейсить ответ, когда php исполняется только на сервере, а смотрю я в браузере?

mre 24.06.2009 16:47

"Протрейсить" можно не только функцией trace, а, например, вывести в какое-нибудь текстовое поле.

dimarik 24.06.2009 16:50

Цитата:

Сообщение от AlexDesinger (Сообщение 830415)
Как же я могу протрейсить ответ, когда php исполняется только на сервере, а смотрю я в браузере?

В браузер должно приходить tttitle=какой_то_тайтл

etc 24.06.2009 18:50

mre, ну не жесть, если применяются осознано и по делу.

mre 24.06.2009 19:04

__etc, а можно примерчик такой ситуации?
Просто ни разу не было такой необходимости.

AlexDesinger 24.06.2009 19:15

mre, я пытаюсь написать класс который имеет статические функции, чтобы не создавать экземпляры этого класса, а просто вызывать эти функции в любой части программы для обработки данных. А уж как там криво или нет получается не знаю - потому что опыта в as3 мало.

Вообще если брать мой пример - ошибка скорее всего в php в этих строках
PHP код:

$exif exif_read_data($file);
$title=$exif["COMPUTED"]["UserComment"]; 

поскольку без них, flash что то пытается загрузить, но как только в php сценарии они встречаются,php не отвечает а flash застывает на этапе загрузки.
Видимо не судьба, поскольку я не знаю php написать на нем верный код для flash не получиться, подскажите, если кто знает а лучше дайте ссылочку на пример подсчета php сценарием количества файлов в папке и последующей загрузке этих данных во flash =)

etc 25.06.2009 09:54

Цитата:

Сообщение от mre (Сообщение 830473)
__etc, а можно примерчик такой ситуации?
Просто ни разу не было такой необходимости.

Да хотя бы банальная приватная функция какого-нибудь replace-а в String utils.

AlexDesinger 25.06.2009 15:32

ок разобрался - сделал сценарий подсчета файлов.
У меня только вопрос
Вот смотрите, я вызываю класс, в который передаю данные для подсчета файлов внужной дирректории, и тут же прикрепляю к этому классу слушатель кастомного события. Далее класс, получивший данные о директории, начинает загрузку файла php, так как в php прописан сценарий, он начинает свою работу как только файл был запрошен с сервера,так? php файл начинает подсчет файлов и выводит его в echo, flash, услышав php немедленно загружает данные в виде переменной имя=значение, после загрузки переменных flash рапортует наверх в виде кастомного события о том что php ответил на запрос.
Тк вот мой нубский вопрос - в классе, который вызывает загрузку php слушатель прикреплен к событию загрузки и функция вызывается при полной загрузке php файла, но php же должен еще и успеть посчитать файлы, значит событие о загрузке происходит раньше чем php что то сделает - будет ли flash ждать исполнения сценария от php или же теоретически может отрапортовать наверх о загрузке файла php не дождавшись исполнения сценария php?

mre 25.06.2009 15:39

Все будет ok ;)

dimarik 25.06.2009 15:42

Цитата:

Сообщение от AlexDesinger (Сообщение 830660)
функция вызывается при полной загрузке php файла, но php же должен еще и успеть посчитать файлы, значит событие о загрузке происходит раньше чем php что то сделает -

значит событие о загрузке происходит когда php отработает и пришлет выхлоп.

Цитата:

будет ли flash ждать исполнения сценария от php или же теоретически может отрапортовать наверх о загрузке файла php не дождавшись исполнения сценария php?
Не будет. Это асинхронное событие. Это значит, что после запроса на загрузку файла FP не останавливается и не ждет окончания загрузки, а занимается исполнением другого кода. После загрузки задиспатчится событие Event.COMPLETE, для этого вам и нужно его слушать. Пока оно не наступит, flash не будет ничего рапортовать наверх.

AlexDesinger 25.06.2009 15:49

Цитата:

Не будет. Это асинхронное событие. Это значит, что после запроса на загрузку файла FP не останавливается и не ждет окончания загрузки, а занимается исполнением другого кода
Да сори, немного недоговорил, дело в том, что в моем коде - естественно, flash начинает дальше что то делать как только всплывет событие - он его и ждет, просто мой вопрос был в следующем - оно всплывет как только загрузится php или как только загрузятся переменные, обработанные php, ну раз, вы говорите, что php не загрузится, до тех пор пока не исполнится сценарий и не будет выхлопа, тогда я спокоен....=)

dimarik 25.06.2009 16:09

trace(php загрузится == php сделает выхлоп) // true
Т.е. это одно и то же.

operun 30.03.2011 09:38

У меня получилось так:
Отсюда, из последнего примера взял код AS3
http://help.adobe.com/ru_RU/ActionSc...0204-7cfd.html
Код AS3:

var variables:URLVariables = new URLVariables("name=Franklin");
var request:URLRequest = new URLRequest();
request.url = "http://10.10.10.10/1.php";
request.method = URLRequestMethod.POST;
request.data = variables;
var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.VARIABLES;
loader.addEventListener(Event.COMPLETE, completeHandler);
try{
        loader.load(request);
        }
        catch(error:Error){
                trace("Unable to load URL");
                }
function completeHandler(event:Event):void{
        trace(event.target.data.welcomeMessage);
        }

А серверная часть выполнена на PHP (файл 1.php):
PHP код:

<?php
$t
=$_POST['name'];
echo 
"welcomeMessage=".$t;
?>

В трэйсе выведет 'Franklin'

AndreyD 28.03.2013 11:28

у меня такая же ошибка выдавалась из-за строчки в PHP:
PHP код:

echo "welcomeMessage" 

Флеш плеер хочет пару имя/значение:
PHP код:

echo "welcomeMessage=ok" 



Часовой пояс GMT +4, время: 16:02.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.