Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

KaaL

[Resolvido] Fomulário Flash > PHP (MySQL) > Flash

Recommended Posts

Boas :rolleyes:

 

Estou tentando montar um registro em Flash que envia os dados ao PHP e este retorna ao Flash com uma mensagem dependendo do resultado identificado pelo PHP, no entanto, ele não está enviando os dados ao PHP, pelo menos eu acho que não, pois não há cadastro em meu database.. :o Seguem meus codes:

 

stop();

var loginMsg:String;

var passMsg:String;

var passMsg2:String;

var mailMsg:String;

 

function hideTexts() {

login_txt.text = "";

pass_txt.text = "";

pass2_txt.text = "";

mail_txt.text = "";

}

 

function hideLegends() {

login_r._visible = false;

login_w._visible = false;

pass_r._visible = false;

pass_w._visible = false;

pass2_r._visible = false;

pass2_w._visible = false;

mail_r._visible = false;

mail_w._visible = false;

login_e.text = "";

pass_e.text = "";

pass2_e.text = "";

mail_e.text = "";

}

 

function init() {

// Set Tab ordering

login_txt.tabIndex = 1;

pass_txt.tabIndex = 2;

pass2_txt.tabIndex = 3;

mail_txt.tabIndex = 4;

// Trigger the errors

error1 = 1;

error2 = 1;

error3 = 1;

error4 = 1;

formSuccess = 1;

}

 

function checkForm() {

hideLegends();

loginSpace = login_txt.text.lastIndexOf(" ");

passSpace = pass_txt.text.lastIndexOf(" ");

pass2Space = pass2_txt.text.lastIndexOf(" ");

mailSpace = mail_txt.text.lastIndexOf(" ");

if (login_txt.text == "") {

error1 = 1;

loginMsg = "Preencha o Login";

login_w._visible = true;

} else if (loginSpace>=0) {

error1 = 1;

loginMsg = "Sem espaços";

login_w._visible = true;

} else if (login_txt.length<4) {

error1 = 1;

loginMsg = "Mínimo de 4 caracteres";

login_w._visible = true;

} else {

error1 = 0;

loginMsg = "";

login_r._visible = true;

}

if (pass_txt.text == "") {

error2 = 1;

passMsg = "Preencha a Senha";

pass_w._visible = true;

} else if (passSpace>=0) {

error2 = 1;

passMsg = "Sem espaços";

pass_w._visible = true;

} else {

error2 = 0;

passMsg = "";

pass_r._visible = true;

}

if (pass2_txt.text == "") {

error3 = 1;

passMsg2 = "Preencha a repetição";

pass2_w._visible = true;

} else if (pass2Space>=0) {

error3 = 1;

passMsg2 = "Sem espaços";

pass2_w._visible = true;

} else if (pass2_txt.text != pass_txt.text) {

error3 = 1;

passMsg2 = "Senhas diferentes";

pass2_w._visible = true;

} else {

error3 = 0;

passMsg2 = "";

pass2_r._visible = true;

}

whereAT = mail_txt.text.lastIndexOf("@");

whereDOT = mail_txt.text.lastIndexOf(".");

if (mail_txt.text == "" || mail_txt.text == "Preencha o E-mail") {

error4 = 1;

mailMsg = "Preencha o E-mail";

mail_w._visible = true;

} else if (mailSpace>=0) {

error4 = 1;

mailMsg = "Sem espaços";

mail_w._visible = true;

} else if (whereAT>=whereDOT || whereAT<=0 || whereDOT<=0) {

error4 = 1;

mailMsg = "E-mail Inválido";

mail_w._visible = true;

} else {

error4 = 0;

mailMsg = "";

mail_r._visible = true;

}

 

if (error1 == 0 && error2 == 0 && error3 == 0 && error4 == 0) {

formSuccess = 0;

}

}

 

function checkAccount() {

if (formSuccess == 0) {

var getXML:XML = new XML();

getXML.load("register/register.php");

getXML.onLoad = function(success) {

if (success) {

count = getXML.firstChild.firstChild.nodeValue;

if (count>0) {

loginMsg = "Login existente";

login_w._visible = true;

login_r._visible = false;

} else {

loginMsg = "";

login_w._visible = false;

login_r._visible = true;

}

} else {

trace("Cannot load XML");

}

};

}

}

 

