Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   PHP (http://www.flasher.ru/forum/forumdisplay.php?f=20)
-   -   Flash->PHP->MySQL->PHP->Flash (http://www.flasher.ru/forum/showthread.php?t=58736)

MapcuaHuH 27.05.2004 23:15

Flash->PHP->MySQL->PHP->Flash
 
Вычитал в хелпе по Flash организацию обмена данными с базой данных через XML-запросы/ответы с помощью языка сценариев. Выбрал связку Apache+PHP+MySQL. НО! Не могу в PHP скрипте интерпертировать входной пакет от Flash. Посылаю из Flash как
Код:

LoginXML.sendAndLoad("http://.../test.php", ReplyXML);
методом POST. Вроде должна прийти строка вида
Код:

<LOGIN username="fio" password="pass" />
. На самом деле на вход PHP скрипта приходит массив, содержащий строку
Код:

&amp;quot;testfield&amp;quot; password=&amp;quot;asd&amp;quot; username=&amp;quot;das&amp;quot; /&gt;
(вывел функцией
Код:

foreach($_POST as $var) {
echo $var;
}

). И ничем его разобрать не могу. XML парсер (James Clark's expat) не помог - ничего не возвращает. DOM XML ничего не дал (специально установил PHP 5.0). Начал разбараться с XML-RPC - может это его вотчина, разбирать входящие пакеты.
Ещё пробовал не выпендриваться и пользовать LoadVars и метод GET - всё работает, всё понятно. Но, люди!, если же можно делать обмен данными через XML и это уже делается где-то, то я тоже так хочу. И вроде в книгах это есть, но до книг доступа нет и покупать их не хочу и не буду. В общем, посоветуйте, что делать: не выпендриваться или всё-таки реализовать XML-сервер и если реализовать, то как? У меня всё почти есть, кроме несчастной обработки входящего XML на стороне PHP скрипта.

MapcuaHuH 28.05.2004 00:35

НАГНАЛ!

метод GET тоже не работает. В браузере ввожу строку с параметрами - скрипт обрабатывает и выдаёт запрос, а из Flash параметры не читает (?!). Переменная $_GET пустая.

Не понял я ничего. Ещё ответы возвращает в кодах вместо символов - там, %20 вместо пробела и пр.

И XML-RPC выдал, что я ему неправильно отформатированный XML сую.

kompadre 28.05.2004 22:17

http://www.php.net/urldecode пробывал?

MapcuaHuH 28.05.2004 23:05

Аллилуйя, братья!

НАШЁЛ!

http://www.tupps.com/flash/faq/xml.html

Оказалось, надо изменить тип на "text/xml":
Код:

loginXML.contentType = "text/xml";
вместо "application/x-www-form-urlencoded". И тогда в PHP можно выловить строку из $HTTP_RAW_POST_DATA.

Всё! Приступаю к работе.

Спасибо за внимание.

MapcuaHuH 30.05.2004 00:48

я потом ещё долго не мог понять, почему обратно ответ не доходит (PHP -> Flash). Оказалось, параметры тегов надо в кавычки обязательно брать:
print "<TAG attr1='val1' attr2='val2'>"; а не:
print "<TAG attr1=val1 attr2=val2>".
Хотя это было для меня неочевидно.

Вот и всё.

MapcuaHuH 30.05.2004 10:19

Опять застрял, на этот раз с передачей переменной из одного сценария в другой. В одном запускаю session_start(); глобализую мою переменную $id путём session_register("id");... а при вызове другого сценария массив $_SESSION оказывается пуст. :( сверял session_id() в обоих сценариях - одинаковые. В первом сценарии после глобализации специально проверил, что переменная записалась в $_SESSION. PHP настроен (localhost) на сохранение в /tmp, даже установил register_globals = On.

В чём тут дело?

kompadre 31.05.2004 11:03

Убедись что в session.save_path в php.ini абсолютный путь к существующей папке.

session_start надо делать во всех скриптах где планируется пользоваться сессиями.

MapcuaHuH 31.05.2004 23:21

Точно, kompadre, именно путь я и не прописал, как надо. Исправил на абсолютный, убедился, что в той папке создаются файлы. И session_start() выполняю в каждом сценарии.
Но, хоть и массив $_SESSION перестал быть пустым, и там я вижу зарегистрированную переменную, но её значение пусто.
Опять непонятно. Может есть разница, когда определяется переменная, до session_register() или после?

MapcuaHuH 31.05.2004 23:53

Сам себе же и отвечаю, но всё равно есть чем поделиться.

В результате множества экспериментов остановился на таком единственном рабочем у меня решении:
(программа роется в базе, а потом пишет в неё)
Код:

// script1:
//
$arr = mysql_fetch_array($result, MYSQL_ASSOC);
$id = $arr["id"];
...
session_start();
session_register("id");
$_SESSION['id'] = $id;

Код:

// script2:
//
session_start();
$id = $_SESSION['id'];

Вот так я извлекаю мой "$id". Выглядит по уродски. Неужели так и должно быть? Во всех документациях по сессиям всё просто.

Nirva 01.06.2004 01:39

$arr = mysql_fetch_array($result, MYSQL_ASSOC);
$id = $arr["id"];

думаем про list(), если не думал. может захочешь.

session_register("id");
$_SESSION['id'] = $id;
вспоминаем реджистр глобалз в позиции офф и понимаем, что второй строчки достаточно.

MapcuaHuH 01.06.2004 08:06

Nirva, первая часть непринципиальна, а вот вторая...
Цитата:

вспоминаем реджистр глобалз в позиции офф и понимаем, что второй строчки достаточно.
что значит "вспоминаем в позиции офф"?
register_globals = Off (по умолчанию) в php.ini и у меня так же.
Но я убирал "лишнюю" строку и сразу же $_SESSION опустевал (?!).
Я проверю ещё раз. Как я понял, без register_globals нужно использовать только массив $_SESSION.

kompadre 01.06.2004 19:52

Обычно start_session() ставят на второй линии скрипта - так ты точно знаеш что сессия начата (продолженна) как только открыл скрипт в редакторе.

Далее если у тебя реджистр глобалз так и офф (очень гут) тебя касаеться следующее примичание в из документации по пхп (см. описание функции register_session) :

=========================
Caution:
If you want your script to work regardless of register_globals, you need to instead use the $_SESSION array as $_SESSION entries are automatically registered. If your script uses session_register(), it will not work in environments where the PHP directive register_globals is disabled.
=========================

Что-бы исправить ситуацию просто напросто сотри вызов вышеуказанной функции и далее пользуйся исключительно суперглобальными переменной $_SESSION как для сохранения так и для "выковыривания" значений из сесии.

Nirva 01.06.2004 21:21

э.. именно это я и хотел сказать. =)

2kompadre: ....суперглобальной..... =))))))))

