Ir para conteúdo

Arquivado

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

Luan Batista

[Resolvido] RETURN não funciona na função

Recommended Posts

E ai Galera! Estou com o seguinte problema. Criei uma classe para inserir os dados do usuário em um cadastro. Entretanto essa classe retornaria TRUE caso tudo estivesse OK ou FALSE caso desse um ERRO e em seguida com a função ShowError() eu capturaria o erro podendo exibir para o usuário, só que essa classe não esta retornando NADA nem mesmo o ShowErro.

 

Segue o código da classe.

 

<?php
// Classe responsável em manipular os precadastros

// Inclui a class de conexao
include_once("Conexao.class.php");

class Precadastro
{
// Variavel de erro
private $erros;
// Inicializa todas variaveis 
private $razao_social;
private $nome_fantasia;
private $cnpj;
private $nome_contato;
private $telefone;
private $email;

// Captura todos os dados enviados pelo formulario de précadastro
function SetRazaosocial($razao_social)  {if(isset($razao_social)) {$this->razao_social = $razao_social;  }else{$this->erros = "Preencha a Razão Social";}}
function SetNomefantasia($nome_fantasia){if(isset($nome_fantasia)){$this->nome_fantasia = $nome_fantasia;}else{$this->erros = "Preencha o Nome Fantasia";}}
function SetCnpj($cnpj)                 {if(isset($cnpj))         {$this->cnpj = $cnpj;                  }else{$this->erros = "Preencha o CNPJ";}}
function SetNomecontato($nome_contato)  {if(isset($nome_contato)) {$this->nome_contato = $nome_contato;  }else{$this->erros = "Preencha o Nome para contato";}}
function SetTelefone($telefone)         {if(isset($telefone))     {$this->telefone = $telefone;          }else{$this->erros = "Preencha o Telefone";}}
function SetEmail($email)               {if(isset($email))        {$this->email = $email;                }else{$this->erros = "Preencha o e-mail";}}
// Devolve todos os dados
function GetRazaosocial() {return $this->razao_social;}
function GetNomefantasia(){return $this->nome_fantasia;}
function GetCnpj()        {return $this->cnpj;}
function GetNomecontato() {return $this->nome_contato;}
function GetTelefone()    {return $this->telefone;}
function GetEmail()       {return $this->email;}

// Verifica se houve algum erro
function VerificaErro(){
	if(empty($this->erros)){return TRUE;}else{return FALSE;}
}
// Retorna oos erros encontrados
function ShowError(){
	return $this->erros;
}

// Insere o precadastro na base de dados
function Gravar(){
	// Testa verificar se todos os dados estão preenchidos
	if(!$this->VerificaErro()){
		// Caso houve algum erro
		return false;
	}else{
		// Dados a serem inseridos. Devem estar na mesma or que no bando de dados
		$dados = array($this->GetRazaosocial(), $this->GetNomefantasia(), $this->GetCnpj(), $this->GetNomecontato(), $this->GetTelefone(), $this->GetEmail());
		$sql = "INSERT INTO tbprecadastros VALUES(NULL, ?, ?, ?, ?, ?, ?)";
		try{
			// Tenta executar a instrução SQL
			$con = new Conexao;
			$query = $con->con->prepare($sql);
			$query->execute($dados);	
			return true;
		}catch(PDOException $e){
			// Retorna um erro caso houver
			$this->erros[] = $e->getMessage();
			return false;
		}
	}
}
}


?>

 

Caso precisem de mais detalhes estou a disposição, eu também serei útil para sanar dúvidas de outros usuários.

 

Ate mais! Vlww

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se você definiu

ini_set('display_errors', true);
ini_set('error_reporting', E_ALL | E_NOTICE);

 

Alguma coisa deve aparecer.

Sugiro que você troque o nome da função VerificaErro por haErro ou coisa parecida porque VerificaErro é muito confuso.

function haErro(){
   return empty($this->erros);
}

 

