Forum Pplware
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>&nbsp;</td><td><input type="submit" name="button1" value="Enviar" class="formulario"/>
&nbsp;&nbsp;
<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.