Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   Класс для соединения PHP сервера (http://www.flasher.ru/forum/showthread.php?t=210286)

60reg 20.02.2015 19:20

Класс для соединения PHP сервера
 
Добрый вечер..
Пытаюсь написать класс для соединения PHP сервера, но ничего не выходит, даже в голову не лезет
Вот к примеру класс Server.as, как вызвать функцию из php файла method.php??
структура php примерно такая
PHP код:

<?php

 
function getContent() {
        echo 
"TEST...";
    }
?>


Tails 20.02.2015 20:06

Купите книжку по программированию.

caseyryan 21.02.2015 08:38

К примеру вот это на сервере, в файле call.php (он дальше указан в классе as3):

PHP код:

$method $_POST['method']; // получаем название переданного метода

if ($method == "getSomeData") {
    echo 
"reply=someData"



А так выглядит класс в as3, который получает данные с сервера
Код AS3:

package  {
        import flash.events.Event;
        import flash.events.IOErrorEvent;
        import flash.events.SecurityErrorEvent;
        import flash.net.URLLoader;
        import flash.net.URLLoaderDataFormat;
        import flash.net.URLRequest;
        import flash.net.URLRequestMethod;
        import flash.net.URLVariables;
 
        public class Packet {
 
                public static const HOST:                String                = "http://server.com/";
                public static const SCRIPT:                String                = "call.php";
 
                private var _callback:                Function        = null;
 
                /**
                *
                * @param        называние метода, который нужно вызывать на сервере, передается в
                * POST с ключом method
                * @param        callback метод который вызывается после прихода ответа от сервера
                * должен принимать один параметр типа Object
                */

                public function Packet(method:String, callback:Function, params:Object = null) {
                        _callback                                = callback;
                        var loader:        URLLoader        = new URLLoader();
                        loader.addEventListener(Event.COMPLETE, onComplete);
                        loader.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
                        loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
                        loader.dataFormat                = URLLoaderDataFormat.VARIABLES;
                        var vars:URLVariables        = new URLVariables();
                        vars['method']                        = method;
                        if (params != null) {
                                for (var i:String in params) {
                                        vars[i] = params[i];
                                }
                        }
                        var rand:        String                = "?" + int(Math.random() * 10000);
                        var request:URLRequest        = new URLRequest(Packet.HOST + Packet.SCRIPT + rand);
                        request.method                        = URLRequestMethod.POST;
                        request.data                        = vars;
                        trace(request.data.toString());
                        try {
                                loader.load(request);
                        } catch (e:Error) {
                                trace(e.getStackTrace());
                        }
 
                }
 
                private function onSecurityError(e:SecurityErrorEvent):void {
                        e.target.removeEventListener(Event.COMPLETE, onComplete);
                        e.target.removeEventListener(IOErrorEvent.IO_ERROR, onIOError);
                        e.target.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
                }
 
                private function onIOError(e:IOErrorEvent):void {
                        e.target.removeEventListener(Event.COMPLETE, onComplete);
                        e.target.removeEventListener(IOErrorEvent.IO_ERROR, onIOError);
                        e.target.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
                        trace("INPUT / OUTPUT ERROR");
                }
 
                private function onComplete(e:Event):void {
                        e.target.removeEventListener(Event.COMPLETE, onComplete);
                        e.target.removeEventListener(IOErrorEvent.IO_ERROR, onIOError);
                        e.target.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
                        var data:Object = e.target.data as Object;
                        trace("PACKET DATA:", this, unescape(String(data)));
                        if (_callback != null) {
                                _callback.call(null, data);
                        }
                }
        }
}

Используется так:
Код AS3:

var packet:Packet = new Packet("getSomeData", onReply); // передаем название метода, который нужно вызвать, и обработчик ответа
 
function onReply(params:Object):void {
    trace(params.reply);
}

Собственно, можно примерно так. Естественно это упрощенный вариант, без каких-либо намеков на безопасность

60reg 21.02.2015 19:44

Цитата:

Сообщение от Tails (Сообщение 1179208)
Купите книжку по программированию.

Умник......

fish_r 21.02.2015 23:33

Цитата:

Сообщение от 60reg (Сообщение 1179205)
Вот к примеру класс Server.as, как вызвать функцию из php файла method.php??

Постановка вопроса как минимум странная. Это вам не js, чтобы функции вызывать. Схема работы выглядит примерно так:
- вы посылаете некий запрос на сервер,
- скрипт php расположеный по адресу запроса получает его и уже дальше решает как и кем ( каким именно классом/скриптом ) он будет обработан...

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

alexandrratush 21.02.2015 23:52

60reg, если вы хотите вызывать методы php на стороне клиента, то в этом вам может помочь amfphp

60reg 24.02.2015 13:29

а почему с этим кодом в php не работает???

PHP код:

function getContent() {
        echo 
"TEST...";
    } 


caseyryan 24.02.2015 13:36

А почему это должно работать? Чтобы метод сработал, нужно его вызвать.

60reg 24.02.2015 17:09

так у меня это и было написано в первом посте....
Как её вызвать?
Вот в чем у меня проблема

caseyryan 24.02.2015 18:03

А я пост для кого писал?
Создавая тему на форуме, неплохо бы на ответы внимание обращать
Или вот этот пост для кого?
все ответы уже даны в теме

fish_r 25.02.2015 01:26

Цитата:

Сообщение от 60reg (Сообщение 1179328)
а почему с этим кодом в php не работает???

PHP код:

function getContent() {
        echo 
"TEST...";
    } 


потому что есть ее описание, но нет вызова

PHP код:

<?php

function getContent() {
        echo 
"TEST...";
    }

getContent(); // вот он

?>


60reg 25.02.2015 19:09

Спасибо... с этим разобрался.
но.....
в классе Main не выводит onReply в трейсе, число из php в формате XML, только в классе Packet вот здесь
Код AS1/AS2:

trace("PACKET DATA:", this, unescape(String(data)));

,

вот так

Код:

<?xml version='1.0' encoding='utf-8'?>

<response>

    <user>

        <diamond>500</diamond>

    </user>

</response>


caseyryan 25.02.2015 20:02

Потому что он не ждет в качестве ответа XML. Он ждет URL переменные в формате свойство=значение.
Чтобы получать текст (в том числе и XML), нужно тип данных загрузчика поменять на TEXT
Да и вообще, формат XML избыточен. В данном случае намного лучше будет использовать JSON

60reg 25.02.2015 21:47

вот как указано у меня в классе Main
Код AS3:

 var packet:Packet = new Packet("getContent", onReply); // передаем название метода, который нужно вызвать, и обработчик ответа
        function onReply(params:Object):void {
                // trace(params.reply);
                                diamond.text=String(xml.user.diamond);
 
 
          }

в текстовом поле не выводит все пусто.

caseyryan 26.02.2015 11:30

http://static.diary.ru/userdir/0/0/6...7/67280270.gif
перечитайте мой пост внимательнее
п.с. и вообще, откуда взялся вот этот xml.user.diamond?
я не вижу в коде где это объявляется

60reg 26.02.2015 16:43

можешь пожалуйста помочь с кодом...
Уже несколько дней мучаюсь.

caseyryan 26.02.2015 19:02

Я привел полностью рабочий пример. Это выдернуто из готового проекта для соцсетей. Только аутентификация убрана. Если сделать все так же, то 100% будет работать.

60reg 26.02.2015 19:55

Спасибо всем за помощь, но у меня нихера не выходит. Во флеше пусто.

caseyryan 26.02.2015 21:34

Здесь не форум телепатов. Если что-то не выходит надо выкладывать весь свой проблемный код, и рассказывать все детали:
1) работает ли вообще сервер
2) если да, отдает ли он ответы через браузер, если нет, см. пункт 1
3) какой код на сервере
4) к какому адресу делается запрос