Ao utilizar o sinal de ?, os dados devem ser definidos na mesma ordem das colunas na tabela snão causa um erro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

$this->erros num teria que ser uma Array?

 

dessa forma se tiver 3 erros ele vai assumir apenas o ultimo erro (se eu não estiver enganado =X);

 

$this->erros['error'][] = 'erro 1';

 

e no metodo showError() faze um foreach();

 


function setLabel($label){

$this->label = $label;
return $this;}

//pode retorna o erro direto no getter.. ve oque rola 
function getLabel(){

if($this->label)
return $this->label;
else
return 'Erro aqui nesse label';
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

<?php
// Classe responsável em manipular os precadastros

// Inclui a class de conexao
include_once("Conexao.class.php");

class Precadastro
{
// Variavel de erro
private $erros;
// Inicializa todas variaveis 
private $razao_social;
private $nome_fantasia;
private $cnpj;
private $nome_contato;
private $telefone;
private $email;

// Captura todos os dados enviados pelo formulario de précadastro
function SetRazaosocial($razao_social)  {if(isset($razao_social)) {$this->razao_social = $razao_social;  }else{$this->erros = "Preencha a Razão Social";}}
function SetNomefantasia($nome_fantasia){if(isset($nome_fantasia)){$this->nome_fantasia = $nome_fantasia;}else{$this->erros = "Preencha o Nome Fantasia";}}
function SetCnpj($cnpj)                 {if(isset($cnpj))         {$this->cnpj = $cnpj;                  }else{$this->erros = "Preencha o CNPJ";}}
function SetNomecontato($nome_contato)  {if(isset($nome_contato)) {$this->nome_contato = $nome_contato;  }else{$this->erros = "Preencha o Nome para contato";}}
function SetTelefone($telefone)         {if(isset($telefone))     {$this->telefone = $telefone;          }else{$this->erros = "Preencha o Telefone";}}
function SetEmail($email)               {if(isset($email))        {$this->email = $email;                }else{$this->erros = "Preencha o e-mail";}}
// Devolve todos os dados
function GetRazaosocial() {return $this->razao_social;}
function GetNomefantasia(){return $this->nome_fantasia;}
function GetCnpj()        {return $this->cnpj;}
function GetNomecontato() {return $this->nome_contato;}
function GetTelefone()    {return $this->telefone;}
function GetEmail()       {return $this->email;}

// Verifica se houve algum erro
function VerificaErro(){
	if(empty($this->erros)){return TRUE;}else{return FALSE;}
}
// Retorna oos erros encontrados
function ShowError(){
	return $this->erros;
}

// Insere o precadastro na base de dados
function Gravar(){
	// Testa verificar se todos os dados estão preenchidos
	if(!$this->VerificaErro()){
		// Caso houve algum erro
		return false;
	}else{
		// Dados a serem inseridos. Devem estar na mesma or que no bando de dados
		$dados = array($this->GetRazaosocial(), $this->GetNomefantasia(), $this->GetCnpj(), $this->GetNomecontato(), $this->GetTelefone(), $this->GetEmail());
		$sql = "INSERT INTO tbprecadastros VALUES(NULL, ?, ?, ?, ?, ?, ?)";
		try{
			// Tenta executar a instrução SQL
			$con = new Conexao;
			$query = $con->con->prepare($sql);
			$query->execute($dados);	
			return true;
		}catch(PDOException $e){
			// Retorna um erro caso houver
			$this->erros[] = $e->getMessage();
			return false;
		}
	}
}
}


?>

 

brother... você fez o contrario...

você definiu a variavel errors cm array na saida só..

}catch(PDOException $e){
// Retorna um erro caso houver
$this->erros[] = $e->getMessage();
return false;
}

 

você tem que defini-la como array quando for declara-la lah em cima...

 

faça assim:

// Variavel de erro
private $erros = array();

 

e para usar o try...catch você tem que definir uma Exception...

 

