PDA

Просмотр полной версии : помогите с LoadVars


2Borik
07.09.2007, 12:04
Пытаюсь реализовать следующую флешку.
При нажатии кнопки передаются данные в php скрипт->скрипт создаёт файл с расширением txt->Flash читает данные из файла->и после того как данные считаны посылает ещё один запрос в php на удаление этого файла.
Есть вот такой кусок кода, который отвечает за загрузку и удаление файла.
varDel = new LoadVars();
loader = new LoadVars();
function callback() {
loader.load(nemFile);
loader.onLoad = function(success:Boolean):Void {
if (!success && n<10) {
n += 1;
myL = "Идёт загрузка";
} else if (n>=9) {
myL = "Сбой в загрузке";
varDel.sendAndLoad("delet.php", varDel, "POST");
clearInterval(intervalID);
} else {
myL = "Данные загружены";
fp1 = this.PerFirst;
fp2 = this.PerSecond;
varDel.sendAndLoad("delet.php", varDel, "POST");
clearInterval(intervalID);
}
};
}

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

Psycho Tiger
07.09.2007, 13:13
Переменная n не определена, ты прибавляеш 1, и на локальном компе у тя обращение могло пойти в ячейку памяти там где 0, а когда смотрел в браузере твое n стало равно NaN. И вообще, зачем тебе n?
Мммм.... Ыц, тока что сообразил.
У тебя стоит денвер для локальной машине? У самого такая проблемка была.
Собсна, у денвера стоит по умолчанию register_variables = on (или off, не шарю в пхп.ини)
Суть в том, что ты проверяеш переменную varDel в пыхпыхе, а не _POST["varDel"]
Если я ошибаюсь, вставь везде где идет обращение к файлу для сервера что то вроде етого delet.php?unticachingnumber=this.date()+this.seconds()+random(999999999) и тп и тд...
Вполне возможно, он у тебя просто прокэшировался.
На всякий случай, выложи исходник серва.

iNils
07.09.2007, 13:16
Добавить к имени файла случайное значение при каждой загрузке: "delet.php?" + new Date ().getTime ()

2Borik
07.09.2007, 19:31
Вот полный код кадра

varSender = new LoadVars();
nemFile = "test_"+inputLogin+".txt";
sendButton_mc.onRelease = function() {
clearInterval(intervalID);
varSender.par1 = controlFirst_mc.val;
varSender.par2 = controlSecond_mc.val;
varSender.nameL = inputLogin;
varSender.sendAndLoad("send_create.php", varSender, "POST");
intervalID = setInterval(callback, 800);
loader = new LoadVars();
n = 0;
};
varDel = new LoadVars();
function callback() {
loader.load(nemFile);
loader.onLoad = function(success:Boolean):Void {
if (!success && n<10) {
n += 1;
myL = "Идёт загрузка";
} else if (n>=9) {
myL = "Сбой в загрузке";
varDel.nameL = inputLogin;
varDel.sendAndLoad("delet_file.php", varDel, "POST");
clearInterval(intervalID);
} else {
myL = "Данные загружены";
fp1 = this.PerFirst;
fp2 = this.PerSecond;
varDel.nameL = inputLogin;
varDel.sendAndLoad("delet_file.php", varDel, "POST");
clearInterval(intervalID);
}
};
}
var intervalID;

И ещё маленько о том как я тестировал локально, когда всё работало.
Просто создал файл test_1.txt в него записал
&PerFirst=20&PerSecond=40&
нажал кнопку sendButton_mc данные загрузились, открыл файл txt изменил значения сохранил файл, нажал кнопку значения изменились, переименовал файл нажал кнопку значение не изменились.
php скрип простой
<?php
$login = $_POST["nameL"];
$par_N1 = $_POST["par1"];
$par_N2 = $_POST["par2"];
$filename = "test_".$login.".txt";
$somecontent = "&PerFirst=".$par_N1."&PerSecond=".$par_N2."&";
$filepointer = fopen($filename, "w-");
fwrite ($filepointer, $somecontent);
fclose($filepointer);
?>
это send_create.php
и
<?php
$login = $_POST["nameL"];
$filename = "test_".$login.".txt";
unlink($filename);
?>
это delet_file.php
вот..

