DinhoPHP 1 Denunciar post Postado Dezembro 20, 2014 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 18Fatal 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
marcelobbt 7 Denunciar post Postado Dezembro 20, 2014 Na parte if(isset($insertseguro)) troque a variável por $validar. Esta que precisa verificar. Compartilhar este post Link para o post Compartilhar em outros sites
Fernando C 128 Denunciar post Postado Dezembro 20, 2014 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: http://www.devmedia.com.br/introducao-ao-php-pdo/24973 http://www.rafaelwendel.com/2011/12/tutorial-pdo-php-data-object/ Compartilhar este post Link para o post Compartilhar em outros sites
Electronic 124 Denunciar post Postado Dezembro 20, 2014 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
DinhoPHP 1 Denunciar post Postado Dezembro 20, 2014 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: http://www.devmedia.com.br/introducao-ao-php-pdo/24973 http://www.rafaelwendel.com/2011/12/tutorial-pdo-php-data-object/ 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: HELLONotice: Undefined variable: pdo in D:\EasyPHP-DevServer-14.1VC11\data\localweb\sites\ieadr_2013\classes\cadastro.class.php on line 12Fatal 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
marcelobbt 7 Denunciar post Postado Dezembro 20, 2014 É como o Electronic falou. Onde você declara que a variável "$PDO = new PDO;"? Compartilhar este post Link para o post Compartilhar em outros sites
DinhoPHP 1 Denunciar post Postado Dezembro 20, 2014 É 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
DinhoPHP 1 Denunciar post Postado Dezembro 20, 2014 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
Electronic 124 Denunciar post Postado Dezembro 20, 2014 VALUES(:nome, :email, :nascimento, :senha, 1,1)"); não faltou o status nessa parte? Compartilhar este post Link para o post Compartilhar em outros sites
DinhoPHP 1 Denunciar post Postado Dezembro 20, 2014 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
Electronic 124 Denunciar post Postado Dezembro 20, 2014 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
DinhoPHP 1 Denunciar post Postado Dezembro 20, 2014 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
Electronic 124 Denunciar post Postado Dezembro 20, 2014 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
DinhoPHP 1 Denunciar post Postado Dezembro 20, 2014 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
Electronic 124 Denunciar post Postado Dezembro 20, 2014 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
DinhoPHP 1 Denunciar post Postado Dezembro 20, 2014 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
Electronic 124 Denunciar post Postado Dezembro 20, 2014 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
DinhoPHP 1 Denunciar post Postado Dezembro 21, 2014 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