try... catch eh lento em relação ao if...else... para aplicações relativamente pequenas... try... catch eh mais utilizado para aplicações maiores que necessitam ter uma varredura de erros... aconselho você a utilizar o classico if-else msmo, brother... mais se você quiser... continue no try...catch msmo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

brother... você fez o contrario...

você definiu a variavel errors cm array na saida só..

}catch(PDOException $e){
// Retorna um erro caso houver
$this->erros[] = $e->getMessage();
return false;
}

 

você tem que defini-la como array quando for declara-la lah em cima...

 

faça assim:

// Variavel de erro
private $erros = array();

Isso não influencia. Claro que o correto é inicializar o array na declaração da propriedade, mas não fazê-lo fará com que essa propriedade tenha o valor NULL.

 

E quando você "pendura" um para de colchetes vazios em uma variável, ela automaticamente se transforma num array.

 

e para usar o try...catch você tem que definir uma Exception...

Quem te disse isso? :huh:

 

Você não tem que definir uma Exception para usar try...catch(). Você apenas tem de especificar quais Exceptions você quer capturar (catch) e o que fazer com elas.

 

try... catch eh lento em relação ao if...else... para aplicações relativamente pequenas... try... catch eh mais utilizado para aplicações maiores que necessitam ter uma varredura de erros... aconselho você a utilizar o classico if-else msmo, brother... mais se você quiser... continue no try...catch msmo...

De fato usar try...catch() trará uma pequena perda de velocidade, afinal, se uma biblioteca ou componente disparar diversos tipos de Exceção e você precisar fazer algo diferente com cada uma delas, haverão diversos catch's.

 

Mas, a menos que você se utilize das SplExceptions e/ou de Exceptions similares à elas, isto é, uma classe de Exception diferente para cada pequeno tipo de erro, esse tipo de prática é raro de se ver.

 

Agora, para o autor do tópico:

 

Você REALMENTE precisa usar a PDO? Se sua aplicação não precisa mudar de banco de dados da noite pro dia, você não precisa dela.

 

Se sua aplicação PODE mudar de banco de dados mas o novo banco possui muitas particularidades quanto ao SQL, a PDO sozinho não vai ajudar em nada, afinal ela abstrai a interface e não o SQL usado em si.

 

Isso quer dizer que esse seu INSERT INTO... pode ter a sintaxe ligeiramente diferente em outro SGBD. E aPDO por iso só não vai consertar isso.

 

Se vai usar só MySQL, MySQLi é recomendada. :thumbsup:

 

Os seus return estão errados. Dentro do try o return não deve ser TRUE, deve ser aquilo que PDOStatement::execute() retorna.

 

Claro que esse método retorna apenas TRUE/FALSE, mas você não precisa definir isso manualmente.

 

Num mesmo contexto, você não precisa usar seus accessors. O método gravar está na mesma classe que as propriedades que você resgata através dos métodos, logo a visibilidade private não é um problema.

 

Pelo contrário. No mesmo escopo de Precadastro, você acessar as propriedades através de métodos trará lentidão, pois o interpretador terá um passo a mais para executar.

 

Consertando isso, poste a forma como você está utilizando essa classe. Também influencia no resultado obtido.

Compartilhar este post


Link para o post
Compartilhar em outros sites

E ai Galera, boas noticias! O problema já está solucionado.

 

Na verdade o que realmente estava dando erro era o ISSET ao invés do usso do !EMPTY. Por que na verdade quando o usuario não preenchia algum campo a pagina que chama a classe atribui NULL invertendo toda a lógica da validação da classe.

 

segue o arquivo que chama a classe

 

<?php
// inclue as classes necessárias aqui
include_once('../classes/Precadastro.class.php');

// Inicializa todas variaveis
$razao_social  = NULL;
$nome_fantasia = NULL;
$cnpj          = NULL;
$nome_contato  = NULL;
$telefone      = NULL;
$email         = NULL;