Molecula
07.09.2007, 23:37
Что-то сама конструкция меня пугает:
varSender = new LoadVars();
nemFile = "test_"+inputLogin+".txt";
sendButton_mc.onRelease = function() {
clearInterval(intervalID);
varSender.par1 = controlFirst_mc.val;
varSender.par2 = controlSecond_mc.val;
varSender.nameL = inputLogin;
varSender.sendAndLoad("send_create.php", varSender, "POST");
intervalID = setInterval(callback, 800);
loader = new LoadVars();
n = 0;
};
varDel = new LoadVars();
function callback() {
loader.load(nemFile);
loader.onLoad = function(success:Boolean):Void {
if (!success && n<10) {
n += 1;
myL = "Идёт загрузка";
} else if (n>=9) {
myL = "Сбой в загрузке";
varDel.nameL = inputLogin;
varDel.sendAndLoad("delet_file.php", varDel, "POST");
clearInterval(intervalID);
} else {
myL = "Данные загружены";
fp1 = this.PerFirst;
fp2 = this.PerSecond;
varDel.nameL = inputLogin;
varDel.sendAndLoad("delet_file.php", varDel, "POST");
clearInterval(intervalID);
}
};
}
var intervalID;
Если не получилось загрузить файл, то делаем то-то и то-то...странно.

if (!success && n<10) {
n += 1;
myL = "Идёт загрузка";
}
А этот else к чему?:

else {
myL = "Данные загружены";
fp1 = this.PerFirst;
fp2 = this.PerSecond;
varDel.nameL = inputLogin;
varDel.sendAndLoad("delet_file.php", varDel, "POST");
clearInterval(intervalID);
}

Мож так надо:

varSender = new LoadVars();
varDel = new LoadVars();
//----------------------------------
nemFile = "test_"+inputLogin+".txt";
sendButton_mc.onRelease = function() {
clearInterval(intervalID);
varSender.par1 = controlFirst_mc.val;
varSender.par2 = controlSecond_mc.val;
varSender.nameL = inputLogin;
varSender.sendAndLoad("send_create.php", varSender, "POST");
intervalID = setInterval(callback, 800);
loader = new LoadVars();
n = 0;
};
function callback() {
loader.load(nemFile);
loader.onLoad = function(success:Boolean):Void {
if (success) {
myL = "Данные загружены";
fp1 = this.PerFirst;
fp2 = this.PerSecond;
varDel.nameL = inputLogin;
varDel.sendAndLoad("delet_file.php", varDel, "POST");
clearInterval(intervalID);
}
else {
myL = "Сбой в загрузке";
varDel.nameL = inputLogin;
varDel.sendAndLoad("delet_file.php", varDel, "POST");
clearInterval(intervalID);
}
};
}
var intervalID;
//---------------------------------------------------

varDel.sendAndLoad("delet_file.php", varDel, "POST");

Обычно ресиверу отправляют,..но если не так, то где
varDel.onLoad=MyFunction;

Kikasso
07.09.2007, 23:52
Я что-то не понял, а какой смысл в этой комбинации? На фига этот файл, если можно просто отдать флешу нужную информацию.
Кроме того, а вдруг я окно закрою раньше чем файл качну, ничего тогда не удалится. И есть еще сессии в php, которые как раз и создают временные файлы для каждого юзера.
Да, еще создавать файл с именем, которое пришло непоняно откуда - небезопасно. Надо сперва убедиться, что это не системная комманда.

2Borik
08.09.2007, 04:18
for Molecula
вторая else нужна для того что бы как только данные будут загружены сразу удалять файл с сервера. Хотя да что-то я тут на мудрил :с) (от слова муд..ила)
for Kikasso
я понимаю что создавать файл глуповато, но опыта мало в создании связки php -> flash. Имя файла не просто создаётся, а в начале проверяется в базе есть ли такой юзер и только потом создается.
А вообще смысл всей затеи такой:
Юзер заходит на страницу, с авторизацией вводит свои логин пасворд, если авторизация прошла успешно пользователю предлагается по изменять кое каки параметры. Изменив параметры он нажимает кнопку отправить. Параметры уходят на сервер php скрипту он их подхватывает и передает далее программке запущенной на сервере, эта программка обрабатывает данные и создает файл и записывает туда результат обработки. Вот. вроде так объяснил, подскажите может тогда как это лучше организовать, если я делаю, что-то не так.

Kikasso
08.09.2007, 04:49
...непонял... что за программка такая.. А слабо ей в базу данные положить? Или вместо того, чтобы писать в файл, просто отдать инфу?
Как вы эту программку вызываете, кстати, этот, как его, popen()?

Ну или просто пускай php сделает readfile а следующей строчкой файл можно удалять, он уже прочитан. Вроде бы.

