Sistema de registo com 2 erros - Versão de Impressão +- Forum Pplware (http://forum.pplware.com) +-- Fórum: Mais Tech (/forumdisplay.php?fid=11) +--- Fórum: Programação e Web (/forumdisplay.php?fid=16) +--- Tópico: Sistema de registo com 2 erros (/showthread.php?tid=9174) Páginas: 1 2 |
Sistema de registo com 2 erros - Suesana - 13-06-2011 14:48 Boas tenho um sistema de registo num site, que está assim: registe_se.php: <form name="dados" method="post" action="adicionar_registo.php" onSubmit="return enviardados();"> <table> <tr> <td>Nome:</td> <td> <input name="nome" size="40" class="formulario" /> </td> </tr> <tr> <td>Morada:</td> <td><input name="morada" size="40" class="formulario"/></td> </tr> <tr> <td>Código Postal:</td> <td><input name="codigo_postal" size="30" class="formulario" /></td> </tr> <tr> <td>Localidade:</td> <td><input name="localidade" size="30" class="formulario" /></td> </tr> <tr> <td>Telefone</td> <td><input name="telefone" size="30" class="formulario" /></td> </tr> <tr> <td>E-mail:</td> <td><input name="email" size="30" class="formulario" /></td> </tr> <tr> <td>Password:</td> <td><input type="password" name="password" size="30" class="formulario"/></td> </tr> <tr> <td> </td><td><input type="submit" name="button1" value="Enviar" class="formulario"/> <input type="reset" name="Reset" class="formulario" value="Limpar"/></td> </tr> </table> </form> e depois tenho a página adicionar_registo.php: <?php include "admin/ligacao.php"; $nome=$_POST['nome']; $morada=$_POST['morada']; $codigo_postal=$_POST['codigo_postal']; $localidade=$_POST['localidade']; $telefone=$_POST['telefone']; $email=$_POST['email']; $password=$_POST['password']; $sql=mysql_query("insert into registe_se values('','$nome', '$morada', '$codigo_postal', '$localidade', '$telefone', '$email', '$password')"); $sql=mysql_query("insert into login_clientes values('', '$nome', '$email', '$password')"); include "email_registo.php"; ?> eu queria que não pudesse registar-se uma pessoa em que o email já existisse na base de dados, Alguem me pode ajudar sff? RE: Sistema de registo com 2 erros - Bruno Bernardino - 13-06-2011 14:52 Para além de óbvios problemas de segurança como mysql injection e não validação dos campos, o que deverias de fazer seria um select pelo email, se existisse, mostrarias o erro. Podes também tornar o campo "Unique" na base de dados. RE: Sistema de registo com 2 erros - Suesana - 13-06-2011 14:57 isso do mysql injection nunca me explicaram como se faz, apesar de já ter procurado na internet não consigo perceber como se utiliza. A validação de dados esta feita mas não coloquei aqui o código porque não havia necessidade de mostrar esse código. é possível mostrar um exemplo sff? RE: Sistema de registo com 2 erros - Mettafox - 13-06-2011 16:53 Usa isto para escapar caracteres que são usados para SQLi: addslashes() ou mysql_real_escape_string() Outra coisa, não faças só validação via server side, faz também via client side (javascript). Adiciona isto também às variáveis para remover os espaços em branco no inicio e no fim da string: trim() Como o nome pode conter acentos, e ao enviares para a BD, na BD os acentos irão ficar estúpidos, então para corrigir isso usa: htmlentities() ou htmlspecialchars() Relativamente ao email, no momento que fazes submit do form, no script php, antes de criares a query para inserir os dados, crias um ciclo IF, para verificar o email. Algo deste género: $query=mysql_query('SELECT * FROM tabela WHERE campo_email="'.$_POST['email'].'"'; $registo=mysql_fetch_assoc($query); if($registo['email'] != ""){ devolve aqui um erro, email existente } else{ aqui fica o teu restante código para inserir os dados } RE: Sistema de registo com 2 erros - Suesana - 13-06-2011 17:29 mas tipo coloco mysql_real_escape_string() em todas as minhas páginas? é só isso? tem algum sitio especifico? (tipo dentro do head, do body ou assim). ---------------------------------------------- para a validação de campos uso tipo isto: <!--VALIDA FORMULÁRIO--> <script language="JavaScript" > function enviardados(){ if(document.dados.nome.value=="" || document.dados.nome.value.length < 2) { alert( "Preencha o campo Nome correctamente." ); document.dados.nome.focus(); return false; } if(document.dados.morada.value=="" || document.dados.morada.value.length < 5) { alert( "Preencha o campo Morada correctamente." ); document.dados.morada.focus(); return false; } if(document.dados.codigo_postal.value=="" || document.dados.codigo_postal.value.length < 5) { alert( "Preencha o campo Código postal correctamente." ); document.dados.codigo_postal.focus(); return false; } if(document.dados.localidade.value=="" || document.dados.localidade.value.length < 2) { alert( "Preencha o campo Localidade correctamente." ); document.dados.localidade.focus(); return false; } if(document.dados.telefone.value=="" || document.dados.telefone.value.length < 9) { alert( "Preencha o campo Telefone correctamente." ); document.dados.telefone.focus(); return false; } if( document.dados.email.value=="" || document.dados.email.value.indexOf('@')==-1 || document.dados.email.value.indexOf('.')==-1 ) { alert( "Preencha o campo E-mail correctamente." ); document.dados.email.focus(); return false; } if(document.dados.password.value=="" || document.dados.password.value.length < 5) { alert( "Preencha o campo Password correctamente e com mais de 5 caracteres." ); document.dados.password.focus(); return false; } return true; } </script> <!--VALIDA FORMULÁRIO--> ------------------ quanto ao registo, coloquei assim: <?php include "admin/ligacao.php"; $nome=$_POST['nome']; $morada=$_POST['morada']; $codigo_postal=$_POST['codigo_postal']; $localidade=$_POST['localidade']; $telefone=$_POST['telefone']; $email=$_POST['email']; $password=$_POST['password']; $query=mysql_query('SELECT * FROM login_clientes WHERE email="'.$_POST['email'].'"'); $registo=mysql_fetch_assoc($query); if($registo['email'] != ""){ echo "<META HTTP-Equiv=REFRESH CONTENT='0; url=registe_se.php'> <script type=\"text/javascript\"> alert(\"Esse e-mail já existe, faça login, ou então, recupere a sua password.\"); </script>"; } else{ $sql=mysql_query("insert into registe_se values('','$nome', '$morada', '$codigo_postal', '$localidade', '$telefone', '$email', '$password')"); $sql=mysql_query("insert into login_clientes values('', '$nome', '$email', '$password')"); include "email_registo.php"; } ?> e fantástico, ja aparece tudo correcto, só que, houve 1 problema. Registei um novo cliente, ele recebeu o email mas os dados dele não foram nem para a tabela registe_Se nem para a login_clientes RE: Sistema de registo com 2 erros - Mettafox - 13-06-2011 18:27 Não foram para nenhuma dessas tabelas como assim? Se não foram para lá é porque algo na query ou na construção que não está bem. O mysql_real_escape_string é para por nas variáveis, desta forma: $variavel=mysql_real_escape_string($_POST['exemplo']); Na query em vez de usares o $_POST['exemplo'], usas a $variavel. Só usas o mysql_real_escape_string em variáveis que irão ser usadas em querys SQL, esta função serve para escapar caracteres especiais usados para fazer SQL Injection. Outra coisa, protege o teu site contra XSS (Cross-Site Scripting), se o SQL Injection é um dos ataques mais usados, o XSS supera o SQLi na usabilidade em ataques. Procura na net quais são os caracteres mais usados para fazer XSS, depois só tens de criar um ficheiro php, onde o irás chamar em todas as tuas páginas. Nesse ficheiro PHP é onde irá conter a verificação do URL de forma a prevenir XSS. RE: Sistema de registo com 2 erros - Suesana - 13-06-2011 18:32 Muito Obrigada por toda a ajuda prestada. inicialmente, ele estava a inserir direito na tabela registe_se e na tabela login_clientes mas depois de colocar isto: $query=mysql_query('SELECT * FROM login_clientes WHERE email="'.$_POST['email'].'"'); $registo=mysql_fetch_assoc($query); if($registo['email'] != ""){ echo "<META HTTP-Equiv=REFRESH CONTENT='0; url=registe_se.php'> <script type=\"text/javascript\"> alert(\"Esse e-mail já existe, faça login, ou então, recupere a sua password.\"); </script>"; } else{ os dados já não vão para a BD RE: Sistema de registo com 2 erros - Mettafox - 13-06-2011 19:10 Faz isto para cada um dos INSERTS, mas um de cada vez, comenta um e deixa o outro a funcionar: echo mysql_affected_rows(); Isto vai devolver quantos campos foram afectados pela query. Se devolver -1, quer dizer que não foram nenhum. RE: Sistema de registo com 2 erros - Suesana - 14-06-2011 10:04 Já está tudo correcto, eu é que me enganei e estava a ver o 127.0.0.1/phpmyadmin local e em vez de ver o que estava no cpanel. Obrigada mais uma vez pela ajuda. Agora só tem um problema mas é soutra coisa, que é: cada cliente apenas ve a sua conta(onde pode mudar os seus dados, morada, contacto, password, etc) e depois na parte do carrinho de compras cada cliente ve a encomenda dos outros, ou seja, se a Ana adicionar produtos ao carrinho de compras, o Daniel após fazer login, também ve a encomenda, é possivel dar um ajuda sff? fiz a parte de adicionar ao carrinho de compras através deste tutorial: http://www.videoaulasbrasil.com.br/php/carrinho-de-compras-com-php/ RE: Sistema de registo com 2 erros - Mettafox - 14-06-2011 12:32 Neste caso vais ter que usar Cookies ou Sessions. Quando o utilizador fizer login, cria um Cookie ou uma Session com o ID dele. Tu crias um painel, por exemplo: alteradados.php?iduser= no iduser irá estar ID do utilizador logado, e nos campos dessa página irão estar as do utilizador desse ID. É simples fazer. Se o login estiver certo irá criar isto: Via Cookies: setcookie("idUser", $registo['campoIDdaTabela'], time()+3600*60, "/"); Via Sessions (mais seguro): na linha 1 do ficheiro escreves isto: session_start(); na linha 2 do ficheiro escreves isto: ob_start(); agora a sessão: $_SESSION['idUser']=$registo['campoIDdaTabela']; Agora depois de criares isto no momento do login, só tens de executar querys SQL SELECT, para ires buscar os dados à tabela relativos ao ID em questão. Agora relativamente ao carrinho de compras, é só na página em questão, mandares escrever todos os produtos adicionados ao carrinho. |