// Captura todos os dados enviados pelo formulario de précadastro
if(isset($_POST['razao_social'])) {$razao_social  = $_POST['razao_social'];}
if(isset($_POST['nome_fantasia'])){$nome_fantasia = $_POST['nome_fantasia'];}
if(isset($_POST['cnpj']))         {$cnpj          = $_POST['cnpj'];}
if(isset($_POST['nome_contato'])) {$nome_contato  = $_POST['nome_contato'];}
if(isset($_POST['telefone']))     {$telefone      = $_POST['telefone'];}
if(isset($_POST['email']))        {$email         = $_POST['email'];}

// Caso todos os campos estam preenchidos
$pre = new Precadastro;
$pre->SetRazaosocial($razao_social);	
$pre->SetNomefantasia($nome_fantasia);
$pre->SetCnpj($cnpj);
$pre->SetNomecontato($nome_contato);
$pre->SetTelefone($telefone);
$pre->SetEmail($email);
// Captura o return caso for FALSE é porq teve algum erro
if($pre->Gravar()){
   // Ainda não faz nada!
}else{
echo $pre->showErro();
} 

?>

 

e agora a classe que era chamada

 

<?php
// Classe responsável em manipular os precadastros

// Inclui a class de conexao
include_once("Conexao.class.php");

class Precadastro
{
// Variavel de erro
private $erros;
// Inicializa todas variaveis 
private $razao_social;
private $nome_fantasia;
private $cnpj;
private $nome_contato;
private $telefone;
private $email;

// Captura todos os dados enviados pelo formulario de précadastro
function SetRazaosocial($razao_social)  {if(!empty($razao_social)) {$this->razao_social = $razao_social;  }else{$this->erros = "Preencha a Razão Social";}}
function SetNomefantasia($nome_fantasia){if(!empty($nome_fantasia)){$this->nome_fantasia = $nome_fantasia;}else{$this->erros = "Preencha o Nome Fantasia";}}
function SetCnpj($cnpj)                 {if(!empty($cnpj))         {$this->cnpj = $cnpj;                  }else{$this->erros = "Preencha o CNPJ";}}
function SetNomecontato($nome_contato)  {if(!empty($nome_contato)) {$this->nome_contato = $nome_contato;  }else{$this->erros = "Preencha o Nome para contato";}}
function SetTelefone($telefone)         {if(!empty($telefone))     {$this->telefone = $telefone;          }else{$this->erros = "Preencha o Telefone";}}
function SetEmail($email)               {if(!empty($email))        {$this->email = $email;                }else{$this->erros = "Preencha o e-mail";}}
// Devolve todos os dados
function GetRazaosocial() {return $this->razao_social;}
function GetNomefantasia(){return $this->nome_fantasia;}
function GetCnpj()        {return $this->cnpj;}
function GetNomecontato() {return $this->nome_contato;}
function GetTelefone()    {return $this->telefone;}
function GetEmail()       {return $this->email;}

// Função que verifica se houve erros
function haErros(){
	if(!empty($this->erros)){
		return true;
	}else{
		return false;
	}
}

function showErro(){
	return $this->erros;
}

// Insere o precadastro na base de dados
function Gravar(){
	if($this->haErros()){
		return false;
	}else{
		// Dados a serem inseridos. Devem estar na mesma or que no bando de dados
		$dados = array($this->razao_social, $this->nome_fantasia, $this->cnpj, $this->nome_contato, $this->telefone, $this->email);
		$sql = "INSERT INTO tbprecadastro VALUES(NULL, ?, ?, ?, ?, ?, ?)";
		// Tenta executar a instrução SQL
		$con = new Conexao;
		$query = $con->con->prepare($sql);
		// Retorna TRUE se estiver tudo OK or FALSE caso der erro
		return $query->execute($dados);
	}
}
}


?>

 

Agora esta certinho.

 

Agradeço a todos pelas ajudas e pelas dicas. É muito bom saber que ainda têm pessoas que ajudam as outras!

 

Desculpem a demora para responder.. Fim de ano na facul ta tenso! kk

 

Qualquer coisa é só perguntar!

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.