Ir para conteúdo

Arquivado

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

DinhoPHP

Sistema de Cadastro&Login PHP com PDO

Recommended Posts

Olá programadores!

Sou novo aqui e resolvi usar este fórum porque a minha dúvida chegou ao limite. Vi um sistema de login no Youtube que me atraiu, porém, ele não está em fazendo uso da classe PDO do PHP, e eu estou tentando realizar essa transição; onde consegui efetuar a conexão com o banco de dados, mas ao cadastrar o cliente dá erro...

Notice: Undefined variable: pdo in D:\EasyPHP-DevServer-14.1VC11\data\localweb\sites\ieadr_2013\classes\cadastro.class.php on line 18

Fatal error: Call to a member function prepare() on a non-object in D:\EasyPHP-DevServer-14.1VC11\data\localweb\sites\ieadr_2013\classes\cadastro.class.php on line 18

O único erro é não inserir os dados, todo o restante funciona normalmente!

Segue o código e desde já agradeço à todos!

nome do arquivo: cadastro.class.php

<?php
class Cadastro{
public function cadastrar($nome, $email, $senha){
echo"HELLO";
//TRATAMENTO DAS VARIÁVEIS
$nome=ucwords(strtolower($nome));
$email=($email);
$senha=sha1($senha."IEADR");
/*Captura o Banco de Dados
$nome=$_GET["nome"];
$email=$_GET["email"];
$nascimento=$_GET["nascimento"];
$senha=$_GET["senha"];
$nivel=$_GET["nivel"];
$status=$_GET["status"];*/
 
//INSERÇÃO NO BANCO DE DADOS
$insertseguro=$pdo->prepare("INSERT INTO usuarios(nome, email, nascimento, senha, nivel, status)VALUES(:nome, :email, :nasimento, :senha, 1,1)");
$insertseguro->bindValue(":nome",$nome,PDO::PARAM_STR);
$insertseguro->bindValue(":email",$email,PDO::PARAM_STR);
$insertseguro->bindValue(":nascimento",$nascimento,PDO::PARAM_STR);
$insertseguro->bindValue(":senha",$senha,PDO::PARAM_STR);
$insertseguro->bindValue(":nivel",$nivel,PDO::PARAM_STR);
$insertseguro->bindValue(":status",$status,PDO::PARAM_STR);
 
//Executa o cadastro
$insertseguro->execute();
/*VALIDA
$validar=$pdo->prepare("SELECT * FROM usuarios WHERE nome=? AND email=? AND nascimento=? AND senha=?");
$validar->execute(array($nome));
$validar->execute(array($email));
$validar->execute(array($nascimento));
$validar->execute(array($senha));*/
 
if(isset($insertseguro)){
$flash="Cadastro realizado com sucesso!";
}
else{
$flash="Houve um erro em nosso sistema, contacte o administrador!";
       }
   }
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

na sql:

 

VALUES(:nome, :email, :nasimento, :senha, 1,1)");

 

está faltando uma letra..
(dica: "nascimento")...

de resto, há muitas variaveis não definidas (pdo, por exemplo)..

esse bloco, por exemplo:

 

/*Captura o Banco de Dados
$nome=$_GET["nome"];
$email=$_GET["email"];
$nascimento=$_GET["nascimento"];
$senha=$_GET["senha"];
$nivel=$_GET["nivel"];
$status=$_GET["status"];*/

 

não "Captura Banco de Dados".. na verdade, esse bloco todo, do jeito que está, não faz nada.. pesquise sobre comentários..
Dicas boas sobre PDO:

Compartilhar este post


Link para o post
Compartilhar em outros sites

alem do que ja te disseram,

 

a mensagem esta clara

Undefined variable: pdo

vc definiu corretamente a variável $pdo?

o segundo erro se dá devido a o primeiro

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desde já, agradeço a dica dos dois. Mas Fernando C, os comentários foram propositais para preservar a estrutura anterior, ou seja, sem o PDO. Retornarei com a resposta.


Eletronic, concordo plenamente na coerência da mensagem, só que como citei, o que estou alterando na estrutura é substituição pelo PDO. A variável está sendo declarada no arquivo conexao_adm_restrito.php desta maneira:

 

<?php
//CONEXÃO COM O BANCO DE DADOS
try{
$pdo=new PDO("mysql:host=localhost;dbname=login","root","");
}
catch(PDOException $e){
echo $e->getMessage();
}
return $pdo;
?>
também já tentei declara-la dentro do mesmo arquivo.

Na parte if(isset($insertseguro)) troque a variável por $validar. Esta que precisa verificar.

 

 

 

na sql:

 

 

está faltando uma letra..
(dica: "nascimento")...

de resto, há muitas variaveis não definidas (pdo, por exemplo)..

esse bloco, por exemplo:

 

 

não "Captura Banco de Dados".. na verdade, esse bloco todo, do jeito que está, não faz nada.. pesquise sobre comentários..
Dicas boas sobre PDO:

 

Fiz o que o Marcelobbt e oFernando C sugeriram, mas continua co o mesmo erro.

 

O código segue assim: (Desconsidere coisas como: echo"HELLO"; pois foi apenas para ver se o arquivo era realmente carregado kkkk)

 

erro:

HELLO
Notice: Undefined variable: pdo in D:\EasyPHP-DevServer-14.1VC11\data\localweb\sites\ieadr_2013\classes\cadastro.class.php on line 12

Fatal error: Call to a member function prepare() on a non-object in D:\EasyPHP-DevServer-14.1VC11\data\localweb\sites\ieadr_2013\classes\cadastro.class.php on line 12

 

<?php
include"conexao_adm_restrito.php";
class Cadastro{
public function cadastrar($nome, $email, $senha){
echo"HELLO";
//TRATAMENTO DAS VARIÁVEIS
$nome=ucwords(strtolower($nome));
$email=($email);
$senha=sha1($senha."IEADR");
//INSERÇÃO NO BANCO DE DADOS
(ERRO PRESENTE NESTA LINHA) $insertseguro=$pdo->prepare("INSERT INTO usuarios(nome, email, nascimento, senha, nivel, status)VALUES(:nome, :email, :nascimento, :senha, 1,1)");
$insertseguro->bindValue(":nome",$nome,PDO::PARAM_STR);
$insertseguro->bindValue(":email",$email,PDO::PARAM_STR);
$insertseguro->bindValue(":nascimento",$nascimento,PDO::PARAM_STR);
$insertseguro->bindValue(":senha",$senha,PDO::PARAM_STR);
$insertseguro->bindValue(":nivel",$nivel,PDO::PARAM_STR);
$insertseguro->bindValue(":status",$status,PDO::PARAM_STR);
//Executa o cadastro
$insertseguro->execute();
//Valida o cadastro
$validar=$pdo->prepare("SELECT * FROM usuarios WHERE nome=? AND email=? AND nascimento=? AND senha=?");
$validar->execute(array($nome));
$validar->execute(array($email));
$validar->execute(array($nascimento));
$validar->execute(array($senha));
if(isset($validar)){
$flash="Cadastro realizado com sucesso!";
}
else{
$flash="Houve um erro em nosso sistema, contacte o administrador!";
}
}
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

É como o Electronic falou.

 

Onde você declara que a variável "$PDO = new PDO;"?

No arquivo conexão_adm_resttrito.php assim:

 

<?php
//CONEXÃO COM O BANCO DE DADOS
try{
$pdo=new PDO("mysql:host=localhost;dbname=login","root","");
}
catch(PDOException $e){
echo $e->getMessage();
}
return $pdo;
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alterei o código e agora a mensagem é a seguinte:

 

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens' in D:\EasyPHP-DevServer-14.1VC11\data\localweb\sites\ieadr_2013\classes\cadastro.class.php:19 Stack trace: #0 D:\EasyPHP-DevServer-14.1VC11\data\localweb\sites\ieadr_2013\classes\cadastro.class.php(19): PDOStatement->execute() #1 D:\EasyPHP-DevServer-14.1VC11\data\localweb\sites\ieadr_2013\acao.php(34): Cadastro->cadastrar('Ana L?cia', 'analucy@oi.com....', '777777777777777...') #2 D:\EasyPHP-DevServer-14.1VC11\data\localweb\sites\ieadr_2013\cadastro.php(3): include('D:\EasyPHP-DevS...') #3 {main} thrown in D:\EasyPHP-DevServer-14.1VC11\data\localweb\sites\ieadr_2013\classes\cadastro.class.php on line 19

 

Acredito que piorou né?! kkkkkkkkkkkkk

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aff! Agradecido pela ajuda de todos, mas já estou ficando chateado. Interessante que inserção e busca com PDO eu já tinha feito antes. Vou analisar o código e postarei o resultado aqui. Preciso disso pra Janeiro.


Eu eliminei o nível e status.

ERRO:

 

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens' in D:\EasyPHP-DevServer-14.1VC11\data\localweb\sites\ieadr_2013\classes\cadastro.class.php:19 Stack trace: #0 D:\EasyPHP-DevServer-14.1VC11\data\localweb\sites\ieadr_2013\classes\cadastro.class.php(19): PDOStatement->execute() #1 D:\EasyPHP-DevServer-14.1VC11\data\localweb\sites\ieadr_2013\acao.php(33): Cadastro->cadastrar('Ana L?cia', 'analucy@oi.com....', '777777777777777...') #2 D:\EasyPHP-DevServer-14.1VC11\data\localweb\sites\ieadr_2013\cadastro.php(3): include('D:\EasyPHP-DevS...') #3 {main} thrown in D:\EasyPHP-DevServer-14.1VC11\data\localweb\sites\ieadr_2013\classes\cadastro.class.php on line 19

 

CÓDIGO ATUAL:

 

<?php

include"DB3.php";
class Cadastro{
public function cadastrar($nome, $email, $senha){
echo"HELLO";
//TRATAMENTO DAS VARIÁVEIS
$nome=ucwords(strtolower($_POST['nome']));
$email=$_POST['email'];
$senha=$_POST['senha'];
//INSERÇÃO NO BANCO DE DADOS
$sql='INSERT INTO usuarios(nome, email, nascimento, senha)VALUES(:nome, :email, :nascimento, :senha)';
$insertseguro=DB::prepare($sql);
$insertseguro->bindValue(":nome",$nome,PDO::PARAM_STR);
$insertseguro->bindValue(":email",$email,PDO::PARAM_STR);
$insertseguro->bindValue(":senha",$senha,PDO::PARAM_STR);
//Executa o cadastro
$insertseguro->execute();
/*/Valida o cadastro
$sql2='SELECT * FROM usuarios WHERE nome=? AND email=? AND nascimento=? AND senha=?';
$validar=DB::prepare($sql2);
$validar->execute(array($nome));
$validar->execute(array($email));
$validar->execute(array($senha));*/
if(isset($insertseguro)){
$flash="Cadastro realizado com sucesso!";
}
else{
$flash="Houve um erro em nosso sistema, contacte o administrador!";
}
}
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aff! Agradecido pela ajuda de todos, mas já estou ficando chateado. Interessante que inserção e busca com PDO eu já tinha feito antes. Vou analisar o código e postarei o resultado aqui. Preciso disso pra Janeiro.

 

cara vc leu o que postei?

seria bom vc dar o feedback

 

olha o que vc fez:

 

quer inserir 6 campos

"INSERT INTO usuarios(nome, email, nascimento, senha, nivel, status)

mas só informou 5

VALUES(:nome, :email, :nascimento, :senha, 1,1)"); --cade o nível?

e fez 6 bindValues

$insertseguro->bindValue(":nome",$nome,PDO::PARAM_STR);
$insertseguro->bindValue(":email",$email,PDO::PARAM_STR);
$insertseguro->bindValue(":nascimento",$nascimento,PDO::PARAM_STR);
$insertseguro->bindValue(":senha",$senha,PDO::PARAM_STR);
$insertseguro->bindValue(":nivel",$nivel,PDO::PARAM_STR);
$insertseguro->bindValue(":status",$status,PDO::PARAM_STR);

atribuiu $status a :status, más não colocou :status na sua query;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim Eletronic, só que no original estava assim, achei que alterar daria problema. Mas como disse, eliminei o NÍVEL e STATUS até do Banco de dados agora e exibe a mensagem:

 

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens' in D:\EasyPHP-DevServer-14.1VC11\data\localweb\sites\ieadr_2013\classes\cadastro.class.php:19 Stack trace: #0 D:\EasyPHP-DevServer-14.1VC11\data\localweb\sites\ieadr_2013\classes\cadastro.class.php(19): PDOStatement->execute() #1 D:\EasyPHP-DevServer-14.1VC11\data\localweb\sites\ieadr_2013\acao.php(33): Cadastro->cadastrar('Ana L?cia', 'analucy@oi.com....', '77777777777777') #2 D:\EasyPHP-DevServer-14.1VC11\data\localweb\sites\ieadr_2013\cadastro.php(3): include('D:\EasyPHP-DevS...') #3 {main} thrown in D:\EasyPHP-DevServer-14.1VC11\data\localweb\sites\ieadr_2013\classes\cadastro.class.php on line 19

 

No vídeo, segundo o cara, nível e status seriam setados através de números

Deixei boa parte no arquivo acao.php Que agora gera apenas uma linha de erro:

 

ERRO:

Fatal error: Call to a member function prepare() on a non-object in D:\EasyPHP-DevServer-14.1VC11\data\localweb\sites\ieadr_2013\acao.php on line 36

 

CÓDIGO:

<?php
$startaction="";
$mensagem="";
if(isset($_GET["acao"])){
$acao=$_GET["acao"];
$startaction=1;
}
//MÉTODO DE CADASTRO
if($startaction==1){
if($acao=="cadastrar"){
$nome=utf8_decode($_POST["nome"]);
$email=$_POST["email"];
$senha=$_POST["senha"];
if(empty($nome)|| empty($email)|| empty($senha)){
$mensagem="Por favor. preencha todos os campos!";}
//TODOS OS CAMPOS PREENCHIDOS
else{
//E-MAIL VÁLIDO
if(filter_var($email,FILTER_VALIDATE_EMAIL))
{
//SENHA INVÁLIDA
if(strlen($senha)<8){
$mensagem="A senha deve ter no mínimo oito caracteres!";
}
//SENHA VÁLIDA
else{
//EXECUTA A CLASSE DO CADASTRO
//TRATAMENTO DAS VARIÁVEIS
$nome=ucwords(strtolower($nome));
$email=($email);
$senha=sha1($senha);
//INSERÇÃO NO BANCO DE DADOS
$sql='INSERT INTO usuarios(nome, email, nascimento, senha)VALUES(:nome, :email, :nascimento, :senha)';
$insertseguro=$sql->prepare(); <=ERRO NESTA LINHA
$insertseguro->bindValue(":nome",$nome,PDO::PARAM_STR);
$insertseguro->bindValue(":email",$email,PDO::PARAM_STR);
$insertseguro->bindValue(":senha",$senha,PDO::PARAM_STR);
//Executa o cadastro
$insertseguro->execute();
echo"FUNCIONA!";
}
}
//E-MAIL INVÁLIDO
else{
$mensagem="Digite seu e-mail corretamente!";
}
}
}
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

por isso o erro

 

se vc tirou até do banco, então tem que tirar da programação se não da erro mesmo

essa colunas se não existe no seu banco então pra que essas linhas?

$insertseguro->bindValue(":nivel",$nivel,PDO::PARAM_STR);
$insertseguro->bindValue(":status",$status,PDO::PARAM_STR);

e aqui tambem - nivel e status, nao tem na sua tabela

"INSERT INTO usuarios(nome, email, nascimento, senha, nivel, status)

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

por isso o erro

 

se você tirou até do banco, então tem que tirar da programação se não da erro mesmo

essa colunas se não existe no seu banco então pra que essas linhas?

$insertseguro->bindValue(":nivel",$nivel,PDO::PARAM_STR);
$insertseguro->bindValue(":status",$status,PDO::PARAM_STR);

e aqui tambem - nivel e status, nao tem na sua tabela

"INSERT INTO usuarios(nome, email, nascimento, senha, nivel, status)

Não mano, eles sempre existiram, tanto na tabela como no código, só que como me stressei (kkkkkkkk) os eliminei de ambos. Entendido?! :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

entendi

mas ainda ta cometendo o mesmo erro

 

quer inserir em 4 colunas

$sql='INSERT INTO usuarios(nome, email, nascimento, senha)VALUES(:nome, :email, :nascimento, :senha)';

mas só informou 3

$insertseguro->bindValue(":nome",$nome,PDO::PARAM_STR);
$insertseguro->bindValue(":email",$email,PDO::PARAM_STR);
$insertseguro->bindValue(":senha",$senha,PDO::PARAM_STR);

Compartilhar este post


Link para o post
Compartilhar em outros sites

GLÓRIA DEUSSSSSSSSSSSSSSSS!!!!!!!!!!!!

Muito obrigado à cada um de vocês! De coração e com toda sinceridade!!!!! Pedindo também minhas sinceras desculpas com meus tropeços! Agradeço pelos alertas no erro das digitações, que realmente foi o desencadeamento da maioria dos problemas!

Como disse desde o início deste tópico, eu estava alterando um código em MySQL para PDO, o sistema "chamava" muitos arquivos, decidi diminuir esse número unificando, uma vez que havia me perdido nas declarações dos arquivos já criados.

Agora seguirei com a parte de não cadastrar dois cadastros iguais :D Espero não dar à vocês, uma nova dor de cabeça. kkkkkkkkkkkkkkkkkkkkkkk Abraço e Deus abençoe à todos!

 

Eis o código que funcionou perfeitamente:

 

<?php
$startaction="";
$mensagem="";
if(isset($_GET["acao"])){
$acao=$_GET["acao"];
$startaction=1;
}
//MÉTODO DE CADASTRO
if($startaction==1){
if($acao=="cadastrar"){
$nome=utf8_decode($_POST["nome"]);
$email=$_POST["email"];
$senha=$_POST["senha"];
if(empty($nome)|| empty($email)|| empty($senha)){
$mensagem="Por favor. preencha todos os campos!";}
//TODOS OS CAMPOS PREENCHIDOS
else{
//E-MAIL VÁLIDO
if(filter_var($email,FILTER_VALIDATE_EMAIL))
{
//SENHA INVÁLIDA
if(strlen($senha)<8){
$mensagem="A senha deve ter no mínimo oito caracteres!";
}
//SENHA VÁLIDA
else{
//EXECUTA A CLASSE DO CADASTRO
//TRATAMENTO DAS VARIÁVEIS
$nome=ucwords(strtolower($nome));
$email=($email);
$senha=sha1($senha);
//INSERÇÃO NO BANCO DE DADOS
$insertseguro=$pdo->prepare("INSERT INTO usuarios(nome, email, senha)VALUES(:nome, :email, :senha)");
$insertseguro->bindValue(":nome",$nome,PDO::PARAM_STR);
$insertseguro->bindValue(":email",$email,PDO::PARAM_STR);
$insertseguro->bindValue(":senha",$senha,PDO::PARAM_STR);
//Executa o cadastro
$insertseguro->execute();
echo"FUNCIONA!";
}
}
//E-MAIL INVÁLIDO
else{
$mensagem="Digite seu e-mail corretamente!";
}
}
}
}
?>

 

entendi

mas ainda ta cometendo o mesmo erro

 

quer inserir em 4 colunas

$sql='INSERT INTO usuarios(nome, email, nascimento, senha)VALUES(:nome, :email, :nascimento, :senha)';

mas só informou 3

$insertseguro->bindValue(":nome",$nome,PDO::PARAM_STR);
$insertseguro->bindValue(":email",$email,PDO::PARAM_STR);
$insertseguro->bindValue(":senha",$senha,PDO::PARAM_STR);

VLW! Eletronic, mas admiti isso na resposta final. :natalbiggrin:

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim postei isso 2 vezes #11 e #15 o numero de parâmetros bate

 

isso é falta de prestar atenção na mensagem de erro:

a mensagem esta clara

number of bound variables does not match number of tokens

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, mas os ping pongs do programador anterior me deixaram loucos de uns quatro arquivos pra login, só separei a configuração da conexão. Se fosse meu à partir do zero, eu entenderia melhor. Não me sinto bem pegar códigos e modificá-los, mas a necessidade pede. rs Gostei desse fórum, aqui há respostas.

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.