KaaL 0 Denunciar post Postado Agosto 27, 2009 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
Thiago de Oliveira Cruz 21 Denunciar post Postado Agosto 27, 2009 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
KaaL 0 Denunciar post Postado Agosto 27, 2009 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
Thiago de Oliveira Cruz 21 Denunciar post Postado Agosto 27, 2009 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
KaaL 0 Denunciar post Postado Agosto 27, 2009 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
Thiago de Oliveira Cruz 21 Denunciar post Postado Agosto 27, 2009 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
KaaL 0 Denunciar post Postado Agosto 27, 2009 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
KaaL 0 Denunciar post Postado Agosto 27, 2009 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
Thiago de Oliveira Cruz 21 Denunciar post Postado Agosto 27, 2009 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
KaaL 0 Denunciar post Postado Agosto 28, 2009 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
Thiago de Oliveira Cruz 21 Denunciar post Postado Agosto 29, 2009 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
KaaL 0 Denunciar post Postado Agosto 29, 2009 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
Thiago de Oliveira Cruz 21 Denunciar post Postado Agosto 29, 2009 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
KaaL 0 Denunciar post Postado Agosto 30, 2009 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
Thiago de Oliveira Cruz 21 Denunciar post Postado Agosto 30, 2009 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