2Borik
08.09.2007, 05:33
можно и в базу положить, и можно было xml-ку генерить, и можно просто через php эхо ответ получать. Просто показалось что через файл отработать данную технологию будет быстрее, проще и наглядней.
Я до этого пробывал делать просто:
каждый кадр = функция (){
загрузить файл
}
и всё типо работало но читать всё время файл это криво и захотелось мне чего то нового и правильного

Kikasso
08.09.2007, 05:58
Через эхо по-моему правильнее всего. Вы можете отправить LoadVars и получить в ответ XML:
var myXml:XML;
lv.onData = function (src){
myXml = new XML( unescape(src) );
}
Можно на серваке сделать следующее: пускай прога запишет файл и передаст пыхпыху его адрес, readfile и unlink.
Или получить от проги файловый дескриптор, и прочитать его.
Читать файл каждый кадр - это нечто..

Molecula
08.09.2007, 06:27
Читать файл каждый кадр - это нечто..
Хотя где в Адобовском Хелпе был пример, где оговаривалось, что в кажом кадре будет прописана одна и та же функция :) для корректной работы примера.

2Borik
08.09.2007, 09:14
т.е. Если я вас правильно понял контроль за состоянием файла правильнее всего отдать серверной части (php файлу)?
Ну а всетаки почему не работал мой код,идей нет???

вот пример того, что я делаю логин любой, пароль не надо
17667
Заметил странную закономерность в ней кажется и проблемма.
запускаю флешку на сервере отправляю данные в php создаётся файл с определённым именем например test_1.txt, нажимаю в браузере кнопку обновить отправляю данные в php но уже тепер меняю передаваемые серверу данные. Таким образом создаётся файл test_2.txt с новыми значениями и флешь загружает и обновляет данные. Тыкаю ещё раз обновить в браузере отправляю параметры серверу другие но со значением для создания файла test_1.txt и о чудо флешь выводит мне самые первые значения переменных. Таким образом прихожу к выводу что эти значение переменных были где то про кешированы. Отсюда возникает резонный вопрос можно ли как нибудь их от туда удалить или преписать?

Kikasso
08.09.2007, 19:15
Если так уж приспичило файл временный создавать, попробуйте что-то вроде этого:
php_path = 'file.php';

to_lv = new LoadVars();
to_lv.usr = 'login';
to_lv.passw = 'password';
to_lv.flag = 'auth';

from_lv = new LoadVars();
from_lv.onLoad = readResponce;

file_lv = new LoadVars();
file_lv.onLoad = sendDeleteRequest;

to_lv.sendAndLoad(php_path, from_lv);

function readResponce(ok){
if( this.flag == 'readfile' ) file_lv.load( this.fileToLoad );
else if(this.flag == 'file_deleted' ) displayMesage('ok, deleted');
}

function sendDeleteRequest(ok){
displayMesage('file loaded..\ndelete request started..');
to_lv.flag = 'del';
to_lv.sendAndLoad( php_path, from_lv );
}

function displayMessage(mess){
trace(mess);
}
ничего не проверял, голый принцип:
1) php авторизует, по флагу определяет что надо создать файл, создает файл и отдает flag=readfile&fileToLoad=путь к нему.
2) флеш по флагу определяет что надо читать файл, читает и по завершению процесса шлет flag=del
3) php авторизует, по флагу определяет что надо убить файл, убивает и отправляет flag == 'file_deleted'
4) флеш смотрит на флаг и собственно все.
----------------------------------------
Собственно, громозко и неудобно - 3 обращения на сервер и 2 авторизации вместо того, чтобы все сделать за 1 проход.

2Borik
08.09.2007, 19:37
Собственно проблема не в том, что я не могу передать данные и их обработать с последующим удалением, а загвоздка с тем что при повторном запуске функции, загруженные данные не обновляются т.е. в файл то они записываётся а вот во флешь грузиться не хотят.
При использовании onLoad событие наступает при загрузке данных и по этому как я понимаю когда я хочу повторно запустить функцию данные то уже загружены и по этому у меня ни чего не обновляется

Psycho Tiger
09.09.2007, 16:03
Я же писал - это кеширование.
Метод борьбы: указывать на все внешние файлы (ВСЕ, которые мы не хотим кешировать) дополнительный параметр - я всегда указываю ucn - uncaching number, сливаю его из текущей даты+рандома, эдак за милион (чтобы вернее.)
Пример файла, который прокешируется:
"O_o.php"

Пример файла, который не прокешируется:
"O_o.php?ucn="+random(9999999999999999)

Подчеркиваю, мы НЕ меняем имя файла, а лишь адрес обращения к нему из флэша.