kompadre 02.06.2004 00:10

супербупер

kompadre 02.06.2004 00:12

=)

MapcuaHuH 03.06.2004 20:20

Всем (громко сказано, kompadre и Nirva, ;)) спасибо за помощь. Итак, резюме. Для организации обмена Flash-приложения с СУБД MySQ посредством XML-сообщений (перечисляю камни, о которые споткнулся, в порядке их появления) необходимо:

- В сценарий, приведённый в справке FlashMX2004, добавить
Код:

LoginXML.sendAndLoad("http:/.../some_script.php", ReplyXML);
Тогда сообщение в виде текста можно извлечь из $HTTP_RAW_POST_DATA

- Если пользоваться (как я) DOM XML функциями PHP 4, то настроить PHP добавлением следующих строк в php.ini
Код:

extension=php_domxml.dll
extension=php_xslt.dll

и скопировать библиотеки
  • expat.dll
  • iconv.dll
  • sablot.dll
из php\dlls\ в папку %windir%\system\ или другую, указанную в %path%. Работа DOM XML различается в PHP 4 и PHP 5 (так было у меня). Во всяком случае то, что описано в руководстве по PHP 4 DOM XML работает для PHP 4.

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

- указать (в php.ini) абсолютный путь сохранения файлов сессий (только для Windows, в Linux есть абсолютный путь по умолчанию "/tmp"), например:
Код:

session.save_path = c:\temp\
и не использовать глобализацию переменных (php.ini):
Код:

register_globals = Off
- При использовании сессий включать во все сценарии строку
Код:

session_start()
и помещать и извлекать переменные в $_SESSION.

- Пользоваться общедоступными руководствами по программированию на PHP, XML и Flash:

kompadre 03.06.2004 21:03

О! Во как надо обьяснять! =)

Nirva 04.06.2004 03:03

вдохновительно. вот бы все так делали =)

MapcuaHuH 04.06.2004 17:51

Тьфу, ты! Опечатка!
Не ту строку сценария написал. Надо не LoginXML.sendAndLoad("http:/.../some_script.php", ReplyXML); (это есть в справке), а:
Код:

loginXML.contentType = "text/xml";
Иначе сообщение от Flash передаётся в формате "application/x-www-form-urlencoded" и, чтобы его распознать потребуется читать http://www.php.net/urldecode. У меня заработало, как я описал выше, поэтому разбираться не стал.
kompadre, Nirva, очень приятно =)


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

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