Ir ao conteúdo

PHP Insert into em php para cadastro


Ir à solução Resolvido por DiF,

Posts recomendados

Postado

Ola,

 

Estou criando um formulário de cadastro, mas estou retornando erro para inserir os dados no banco.

<?php
$conexao = include 'menu/conexao.php';
$nome = $_POST['name'];
$sobre = $_POST['sobre'];
$tel = $_POST['phone'];
$niver = $_POST['niver'];
$email = $_POST['email'];
$senha = $_POST['password'];
$genero = $_POST['gen'];

$sql = mysqli_query($conexao, "INSERT INTO registro(nome, sobrenome, telefone, nascimento, email, senha, genero)
VALUES ('$nome', '$sobre', '$tel', '$niver', '$email', '$senha','$genero')");
?>

Erro: arse error: syntax error, unexpected ';', expecting ',' or ')' in /home/jovememc/public_html/coach/register.php on line 12

 

Linha 12 é a dos VALUES, mas não seu aonde estou errando. Agradeço

Postado

Olá...

 

Em 26/07/2018 às 10:09, Glouk disse:

$sql = mysqli_query($conexao

tem certeza que esse i está certo?

 

Estou meio enferrujado no desenv.Web mas teste assim:

 

<?php 
$conexao = include 'menu/conexao.php'; 
$nome = $_POST['name']; 
$sobre = $_POST['sobre']; 
$tel = $_POST['phone']; 
$niver = $_POST['niver']; 
$email = $_POST['email']; 
$senha = $_POST['password']; 
$genero = $_POST['gen']; 

$Insertsql = "INSERT INTO registro(nome, sobrenome, telefone, nascimento, email, senha, genero) VALUES ('$nome', '$sobre', '$tel', '$niver', '$email', '$senha','$genero')";
$sql = mysql_query($Insertsql, $conexao);  
?>

 

  • Curtir 1
Postado

Sim, consegui obrigado.

 

Mas estou com um problema parecido com o formulario de login, acho que tem algo de errado, pois estou digitando a senha e email iguais ao do banco, e fica retornando erro de login. Acho que eles não esta comparando certo.

 

Consegui identificar o erro: 

 

if (isset($_POST['update'])) {
    $con = mysqli_connect($servername, $username, $password, $database);
    $verifica = mysqli_query($con,"SELECT * FROM registro WHERE email = '$email' AND senha = '$senha'") or die("erro ao selecionar");
    if (mysqli_num_rows($verifica)<=0){
        echo"<script language='javascript' type='text/javascript'>alert('Login e/ou senha incorretos!');window.location.href='login.php';</script>";
        mysqli_close($con);
        die();
    }else{
        setcookie("login",$email);
        header("Location:index.php");
        mysqli_close($con);
    }
}

 

  • Moderador
Postado

@R0DR1G0_CWB

Em 27/07/2018 às 17:21, R0DR1G0_CWB disse:

tem certeza que esse i está certo?

O MySQLi é uma extensão mais recente do mysql.  O antigo ficou obsoleto e foi removido do PHP mais recente.

Por isso, passe a usar sempre o mysqli com " i " no final.  

 

Quanto ao erro do primeiro post do tópico... está nesta linha:

$conexao = include 'menu/conexao.php'; 

É errado atribuir o include em uma variável.

 

O $conexao você usa dentro do arquivo conexao.php. 

O include é só 

 include 'menu/conexao.php';

 

Quanto ao segundo código,

Não tem sentido comparar se for menor ou igual a zero.

Basta comparar com a igualdade pois se for zero não achou registro.  Se for 1 achou o registro.

 

Veja este post que mostro um código para autenticadores de login baseado em session e cookie.

 

  • Curtir 1
  • Obrigado 1
Postado
13 horas atrás, DiF disse:

Basta comparar com a igualdade pois se for zero não achou registro

 @DiF Fiz a alteração, mas continua retornando mensagem de Login incorreto mesmo estando idêntico ao banco de dados.

if (isset($_POST['update'])) {
    $con = mysqli_connect($servername, $username, $password, $database);
    $verifica = mysqli_query($con,"SELECT * FROM registro WHERE email = '$email' AND senha = '$senha'") or die("erro ao selecionar");
    if (mysqli_num_rows($verifica)== 0){
        echo"<script language='javascript' type='text/javascript'>alert('Login e/ou senha incorretos!');window.location.href='login.php';</script>";
        mysqli_close($con);
        die();
    }else{
        setcookie("login",$email);
        header("Location:index.php");
        mysqli_close($con);
    }
}

 

  • Moderador
Postado

@Glouk Bueno, 

 

Recomendo que você entre no tópico que eu recomendei mais acima no meu último post.  Use aquele código como autenticador. 

 

Quanto ao seu código, veja se tem retorno na sua consulta. Está retornado o erro porque a consulta retorna a igualdade com zero. Por isso dá login errado.

 

reveja seu código e teste a consulta no phpmyadmin.

 

  • Obrigado 1
Postado

@DiF Sim, eu consegui, mas gostaria de sua opinião pra saber como devo fazer o seguinte:

 

Quando o usuario cria a conta dele existem três niveis de privilegio: 

 

0 = Conta desativada

1 = Conta ativada, usuario comum

2 = Conta ativada, usuario administrador

 

Todos os usuarios que se registram são com status 0. Posteriormente o administrador ativa eles.

Quando o usuario realiza o login, queria que o banco verifica-se o status dele, caso seja 1 ele entra com sucesso. Mas caso seja 0 ele recebe uma mensagem de conta desativada. 

 

Como acrescento isso na verificação? Tentei devo criar outra conexão mysql pra verificação do status? Porque se acrescentar junto com o login, se a conta estiver desativada vai aparecer erro na senha etc..

 

A conta de administrador (2), tem algumas funções escondidas para usuarios comuns. Como faço pra salvar que tipo de usuario é na seção? Tem alguma dica pra melhorar o sistema?

  • Moderador
  • Solução
Postado

@Glouk

 

Para fazer esse sistema de login baseado nas permissões, tens que começar projetando seu banco de dados de forma correta.

Por exemplo:

Tabela usuario

  • id  - INT 11 auto increment Chave primária
  • nome -  Varchar 250
  • email - Varchar 250
  • senha - Varchar 250      <-- nesse campo, podes inserir a senha criptografada pelo php
  • status - INT 11 chave estrangeira

 

Tabela status

  • id  - INT 11 auto increment Chave primária
  • nome -  Varchar 250

 

Repare que temos ali as duas tabelas "principais"  onde uma possui os dados do usuário  e outra do status da conta, ou seja , se é desativado, ativado comum ou ativado admin.

 

Na maneira simples de fazer você só precisa fazer a ligação do relacionamento 1:N  do o campo ID, da tabala "status" com o campo "status" da tabela  usuário.

 

Para fazer esse relacionamento, certifique-se de primeiro definir o índice na tabela que vai " comandar " a consulta do sistema.  Nesse caso, a tabela é a usuário. Então é nessa tabela que você vai criar o índice, atribuindo o tipo dela como "INDEX" e selecionando o campo status, porque é ele que vai ser a chave estrangeira.

 

Com o índice feito, o jeito mais prático de criar o relacionamento é pelo modo Designer. Se estiver em português, vai estar como " Desenhador". Vai encontrar essa opção quando clicar no nome do seu banco de dados  

 

6abNZtg.png

 

Uma dica, para saber se fez certo o relacionamento, vai aparecer a opção de ON CASCADE para update e delete.  Esta opção serve para somente apagar um registro, se for apagado em outra tabela o relacionado a este.

 

 

Antes de iniciar no php, popule as suas tabelas com alguns dados fictícios só para testar.

 

Basicamente a instrução SQL que vai fazer seria algo como:

 

SELECT usuario.id, 
       usuario.nome,
       usuario.email,
       usuario.senha,
       usuario.status,
       status.nome as nomeStatus
FROM usuario
INNER JOIN status ON status.id = usuario.status
WHERE usuario.id = 1

Lembrando que esse é só a base da instrução. 

Isso iria retornar os dados do usuário id um  e mostraria também o nome do status da conta e o valor ID do campo.

 

Por exemplo:

ID  nome    email               senha   status  nomeStatus
 1  Fulano  [email protected]  12345     3     Conta ativada, usuario administrador 

 

Veja que temos ali todos os dados que precisamos!

 

Com isso usamos no php.

Falado de uma maneira simples, você vai usar a condicional switch case para validar o status da conta e redirecionar para  a página correta.

 

<?php
session_start();


$email = $_POST["email"];
$senha = $_POST["senha"];


include "conexao.php";

$query = mysqli_query($conexao, "SELECT usuario.id, 
       				        usuario.nome,
                                        usuario.email,
                                        usuario.senha,
                                        usuario.status                                      
                                   FROM usuario
                                   INNER JOIN status ON status.id = usuario.status
                                   WHERE usuario.email = '$email' AND usuario.senha = '$senha'");

$num = mysqli_num_rows($query); 


//se zero, é porque ele errou a senha ou o login
if ($num == 0):
	echo "<script>
			alert('Usuario ou senha Incorreta');
			history.go(-1);
		  </script>";
	exit;
else:

$usuario = mysqli_fetch_object($query);
switch ($usuario->status):
     case 1:
            //armazena na variável o número ID do usuário 
	        $idUsuario = $usuario->id;
		
           //armazena na sessão o ID do usuário logado 
	       $_SESSION["id_usuario"] = $idUsuario;

           //armazena na sessão o nome do login.
          //aqui pode ser e-mail, login, nome do usuário e etc.
	      $_SESSION["email"] = $usuario->email;
		
	     //manda o usuário para a páginas depois de logado		
	      header ("Location: conta_desativada.php");
          break;
    case 2:
        //armazena na variável o número ID do usuário 
	        $idUsuario = $usuario->id;
		
           //armazena na sessão o ID do usuário logado 
	       $_SESSION["id_usuario"] = $idUsuario;

           //armazena na sessão o nome do login.
          //aqui pode ser e-mail, login, nome do usuário e etc.
	      $_SESSION["email"] = $usuario->email;
		
	     //manda o usuário para a páginas depois de logado		
	      header ("Location: area_usuario_comum.php");
          break;
    case 3:
         //armazena na variável o número ID do usuário 
	        $idUsuario = $usuario->id;
		
           //armazena na sessão o ID do usuário logado 
	       $_SESSION["id_usuario"] = $idUsuario;

           //armazena na sessão o nome do login.
          //aqui pode ser e-mail, login, nome do usuário e etc.
	      $_SESSION["email"] = $usuario->email;
		
	     //manda o usuário para a páginas depois de logado		
	      header ("Location: area_usuario_administrador.php");
          break;
   endswitch;
endif;

Por fim, para que o autenticador dê certo e redirecione para as paginas certas ou leva de volta para o login é  crucial que você precisa usar este código em cada página na qual é feito o redirecionamento.  No exemplo seria conta_desativada.php, area_usuario_comum.php  e area_usuario_administrador.php:

 

<?php
session_start();
setcookie("ck_authorized", "true", 0, "/");

/*testa se a sessão tem valor.
  Refere-se a linha lá no arquivo de login onde
  é inserido o login na sessão. */
if(!isset($_SESSION["email"])):
    header("location: index.php");
else:
    $login = $_SESSION["email"];
endif;    
?>

 

Considerações finais e dicas:

 

Para o "login" prefira sempre utilizar o email.  Porque os usuários não esquecem seus e-mails!

 

Devo  lembrar para não simplesmente copiar ele. Estude para entender.

 

Repare que no código eu testo com 1, 2  e 3.

Isso porque no banco de dados quando faz o primeiro registro ele automaticamente começa com 1.  Então 

No caso seria:

1 = Conta desativada

2 = Conta ativada, usuario comum

3 = Conta ativada, usuario administrador

 

Bem é por aí a coisa.  Vai tentando. 

 

Boa sorte. :thumbsup:

 

 

  • Curtir 1
  • Obrigado 1
Postado

@DiF Então cara, agradeço mesmo. O seu sistema me deu uma ideia de tentar resolver de forma mais simples, sem precisar mexer tanto. Vou explicar para caso alguém queira fazer igual, ou pra você verificar se pode ocorrer algum problema.

 

Quando a pessoa se registra no site, ela cria uma linha na tabela registro com esses dados:

 

Screenshot_1.png.e85e7d053514925131a94fd9e03d6673.png

 

No php de registro eu defini como valor padrão do status = 0; 

 

Screenshot_2.png.15058cc28abf2d317ea20c583cfb6362.png

 

Então a ideia é que todos os usuários estejam desativados quando criar a conta.

 

Assim irei criar tabela dentro do site com todos os usuários desativados. E criar um select pra cada conta com as seguintes opções:

 

<option value"0">Conta bloqueada</option>

<option value"1">Conta Ativada</option>

<option value"0">Conta Administrativa</option>

 

Mas apenas um administrador pré definido antes vai ter acesso a essas opções. Que conforme a solicitação ira fazer um update na linha da tabela.

 

Então no login fiz dessa forma:

 

if (isset($_POST['update'])) {
    $con = mysqli_connect($servername, $username, $password, $database);
    $verifica = mysqli_query($con,"SELECT id, email, senha, status FROM registro WHERE email = '$loginSeguro' AND senha = '$senhaSegura'") or die("erro ao selecionar");
        if (mysqli_num_rows($verifica) == 0) {
            echo "<script language='javascript' type='text/javascript'>alert('Login e/ou senha incorretos!');window.location.href='login.php';</script>";
            mysqli_close($con);
            die();
        } else {
            $usuario = mysqli_fetch_object($verifica);
            switch ($usuario->status):
                case 0:
                    echo '<div class="alert alert-danger">
                      <strong>Opa!</strong> Sua conta não foi ativada pelo administrador ainda.
                    </div>';
                    break;
                case 1:
                    //armazena na variável o número ID do usuário
                    $idUsuario = $usuario->id;

                    //armazena na sessão o ID do usuário logado
                    $_SESSION["id_usuario"] = $idUsuario;

                    //armazena na sessão o nome do login.
                    //aqui pode ser e-mail, login, nome do usuário e etc.
                    $_SESSION["email"] = $usuario->email;

                    //manda o usuário para a páginas depois de logado
                    header ("Location: index.php");
                    break;
                case 2:
                    //armazena na variável o número ID do usuário
                    $idUsuario = $usuario->id;

                    //armazena na sessão o ID do usuário logado
                    $_SESSION["id_usuario"] = $idUsuario;

                    //armazena na sessão o nome do login.
                    //aqui pode ser e-mail, login, nome do usuário e etc.
                    $_SESSION["email"] = $usuario->email;

                    //manda o usuário para a páginas depois de logado
                    header ("Location: index.php");
                    break;
            endswitch;
        }
}

Tanto a conta normal (1), quanto a conta administrador esta indo para o index.php pois os dois possuem a mesma pagina.

 

Mas o administrador terá um menu hidden "Administração" que não aparece para usuários comuns.

 

Único problema que estou tendo é em fazer este menu administração aparecer apenas para usuários com o valor 2.

Postado

Boa tarde, @Glouk

 

Acredito que essa questão de aparecer o menu para usuários com valor igual a 2, talvez você possa guardar esse valor do tipo de conta do usuário na sessão, assim que o usuário realizar o login e realizar essa validação no frontend, se exibe ou não o menu para aquele usuário específico que realizou o login?

 

Algo como:

 

No backend, salvar o valor do tipo de conta na sessão junto aos outros dados:

 

$_SESSION['status'] = $usuario->status;

No frontend, verificar qual o tipo de status do usuário e exibir o menu, para aquele usuário específico se estiver nas condições

 

if($_SESSION['status'] == 2) {
	// Estrutura do seu menu
}

Acha que essa solução faz sentido para sua necessidade? Se não era bem isso que queria, só avisar que tentamos alinhar melhor e trazer uma possível solução para você.

 

Edit: Outra coisa, estava analisando o seu código e possui alguns códigos que meio que se repetem em ambas as condições nesse switch, então acho que seria legal você validar isso de uma vez pra evitar repetição de código, é uma boa prática. O que eu faria se fosse você, com seu atual código, seria deixar apenas o case 0, pois é quando o usuário deve ser tratado de uma forma diferente das outras duas e utilizaria um default para realizar a lógica repetida para usuários ativos. Como é um dado que é você quem tratará no backend (o valor do status), acho que é tranquilo realizar a validação da forma que comentei. Acha que faz sentido?

 

Abraços.

  • Curtir 1
  • Amei 1
  • Moderador
Postado

@Glouk Aff..   Minha solução acima é bem simples. da forma mais pífia possível.

Obviamente porque era só um exemplo.

 

Mas ainda voltamos aquela estaca zero.  

 

Porque comparar com ZERO, se você traz do banco o valor do status.  Lembrando que no BD sempre começa com 1.

Esta linha:

switch ($usuario->status):
                case 0:

Não vai funcionar. Sabe porque? Porque ali o valor do statos está esperando:  1 , 2 ou 3

Já que o banco de dados por padrão sempre pelo auto incremento, o primeiro registro é sempre 1.

Por isso não vai funcionar.   E ratifico que você DEVE fazer as mudanças no seu banco de dados, pelo menos no valor dos tipos de conta.

 

Quer uma versão melhor?

O banco de dados precisa respeitas as normas formais.  No caso,   ter uma tabela só para usuários, uma tabela só para tipo de usuário, uma tabela só para receber os dados de todas as tabelas um relacionamento de N:N... 

Assim você evita inconsistências.  Alias, o segredo de uma boa aplicação com banco de dados é ter o banco de dados o mais esmiuçado possível, ou seja, destrinchado em várias outras tabelas.

 

enfim. O exemplo que eu dei é só mera explicação  e avisei para não copiar, pois certamente havia erros, pois eu fiz tudo de cabeça sem nem testar nada.

 

Bueno, eu já cantei a pedra... eu fiz da forma como mencionei em um projeto anterior e funcionou

 

Alias o mesmo tipo de código com algumas mudanças podem ser vistos neste tópico:

 

É o mesmo propósito.  Poderia ter pesquisado!

 

@XenoStory Sua prática, sem dúvidas é ótima.  Eu coloquei o exemplo ali com vários  cases, só para o usuário entender tudo que acontece. 

Mas na prática, sim, sua dica faz bastante sentido. 

 

As vezes é bom economizar recursos no servidor. 

Só ainda ratifico que não se pode comparar com zero, se o banco de dados  retorna sempre um valor acima de zero!

A única mudança que faria no seu exemplo é trocar o valor dos cases para 1 como desativado, 2 ativado.

 

O admin é ativado sempre por padrão os outros não, mas para o php, como vai diferenciar o admin do usuário comum? que ambos são ativados?

O admin precisa pelo menos uma informação diferente para ser indicado ao php que é uma conta "especial".

Por exemplo, pode-se criar um novo campo chamado "admin "na tabela usuário  e definir o tipo de dado para TINYINT, que é similar ao tipo boolean(true ou false) só que em um ou zero. Onde o um é sim e zero é não.

 

Na hora da autenticação, verifica-se  a conta para definir  o tipo de usuário(admin ou usuário comum). Daria até para fazer sem o switch case. um simples teste de IF já servia OU até mesmo pelo próprio SQL dá para fazer a verificação com as condicionais.

 

Enfim... todas as informações já foram dadas. Não há mais o que tentar ensinar. 

  • Curtir 1
  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!