Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > Flex

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 14.07.2009, 14:58
CblP вне форума Посмотреть профиль Отправить личное сообщение для CblP Посетить домашнюю страницу CblP Найти все сообщения от CblP
  № 1  
Ответить с цитированием
CblP

Регистрация: Aug 2008
Сообщений: 69
Отправить сообщение для CblP с помощью ICQ
Question ByteArray(AMF) -> php -> MySQL(BLOB) и обратно

1. Запись в БД (тут все ок)

Есть обьект polygones (это полигон гуглмапа) пишу его в ByteArray потом сжимаю

Код AS3:
var bytes:ByteArray = new ByteArray();
bytes.writeObject({polygones: ukr.polygones[1]});
bytes.position = 0;
bytes.compress();
потом отправляю на пхп файлик
Код AS3:
// объект класса с помощью которого мы пердадим файл и данные на пхп файл
var url_request:URLRequest = new URLRequest();
 
// указываем адресс куда будут  передаватся данные
url_request.url = "http://localhost/gmap_upload/index.php";
 
// устанавливаем метод отправки POST
url_request.method = URLRequestMethod.POST;
 
url_request.data = new URLVariables();
url_request.data.polygon = bytes;
navigateToURL(url_request);
в пхп файлике основная строчка:
PHP код:
$query "INSERT INTO `coordinates`( `id_country` , `polygon` ) VALUES ('1', HEX(" '"' .  $_POST['polygon']  . '")' .  ");"
в БД поле polygon - тип BLOB, записываю её кодируя методом ПХП HEX()

вроди как все норм записывает.

2. Чтение с БД (тут проблемы)

В пхп выборка так идет так:

PHP код:
$query "SELECT `id_country` , UNHEX(`polygon`) as polygon  FROM `coordinates` WHERE `id_coordinate` = 6;"
применяю пхпшный метод UNHEX(), и печатаю на страницу в кодировке base64 - это для того что бы потом из base64 перегнать в ByteArray.

PHP код:
echo base64_encode($row['polygon']); 
Потом Флексом читаю это строку, с помощью HTTPService

Код AS3:
o_https = new HTTPService();
o_https.method = "POST";
o_https.url = "http://localhost/gmap_upload/getpolygon.php";
o_https.useProxy = false;
o_https.resultFormat = "object";
 
// ивенты на удачу и неудачу
o_https.addEventListener(ResultEvent.RESULT, resultPhp);
o_https.addEventListener(FaultEvent.FAULT, faultPhp);
это метод на ивент когда страницу прочитали, раскодирую строку с Base64 и пихаю в ByteArray, тут все ок,
Код AS3:
private function resultPhp(event:Event):void
{
	//var s_xml:String = o_https.lastResult.toString();
	var base64Dec:Base64Decoder;
 
	var byteArr:ByteArray;
 
        base64Dec = new Base64Decoder();
        base64Dec.decode(o_https.lastResult.toString());
 
        byteArr = base64Dec.toByteArray();
 
	m_function(byteArr);
 
}
но когда потом делаю этому ByteArray uncompress(); - то ругается на

Error: Error #2058: Ошибка при распаковке данных.
at flash.utils::ByteArray/_uncompress()
at flash.utils::ByteArray/uncompress()
at map/xxx()[C:\Documents and Settings\Serj\My Documents\Flex Builder 3\map\src\map.mxml:80]

Т.е. я так понимаю я как-то не правильно получил эти данные...
Может предложите другой способ чтения BLOB из MySQL в Флекс - ByteArray

Старый 14.07.2009, 15:49
DeliMIter вне форума Посмотреть профиль Отправить личное сообщение для DeliMIter Найти все сообщения от DeliMIter
  № 2  
Ответить с цитированием
DeliMIter
некрофил
 
Аватар для DeliMIter

Регистрация: Mar 2002
Адрес: ...по колено в кровище...
Сообщений: 2,292
Я могу ошибаться, но по-моему объект типа байт-массив не стоит передавать через переменные (пусть даже и) POST-запроса. Урлэнкодинг и всякая хрень, в ПХП может придти совсем не то же самое, что было в исходном байт-массиве.

Я пересылаю бинарные данные, напрямую присваивая ссылку на байт-массив свойству URLRequest.data, а в ПХП читаю присланное так:
PHP код:
$binary file_get_contents('php://input'); 
Т.е. ошибка может возникать не на этапе чтения из БД, а как раз на этапе записи в неё.
__________________
...убивать людей не удовольствия ради, но для еды.

Старый 14.07.2009, 16:23
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 3  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
URLLoaderDataFormat.BINARY
никаких URLVariables.
__________________
Hell is the possibility of sanity

Старый 14.07.2009, 18:18
CblP вне форума Посмотреть профиль Отправить личное сообщение для CblP Посетить домашнюю страницу CblP Найти все сообщения от CblP
  № 4  
Ответить с цитированием
CblP

Регистрация: Aug 2008
Сообщений: 69
Отправить сообщение для CblP с помощью ICQ
Спасибо за ответы, но хочу уточнить.
DeliMIter, немного не понял, что даешь на вход этой функции file_get_contents, я почитал там должен быть или урл на файл или путь к локальному.

wvxvw это при чтении? с записью все ок?

Старый 15.07.2009, 01:54
DeliMIter вне форума Посмотреть профиль Отправить личное сообщение для DeliMIter Найти все сообщения от DeliMIter
  № 5  
Ответить с цитированием
DeliMIter
некрофил
 
Аватар для DeliMIter

Регистрация: Mar 2002
Адрес: ...по колено в кровище...
Сообщений: 2,292
А надо было ещё и прочитать, что такое php://input. Первая ссылка в гугле же:

http://us2.php.net/manual/en/wrappers.php.php
__________________
...убивать людей не удовольствия ради, но для еды.

Старый 15.07.2009, 16:31
CblP вне форума Посмотреть профиль Отправить личное сообщение для CblP Посетить домашнюю страницу CblP Найти все сообщения от CblP
  № 6  
Ответить с цитированием
CblP

Регистрация: Aug 2008
Сообщений: 69
Отправить сообщение для CblP с помощью ICQ
Спасибо, за подсказки, переписал код, проверил размер отправляемого байт массива и получаемого - размеры совпали.

Но тут другая тема.
когда заганяю полигон в ByteArray.
Код AS3:
var bytes:ByteArray = new ByteArray();
bytes.writeObject(polygones);
bytes.position = 0;
а потом пытаюсь его прочитать,
Код AS3:
var myObject:Polygon = bytes.readObject();
то компилятор ругается,

TypeError: Error #1034: Ошибка типа Coercion: невозможно преобразовать Object@137c6151 в com.google.maps.overlays.Polygon.
at map/onReady()[C:\Documents and Settings\Serj\My Documents\Flex Builder 3\map\src\map.mxml:62]

Добавлено через 46 минут
значит погуглил я и нашел вот такое http://richapps.de/?p=34 читать с камментами
суть в том, что после преобразований с бинарным массивом теряется вся информация про класс, доктор выписал пилюлю в виде registerClassAlias("de.benz.something", Test);
но и это не спасает т.к. в случае когда в контструкторе класса есть входящие переменные, то получаем еррор аля "ArgumentError: Error #1063: Несоответствие количества аргументов в com.google.maps.overlays::Polygon(). Ожидалось 1, получено 0."


Последний раз редактировалось CblP; 15.07.2009 в 17:19.
Создать новую тему Ответ Часовой пояс GMT +4, время: 10:24.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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