function setText() {

login_e.text = loginMsg;

pass_e.text = passMsg;

pass2_e.text = passMsg2;

mail_e.text = mailMsg;

}

 

function submit() {

checkForm();

checkAccount();

setText();

if (formSuccess == 0) {

var sendRegisterVars:LoadVars = new LoadVars();

sendRegisterVars.login_txt = login_txt.text;

sendRegisterVars.pass_txt = pass_txt.text;

sendRegisterVars.mail_txt = mail_txt.text;

sendRegisterVars.sendAndLoad("register/register.php",sendRegisterVars,"POST");

formSuccess = 1;

}

}

 

init();

 

submit_btn.onRelease = function() {

submit();

};

 

<?php
// Apaguei os dados no post apenas
$host = "";
$login = "";
$pass = "";
$db = "";

mysql_connect($host,$login,$pass);
mysql_select_db($db);

function code($pass) {
return base64_encode(pack('H*', sha1($pass)));
}

$login = $_POST["login_txt"]);
$pass = code($_POST["pass_txt"]);
$mail = $_POST["mail_txt"];
$date = time();

$sql=mysql_query("SELECT * FROM accounts WHERE login='".$login."'");

while($a=mysql_num_rows($sql)){
if($a<1) {
	mysql_query("INSERT INTO accounts (login, password, access_level, register_date, email) VALUES ('".$login."', '".$pass."', '0', '".$date."', '".$mail."')");
	break;
}
}
header( "Content-type: text/xml; chatset=UTF-8" );
printf( '<?xml version="1.0" encoding="utf-8"?><count>%s</count>', $a );
die;

?>

 

 

Bom, pesquisei no fórum e encontrei um post onde vi que era melhor usar o método de XML, então fiz como no post e adicionei o XML dentro do PHP, mas não surtiu efeito.

 

Eu quero que ele envie os dados do login_txt, pass_txt & mail_txt para o PHP, então o PHP verifica se o login já existe no database e retorna um valor no método de xml (<count>) então o Flash analiza o resultado e define a mensagem (loginMsg) de erro que deverá aparecer ou se deverá proceder para a mensagem de sucesso..

 

 

Espero que tenham conseguido entender meu problema, obrigado http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom para enviar mensagem de sucesso ou não de volta para o flash...

 

Depois de executar sua função do php envie a variavel com:

echo "&ok=1&";
Como exemplo...

 

No flash

sendRegisterVars.sendAndLoad("register/register.php",sendRegisterVars,"POST");

Aqui você na verdade precisa de 2 variaveis

1 que envia... e uma que recebe

Então você tem que criar 2 LoadVars

Ficando +/- assim:

sendRegisterVars.sendAndLoad("register/register.php",loadRegisterVars,"POST");

 

Ai para receber os dados é do mesmo jeito que se recebe dados com loadvars

loadRegisterVars.onLoad = carregar();