Либо воспользоваться советом из поста №2

60reg 26.02.2015 23:00

Вот.... выкладываю все на чем тестирую:

universall.php

PHP код:

<?php 

$method 
$_POST['method'];

getContent();

function 
getContent() { 
        echo 
'<?xml version="1.0" encoding="utf-8"?>

<response>

    <user>

        <diamond>500</diamond>

    </user>

</response>'

    } 


?>

вот класс Packet.as

Код AS3:

package  {
        import flash.events.Event;
        import flash.events.IOErrorEvent;
        import flash.events.SecurityErrorEvent;
        import flash.net.URLLoader;
        import flash.net.URLLoaderDataFormat;
        import flash.net.URLRequest;
        import flash.net.URLRequestMethod;
        import flash.net.URLVariables;
 
        public class Packet {
 
                public static const HOST:                String                = "http://server/server/";
                public static const SCRIPT:                String                = "universal.php";
 
                private var _callback:                Function        = null;
 
                public function Packet(method:String, callback:Function, params:Object = null) {
                        _callback                                = callback;
                        var loader:        URLLoader        = new URLLoader();
                        loader.addEventListener(Event.COMPLETE, onComplete);
                        loader.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
                        loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
                        loader.dataFormat                = URLLoaderDataFormat.VARIABLES;
                        var vars:URLVariables        = new URLVariables();
                        vars['method']                        = method;
                        if (params != null) {
                                for (var i:String in params) {
                                        vars[i] = params[i];
                                }
                        }
                        var rand:        String                = "?" + method;
                        var request:URLRequest        = new URLRequest(Packet.HOST + Packet.SCRIPT + rand);
                        request.method                        = URLRequestMethod.POST;
                        request.data                        = vars;
                        trace(request.data.toString());
                        try {
                                loader.load(request);
                        } catch (e:Error) {
                                trace(e.getStackTrace());
                        }
 
                }
 
                private function onSecurityError(e:SecurityErrorEvent):void {
                        e.target.removeEventListener(Event.COMPLETE, onComplete);
                        e.target.removeEventListener(IOErrorEvent.IO_ERROR, onIOError);
                        e.target.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
                }
 
                private function onIOError(e:IOErrorEvent):void {
                        e.target.removeEventListener(Event.COMPLETE, onComplete);
                        e.target.removeEventListener(IOErrorEvent.IO_ERROR, onIOError);
                        e.target.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
                        trace("INPUT / OUTPUT ERROR");
                }
 
                private function onComplete(e:Event):void {
                        e.target.removeEventListener(Event.COMPLETE, onComplete);
                        e.target.removeEventListener(IOErrorEvent.IO_ERROR, onIOError);
                        e.target.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
                        var data:Object = e.target.data as Object;
                        trace("PACKET DATA:", this, unescape(String(data)));
                        if (_callback != null) {
                                _callback.call(null, data);
                        }
                }
        }
}

