Последнее обновление:
July 15, 2017

Есть мысль... Жми, напиши!
Что имеем: Постов : 166 Авторов: 1 Категорий: 37

Взаимодействие FLASH и PHP

Здесь я постарался затронуть актуальную тему – как обращаться из flash к php и наиболее часто встречающиеся проблемы.
Создаем новый документ, в первом кадре жмем F9, там и будет размещен весь наш ActionScript.

Часть 1 защита, прием, передача данных.
Используем наиболее удобную функцию sendAndLoad(адрес обработчика, параметры, метод передачи GET/POST);
Передавать будем сам php код, скрипт будет обрабатывать и возвращать результат, поэтому нам надо придумать оптимальный вариант проверки, от flash этот код или хакер пытается подсунуть свой.
Задача: защитить передачу данных.
Решение:
Используем необратимое шифрование MD5
[cc lang=»actionscript»] sil=»1r5y8i999oy»; //строка, которую знают только Flash и php [/cc] Зашифровываем ее, зашифровываем код, который передаем, потом зашифровываем все вместе, и получаем ключ. Передаем его вместе с кодом php. Обработчик делает также и сверяет свой ключ с переданным, если совпадают, то ок, выполняем код, нет – хацкер пытается выполнить свой код.
В своих запасах нашел скрипт у которого функции аналогичные как и в php например MD5, не знаю кто автор, но респект ему. Файл со скриптом лежит с исходниками. Подключаем этот файлик : #include «md5.as» Вызываем функцию MD5 так:
[cc lang=»actionscript»] MD5.hex_md5 (“”);[/cc] Вернет шифровку.
[cc lang=»actionscript»] key=MD5.hex_md5(MD5.hex_md5(comand)+MD5.hex_md5(sil)); // Получили ключ.[/cc] Создадим два объекта, которые будут получать и принимать данные.
[cc lang=»actionscript»] var inp:LoadVars = new LoadVars();//этот объект будет получать данные
var out:LoadVars = new LoadVars();//а этот отправлять[/cc] Теперь, напишем функции отправки и приема данных:
[cc lang=»actionscript»] function sendcomand(comand){ //функция отправки серверу данных.
//Comand – php код
out.comand =comand; // равносильно записи http://test.ru/index.php?comand=php код
out.idd=MD5.hex_md5(MD5.hex_md5(comand)+MD5.hex_md5(sil)); // ключ для сравнения
out.sendAndLoad(“http://www.test.ru/index.php”,inp,»POST»);//отправляем серверу данные
//Запрос будет выглядеть так: http://www.test.ru/index.php?comand=команда&idd=шифр метод — POST
} // Благополучно отправили. Но теперь нам надо принять результат.
inp.onData = function(data){//момент получения ответа
trace(data); //водим полученное
}[/cc] Для примера вызовем функцию
[cc lang=»actionscript»] sendcomand(“$res=\”I working!\”; echo$res+123;”);[/cc] Часть 2 обработчик на php
С отправкой и приемом данных разобрались, теперь напишем их обработчик на php. В файле php пишем:
[cc lang=»php»][/cc] cntrl+enter во flash и смотрим в окне вывода что получилось. Можно считать труд оконченным, но возник неприятный сюрприз – невозможность передать/принять русскоязычный текст, вместо него кракозябры . Будем доводить до ума. Собака зарыта в том, что ActionScript пользуется Юникодом. Ну берем лопату, будем раскапывать.

Кодовая страница для кириллицы в Юникоде начинается с числа 848, это код нулевого символа. Русская заглавная буква А имеет в кодировке Windows код 192, поэтому в Юникоде она кодируется числом 1040. За буквой А идут подряд остальные заглавные буквы, затем маленькие от а до я, код буквы я равен 1103. Буквы ё и Ё кодируются отдельно. Их коды 1025 для Ё и 1105 для ё. Пример:
[cc lang=»actionscript»] trace(String.fromCharCode(1040,1041,1071,1072,1073,1103,1025,1105)); //В окне вывода увидим АБЯабяЁё.[/cc] Как будем действовать: обмен должен происходит последовательностями четырех значных числе. А как быть с теми, код которых меньше 1000, да просто дополнять их слева нулями! Т.к. данные пойдут в фульм одним потоком, нам надо определить где кончается код для одного символа, поэтому обязательно 4цифры в числе. А на другой стороне отсекать левые нули и переводить обратно в нормальные символы. Напишем на стороне Flash две функции одна для кодирования (чтоб передавать русский текст), другая для декодирования (принимать русский текст).
Некоторые полезные функции:

Строка.charAt(индекс); — в ActionScript выдает символ по индексу
Строка[Индекс] – в php
String.fromCharCode(индекс); — в ActionScript вернет символ по его 10 значному коду.
Chr(индекс); — в php
String.ord(символ); — в ActionScript выдает 10 код по значению символа
Ord(символ) – в php

Часть 3: Передача русского текста в php и обратно.
Во flash пишем:
[cc lang=»actionscript»] function uni_str(uni) { //декодирование принятого
var
i,res,l=Math.floor(uni.length/4);
//длина строки будет в 4 раза меньше, т.к. на кодировку каждого символа мы отвели 4 цифры
res=»; //результат
for (i=0; iord(‘Ё’)) ad=0; else ad=848; //если нерусский то ничего не прибовляем, если русский прибавляем 848
c=sprintf(String(o+ad)); //доводим до ума
if (c==ord(‘Ё’)+ad) c=1025; //если это ё или Ё пишем коды отдельно
else if(c==ord(‘ё’)+ad) c=1105;
res+=c;
}
return res; // вернули результат
}[/cc] Тееперь тоже самое надо написать на php:
[cc lang=»php»]function chr_uni($s) {
$l=strlen($s);
$res=»;
for ($i=0; $i< $l; $i++) { $o=ord($s[$i]); if ($osendcomand(«$rez=’проверка’; echo (chr_uni($rez));»);
Не забываем экранировать кавычки.
Ух, на этом вродебы все, проблем больше возникнуть не должно, еще одна полезная штука: xml=new XML(data); напишите это в теле функции према данных, и можете парсить что вернул обработчик как нормальный xml.
Писалось под as2, легко можно переделать под as3.
Исходник:flashandphp.zip

[ratings]

Views :

5698

Сохранение BitmapData в jpg на сервере.

Сохранение состоит из двух частей:
1 часть. Флэш отправляет уже закодированную в jpg картинку побайтово через bytearray
[cc lang=»ActionScript3″] function saver():void {
createName = ‘mypict.jpg’; //—имя картинки при сохранении
outputpath=’images/’; //—папка, в которую будут сохранятся картинки
var bmd:BitmapData=new BitmapData(ширина,высота); //—создаем bitmapdata
bmd.draw(интересующий нас мувик); //—рисуем в битмапе интересующий мувиклип
var byteArray : ByteArray = new JPGEncoder(85).encode(bmd); //—в массив кодированное изображение? 85 — качество.
var urlRequest : URLRequest = new URLRequest();
urlRequest.url = ‘saver.php?path=’+outputpath; //—php скрипт, который будет сохранять
urlRequest.contentType = ‘multipart/form-data; boundary=’ + UploadPostHelper.getBoundary();
urlRequest.method = URLRequestMethod.POST;
urlRequest.data = UploadPostHelper.getPostData(createName, byteArray);
urlRequest.requestHeaders.push( new URLRequestHeader( ‘Cache-Control’, ‘no-cache’ ) );
var urlLoader : URLLoader = new URLLoader();
urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
urlLoader.addEventListener( Event.COMPLETE, onImageCreated); //—функция обработчик события создания фотки
urlLoader.addEventListener( ProgressEvent.PROGRESS, onImgCreateProgress); //—функция обработчик процесса загрузки фотки
urlLoader.load(urlRequest);
}
function onImgCreateProgress(e:ProgressEvent):void {
trace(‘загружено: ‘, String(Math.round(e.bytesLoaded*100/e.bytesTotal)));
}
function onImageCreated(e:Event):void {
trace(‘изображение создано’);
}[/cc] 2 часть. Теперь к php скрипту saver.php — он сохраняет картинку на сервере.
[cc lang=»php»]< ?PHP
$target_path = $_REQUEST[ ‘path’ ];
$target_path = $target_path . basename( $_FILES[ ‘Filedata’ ][ ‘name’ ] );
if ( move_uploaded_file( $_FILES[ ‘Filedata’ ][ ‘tmp_name’ ], $target_path ) ) {
echo «Файл » . basename( $_FILES[ ‘Filedata’ ][ ‘name’ ] ) . » был загружен;»;
}
else {
echo «Возникли ошибки при сохранении»;
}
//—будем вести небольшой лог
$res=»———————————————————————- \n»
.»Datetime: «.date(«d.m.y H:i»).» \n»
.»target path: «. $target_path .» \n»
.»tmp name: «.$_FILES[«Filedata»][«tmp_name»].» \n»
.»name: «.$_FILES[«Filedata»][«name»].» \n»
.»size: «.$_FILES[«Filedata»][«size»].» \n»
.»type: «.$_FILES[«Filedata»][«type»].» \n»
.»error: «.$_FILES[«Filedata»][«error»].» \n»
.»———————————————————————- \n \n»;
$fp = fopen(«uplog.txt»,»a»);
fwrite($fp, $res);
fclose($fp);
?>[/cc] Необходимые импорты:
[cc lang=»ActionScript3″] import flash.utils.getQualifiedClassName;
import com.adobe.images.JPGEncoder;
import flash.net.URLRequest;
import flash.net.URLRequestMethod;
import flash.net.navigateToURL;
import flash.net.URLVariables;
import flash.net.URLRequestHeader
import flash.net.URLLoader; [/cc] Впринципе все. as3 9 плеер.

Небольшое дополнение: для сохранения в PNG вместо [cc lang=»ActionScript3″]var byteArray : ByteArray = new JPGEncoder(85).encode(bmd);[/cc]

необходимо прописать [cc lang=»ActionScript3″]var byteArray : ByteArray = new PNGEncoder().encode(bmd);[/cc]

и подключить библиотеку  http://code.google.com/p/as3corelib/

[ratings]
Views :

8405

get и set методы, или вычисление значения переменной через функцию

Приведу реальный пример:
Через переменную будем получать из базы расчетную стоимость и через нее же отправлять обратно.
Так сказать делаем обработчик на чтение переменной и на запись.

class myprice{
  function get price():Number { 
    var p:Number;
    //**потом напишу пост о работе с базой mysql**//
    return p;
  }
  function set price(newp:number) { 
    //**потом напишу пост о работе с базой mysql**//
    trace('новое значение', newp);
  }
}
//**пример использования: myprice.price = 1250;
/**trace(myprice.price);
[ratings]
Views :

2343

Средневековая служба поддержки

[ratings] http://video.bigmir.net/show/5663/
сталкиваюсь с таким постоянно ппц)

Views :

889

Установка каретки в определенное положение в TMemo и в других контролах.

[ratings]
Procedure setline(memo:TMemo;Linepos,charpos:integer);
Begin
with memo do
begin
selstart:=perform(EM_LineIndex,LinePos,charpos)+charpos;
perform(EM_ScrollCaret,0,0);
SetFocus;
end;
end;
Views :

2064

человеко понятный url (чпу), пример: http://mysite/статьи/чпу

[ratings] Наверняка хотелось видеть ссылки вида http://mysite.ru/стать/чпу вместо http://mysite.ru/stati.php?stat=44
Создаем текстовый файл .htaccess, кладем в корень, в нем пишем строки:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) /navig.php?path=$0 [L,QSA]

navig.php — будет обрабатывать url
в нем пишем:

$qs=$_GET["path"];
$cs=mb_convert_encoding($qs, 'HTML-ENTITIES', 'UTF-8'); //--для нормальной работы с кирилицей, иногда не надо.
echo $cs;
?>

а можно еще так: http://mysite/статьи/чпу?lang=rus
и: $_GET["lang"];
впринципе все. удачи.

Views :

1062

Переносы строки и Json

[ratings] Столкнулся с такой проблемой, есть текст с переносом строки внутри
Привет
Как дела?

Когда пытаюсь передать её через Ajax под видом JSON получается следующее
{custom:»Привет
Как дела?»}

Работающий перенос строки останавливает работу скрипта. Надо было убрать перенос для js, но что бы он одновременно работал в форме куда этот текст и вставлялся

$value = preg_replace(‘#[\n\r]+#’, «\\n», $value);
Теперь все стало работать так как текст выглядит так
{custom:»Привет\nКак дела?»}

Views :

6553

Варианты формата даты mysql

%a Короткое название недели (Вск..Пнд)
%b Короткое название месяца (Феб..Мaр)
%c Месяц числом (0..12)
%D суфикс для ангийских чисел(0th, 1st, 2nd, 3rd, …)
%d День с ведущим нулём (00..31)
%e День (0..31)
%f Микросекунды (000000..999999)
%H Час с ведущим нулём, начало от нуля (00..23)
%h Час с ведущим нулём (01..12)
%I Час с ведущим нулём (01..12)
%i Минуты с ведущим нулём (00..59)
%j День в году (001..366)
%k Час, отсчет от нуля (0..23)
%l Час (1..12)
%M Month name (January..December)
%m Номер месяца с ведущем нулём (00..12)
%p AM or PM
%r Время, 12 часовой формат (hh:mm:ss и AM or PM)
%S Секунды (00..59)
%s Секунды (00..59)
%T Время, 24 часовой формат (hh:mm:ss)
%U Неделя (00..53), первый день недели Воскресенье
%u Неделя (00..53), первый день недели Понедельник
%V Номер недели в году (01..53), где неделя начинается с Воскресенья; используется с %X
%v Номер недели в году (01..53), где неделя начинается с Понедельника; используется с %x
%W Название недели (Sunday..Saturday)
%w Номер недели (0=Воскресенье..6=Суббота)
%X Год, 4 числа, где нелеля начинается с Воскресенья; использовать с %V
%x Год, 4 числа, где нелеля начинается с Понедельника; использовать с %v
%Y Год 4 числа
%y Год, 2 числа
%% Знак процент
Пример использования: SELECT date_format(‘2009-05-13’, ‘%W, %e %M %Y’)
Выведет:  Wednesday 13 may 2009
set lc_time_names=’ru_RU’; — а если добавить перед запросом это, то:
Выведет: Среда 13 май 2009

Views :

765

REGEXP в MySQL

SELECT * FROM prices where tkey REGEXP ‘^toy’;
Вернет все записи где текст в колонке tkey начинается с букв “toy”.
SELECT * FROM prices where tkey  REGEXP ‘[[:digit:]]’;
Вернет все записи где  в колонке tkey только цифры.
^ — означает начало слова
$ — конец
. — Соответствие любому символу (включая перевод строки).
a* — Соответствие любой последовательности из нуля или более символов «a».
a+ — Соответствие любой последовательности из одного или более символов «a».
a? — Соответствие как нулю, так и одному символу «a».
de|abc — Соответствие как последовательности de, так и последовательности abc.
(abc)* — Соответствие нулю или более вхождениям последовательности abc.
[а-ЯЁё] — в слове могут быть буквы только Русского алфавита.
[а-ЯЁёa-Z] — русскаго и англикого

Пример использования:
SELECT * FROM users WHERE email REGEXP «^[a-z]+@+(mail)+\.+[a-z]{2,3}$»
Вернет все записи из таблицы users где email пользователя находится на сервере mail (например pupkin@mail.ru)
Разберем по порядку:
[a-z]+ — говорит что начинаться строка должна только с букв английского алфавита, далее
@+ — говорит о том что должен быть знак собаки, далее
(mail)+ — говорит о том, что далее после сабаки должно идти слово mail, далее
\.+ — говорит о том что дальше должна идти точка («\» — знак экранирования, т.е. необходимо ставить перед «.» и «\» — если хотите включить их в диапазон значений), далее
[a-z]{2,3} — говорит о том что после точки может быть от двух до трех символов из букв английского алфавита

Views :

2118

Длина текста в поле mysql

[ratings] SELECT word FROM tgameworld where length(word) = 25
В этом запросе будут показывать строки где длина не первышает 25 символов.

Views :

1148