function carregar(){
if(loadRegisterVars.ok==1){
trace("deu certo");//Aqui vai o campo de mensagem ok??? não meu trace ilustrativo
}else {
trace("deu erro");
}

 

Basicamente isso

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas o loadRegisterVars é necessário apenas no sendAndLoad?

 

Só assim:

if (formSuccess == 0) {

var sendRegisterVars:LoadVars = new LoadVars();

sendRegisterVars.login_txt = login_txt.text;

sendRegisterVars.pass_txt = pass_txt.text;

sendRegisterVars.mail_txt = mail_txt.text;

sendRegisterVars.sendAndLoad("register/register.php",loadRegisterVars,"POST");

formSuccess = 1;

Quanto ao echo "&ok=1";, como faço para zerar depois? O meu WebSite é 100% em flash, a única página fora disso é essa que estou criando, por isso tem apenas a URL ./ (como num iframe)...então se eu colocar o &ok=1 não irá ficar fixo até recarregar a página? Acho que isso poderia bugar se o usuário for registrar 2x e o ok=1 já estiver lá, então a mensagem não será mostrada e ele receberá a mensagem de sucesso sendo ela verídica ou não...ou estou errado?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom

Aqui:

if (formSuccess == 0) {
var sendRegisterVars:LoadVars = new LoadVars();
var loadRegisterVars:LoadVars = new LoadVars();
sendRegisterVars.login_txt = login_txt.text;
sendRegisterVars.pass_txt = pass_txt.text;
sendRegisterVars.mail_txt = mail_txt.text;
sendRegisterVars.sendAndLoad("register/register.php",loadRegisterVars,"POST");
formSuccess = 1;
}

Como eu disse tem que criar 2 variaveis loadVars uma para enviar outra para receber... e não, não pode usar a mesma para fazer as duas funções pq pode dar problema.

 

Quanto a variavel do ok

 

Só vai ser colocada se esse while for verdadeiro

while($a=mysql_num_rows($sql)){
        if($a<1) {
                mysql_query("INSERT INTO accounts (login, password, access_level, register_date, email) VALUES ('".$login."', '".$pass."', '0', '".$date."', '".$mail."')");
                echo "&ok=1&";
                break;
        }else{
                echo "&ok=2&";
        }
}
Caso contrario ele retorna 2 e assim no seu if else lá que eu exemplifiquei acima... vai dar um retorno falso...

E você não precisar se precupar com essa variavel...

 

E não... ela não fica sendo valida para sempre...

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Meu PHP ficou assim:

$sql=mysql_query("SELECT * FROM accounts WHERE login='".$login."'");

while($a=mysql_num_rows($sql)){
if($a<1) {
	mysql_query("INSERT INTO accounts (login, password, access_level, register_date, email) VALUES ('".$log."', '".$password."', '0', '".$date."', '".$mail."')");
	echo "&ok=0&";
	break;
} else {
echo "&ok=1&";
}
}

 

O Flash ficou assim:

 

function submit() {
	checkForm();
	setText();
	if (formSuccess == 0) {
		var sendRegisterVars:LoadVars = new LoadVars();
		var loadRegisterVars:LoadVars = new LoadVars();
		sendRegisterVars.login_txt = login_txt.text;
		sendRegisterVars.pass_txt = pass_txt.text;
		sendRegisterVars.mail_txt = mail_txt.text;
		sendRegisterVars.sendAndLoad("register/register.php",loadRegisterVars,"POST");
		formSuccess = 1;
	}
}

loadRegisterVars.onLoad = checkAccount();

function checkAccount() {
	if(loadRegisterVars.ok==0) {
		loginMsg = "";
		login_w._visible = true;
		login_r._visible = false;
	} else {
		loginMsg = "Login existente";
		login_w._visible = false;
		login_r._visible = true;
	}
}

Essas foram as alterações feitas, mas não surtiu efeito algum, continua sem registrar... :(

Compartilhar este post


Link para o post
Compartilhar em outros sites

A chamada da função

Deve estar logo a baixo do send

loadRegisterVars.onload = checkAccount();

 

E as variaveis

var sendRegisterVars:LoadVars = new LoadVars();

var loadRegisterVars:LoadVars = new LoadVars();

 

devem ser declaradas fora da função!

 

Pois uma variavel declarada dentro de uma função só é valida dentro dela!!!!

 

 

var sendRegisterVars:LoadVars = new LoadVars();
var loadRegisterVars:LoadVars = new LoadVars();
function submit() {
        checkForm();
        setText();
        if (formSuccess == 0) {
                sendRegisterVars.login_txt = login_txt.text;
                sendRegisterVars.pass_txt = pass_txt.text;
                sendRegisterVars.mail_txt = mail_txt.text;
                sendRegisterVars.sendAndLoad("register/register.php",loadRegisterVars,"POST");
                formSuccess = 1;
                loadRegisterVars.onload = checkAccount();
        }
}

function checkAccount() {
        if(loadRegisterVars.ok==0) {
                loginMsg = "";
                login_w._visible = true;
                login_r._visible = false;
        } else {
                loginMsg = "Login existente";
                login_w._visible = false;
                login_r._visible = true;
        }
}

Assim deve funcionar.

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado! Está quase lá...ele está registrando agora, mas ainda não envia de volta a resposta ao Flash...simplesmente envia os dados, se tiver repetido ele ignora e não altera a mensagem...

 

O PHP eu não alterei agora, o Flash fiz como você indicou, agora envia, mas não recebe a mensagem de sucesso ou falha

 

 

E uma dúvida que surgiu agora com o envio funcionando, quando eu envio os dados, ele fica um bom tempo com a mensagem "Recebendo dados de ...." como faço para terminar o script quando enviar?

Tentei com as variáveis "die;" e "mysql_close();" mas ele não encerra o script...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpe pelo Flood, mas o botão editar "sumiu" da minha autorização... http://forum.imasters.com.br/public/style_emoticons/default/blush.gif

 

Consegui fazer funcionar! Alterei o PHP:

 

echo "&ok=0&";

// Alterado para:

echo "ok=0";

 

Sem os AND (&)funcionou...

 

Mas os resultados não vem corretamente, eu submeto uma vez e ele dá a mensagem de falha (pois já existe) mesmo tendo obtido sucesso e a conta foi criada...para que vá corretamente é necessário submeter duas vezes, aí na segunda ele corrige e mostra a mensagem de sucesso...

 

Quanto a dúvida de como terminar o script, ainda não consegui, tem alguma idéia pra resolver? :mellow:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom... ele deve parar de receber as informações quando você fecha a conexão com o banco né

Ou seja você coloca isso aqui no final do script todo:

mysql_close();

 

E ele deve fechar a conexão com o banco com sucesso...

 

Mas nunca tive problemas... e as vezes é bug aquele recebendo informações que aparece ali em baixo... é mentira ta recebendo nada e continua dizendo que ta...

 

Abraços

 

E quem bom que conseguiu ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ainda não está totalmente funcional http://forum.imasters.com.br/public/style_emoticons/default/no.gif

 

Quando eu envio os dados ao PHP, ele não retorna de acordo com o resultado apresentado no PHP, por exemplo:

 

Login: abcd

Senha: a

E-mail: a@b.c

 

Independente da existencia da conta no database ou não, ele sempre retorna o valor verdadeiro (conta existente)...então, envio os mesmos dados pela segunda vez (sem alterar o login) aí sim ele reconhece se está correto ou não. Mas se eu alterar o login e enviar novamente, ele retornará o valor falso (conta inexistente) mesmo ela existindo, e se eu alterar uma terceira vez o login retornando o valor que coloquei da primeira vez, ele retornará o valor de conta existente novamente mesmo ela sendo inválida.

 

Resumindo, preciso enviar 2 vezes para que o real resultado seja apresentado, e na alteração dos dados é necessário enviar novamente os dados 2x...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom ai é algum furo no seu código com o php

Eu pesquisaria por mysql_affected_rows()...

 

E não usaria um while para comparação...

 

Exemplo de como eu faria:

$confirmacao = mysql_query("SELECT * FROM accounts WHERE login = '$login'");
$contagem = mysql_num_rows($confirmacao);
if($contagem == 1){
echo "&ok=1&";//pois o resultado ja existe então da erro
}else {
//Crio o registro
mysql_query("INSERT INTO accounts (login, password, access_level, register_date, email) VALUES ('".$log."', '".$password."', '0', '".$date."', '".$mail."')");
echo "&ok=0&";
}

E pronto ta feito seu teste ;)

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois então, erro não é porque eu testei o código sem o flash e funcionou corretamente, o meu código já está assim como o seu, apenas não possui os AND (&) no echo, pois com eles não está tendo retorno algum do resultado ao flash

 

$sql=mysql_query("SELECT * FROM accounts WHERE login='".$login."'");
$a=mysql_num_rows($sql);

if($a==0) {
mysql_query("INSERT INTO accounts (login, password, access_level, register_date, email) VALUES ('".$login."', '".$pass."', '0', '".$date."', '".$mail."')");
echo "ok=0";
} else {
echo "ok=1";
}

mysql_close();

 

O mysql_close(); que você falou para por eu também já tinha tentando...mas se não causará problemas então não preciso perocupar-me com isso. o problema é só o retorno

 

Não tem uma forma de "limpar" o cache que o buffer retorna no PHP? Daí toda vez que o Flash faz o envio ao PHP e o php faz a requisição, o cache está limpo.

 

Vendo do modo que está agora, me parece que está mais ou menos neste sistema:

 

Envio Flash -> PHP | Requisição PHP -> Database | Retorno PHP -> Flash | Armanenamento dos dados -> Flash | Novo envio Flash -> PHP | Aplicação das informações armazenadas -> Flash | Novo retorno PHP -> Flash | Nova Requisição PHP -> Database | Novo retorno PHP -> Flash | Novo armazenamento de dados -> Flash

E essa sequência se repete quando há o submit dos dados...ou seja, ele só aplica o armazenamento quando recebe o segundo retorno. No primeiro, como é uma variável inexistente (O .ok é criado apenas no retorno ao flash), há uma interpretação nula do .ok e ele retorna o valor como sendo incorreto (Se o .ok for = 0 faz X, se não faz Y. Como não tem .ok ele vai ao Y)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu não to conseguindo entender essa sua lógica.

 

Pois eu tenho aqui um sistema de login em flash... e ele altera sim a variavel conforme ele vai e volta...

Para testar online... como você não vai fazer dentro do flash... coloque uma caixa de texto para ler o valor do ok

 

Como se fosse um trace do valor propriamente dito.

 

Bom vou colocar aqui...

O que eu normalmente uso só que sem algumas coisas ;)

Veja se lhe é interessante.

login_bd.rar

 

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não é exatamente uma lógica, estou tentando descrever o meu problema de uma forma clara, veja se fica melhor assim:

 

Colo nos campos os seguintes dados:

 

Login: 1

Senha: a

Repetição: a

Email: a@b.c

 

E envio ao database, sendo que no database não existem contas, portanto essa devería ser valida e este resultado deveria ser exibido:

if (loadRegisterVars == 0) {
loginMsg = "";
                login_w._visible = true;
                login_r._visible = false;
}

Pois ele corresponde à condição.

 

No entanto, o resultado que é exibido é este:

 

else {
                loginMsg = "Login existente";
                login_w._visible = false;
                login_r._visible = true;
}

Que corresponde a existência da conta mesmo ela não existindo.

 

Agora envio os mesmos dados novamente.

 

Como eu enviei anteriormente dados iguais, ele deveria ir para o "else" pois a conta já existe, mas pelo contrário, ele vai para o "if" e diz que a conta é válida mesmo ela já existindo (pois foi criada quando eu enviei pela primeira vez).

 

Então, eu altero os dados para estes:

Login: 2

Senha: a

Repetição: a

E-mail: a@b.c

E envio novamente. Como eu enviei a conta 1, a conta 2 ainda é inexistente, então o resultado deveria ser o "if", mas o resultado exibido é o "else", indicando que a conta já existe sendo ela inexistente.

 

Então envio a mesma conta (2) novamente, e o mesmo acontece, como ela foi criada quando enviei pela primeira vez, deveria aparecer o "else", mas aparece o "if" dizendo que a conta é válida.

 

 

Por isso deduzi que ele usa o resultado anterior.

 

Envio os dados, ele faz o registro e retorna o boolean, mas usa o padrão (falso) pois a variável só é declarada quando há o retorno do PHP (Pois ela é criada lá e não no flash). Envio novamente e ele aplica o boolean que foi retornado da primeira vez que enviei (true) sendo que a conta já foi feita, então ele armazena o novo boolean (falso) pois o retorno diz que a conta foi criada.

Envio uma nova conta, com outros dados, ele faz o registro e aplica o boolean anterior (falso) e recebe o novo boolean (true)...e assim sucessivamente

 

Ou seja, quando eu envio os dados, ele usa o resultado obtido na vez que enviei antes. Quando é a primeira vez que envio, ele vai para o else, porque a variável "ok" não existe, então não pode ser igual a nada...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então meu amigo......

 

Seu código ta furado já disse!!!

if (loadRegisterVars == 0) isso NUNCA VAI retornar 0!!!

 

Ele entra ai por mero acaso... algum bug provavelmente de tentativa de repetição!!!

 

Da uma olhada como eu fiz o meu.....

E você vai ver que funciona....

 

Tente criar duas vezes a mesma conta e verá que não consegue....

 

Custa nada olhar...

 

Se você não colocar &ok=1& o flash nunca vai receber as variaveis pois ele só recebe os dados com o & antes!!!

 

E ai você tem que chamar a variavel loadRegisterVars.ok para você ter o valor do ok se não você nunca vai ter esse valor......

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.