вот класс Main.as

Код AS3:

package {
        import flash.net.*;
        import flash.display.*;
        import flash.events.Event;
        import flash.events.MouseEvent;
 
 
                public class Main extends Sprite {
 
                var xml:XML = new XML();
 
                public function Main():void {
 
var packet:Packet = new Packet("getContent", onReply);
function onReply(params:Object):void {
  // trace(params.reply);
  var xml:XML = new XML(loader.data);
            diamond.text = String(xml.user.diamond);
 
}
 
 
                        }
                }
 
}

Работаю на локальном сервере, работает отлично.

caseyryan 26.02.2015 23:27

Понятно.
Во-первых он не ждет ответа в виде XML, он ждет только URL переменные. строку в формате
someProperty=someValue&someOtherProperty=someOtherValue;
И никак иначе. Потому что в ас3 указано
Код AS3:

loader.dataFormat                = URLLoaderDataFormat.VARIABLES;

Во-вторых, переданная строка с ас3 совсем не значит, что метод с таким названием будет вызван. Эту строку еще надо применить. Самый простой способ так:

PHP код:

<?php 

$method 
$_POST['method'];

if (
$method == "getContent") {
    
getContent();
}

function 
getContent() { 
        echo 
"diamonds=30";
?>

а на клиенте получить так:
Код AS3:

function onReply(params:Object):void {
  trace(params.diamonds);
 
}

В общем, советую действительно почитать книжки и разобраться с основами, чтобы все стало понятно. Пытаться разобраться на практике не зная теории - это долгий путь.

60reg 26.02.2015 23:36

А какую книгу Вы посоветуете прочитать про это...???

fish_r 28.02.2015 13:16

чтобы разобраться с вебобменом и пыхой, я бы посоветовал "PHP5 в подлиннике" Дмитрий Котеров, Алексей Костарев. Отличный учебник, обзор среды, и в дальнейшем хороший справочник.

60reg 01.03.2015 17:27

Не подскажете что за ошибка,

Код:

ReferenceError: Error #1069: Property diamonds not found on String and there is no default value.
        at MethodInfo-7()
        at Function/http://adobe.com/AS3/2006/builtin::call()
        at Packet/onComplete()
        at flash.events::EventDispatcher/dispatchEventFunction()
        at flash.events::EventDispatcher/dispatchEvent()
        at flash.net::URLLoader/onComplete()

погуглил но результата не дало...

alexandrratush 01.03.2015 20:02

Цитата:

Property diamonds not found on String and there is no default value
Здесь все написано.

caseyryan 01.03.2015 21:15

Скорее всего туда приходит ошибка
Советую оттрейсить params и посмотреть что там

60reg 03.03.2015 00:41

Вложений: 1
Сколько дней мучаюсь и никак.... Пожалуйста помогите мне с этой проблемой напишите правильно классы Packet.as, Main.as и call.php, чтобы call.php выводил из формата xml во флеш число.
Вложение 31458
Буду очень благодарен.

caseyryan 03.03.2015 07:18

Вложений: 1
Не удивительно, что не работает.
Что вот это за хрень добавлена в класс Packet?
Код AS3:

var data:XML = XML(e.target.data);

Таким образом url данные в XML не превратятся, а работать с теми, что должны быть, естественно не будет.

В архиве полностью рабочая, протестированная версия


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

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