Jump to content
Sign in to follow this  
Mateus Silva

Erro No Pdo

Recommended Posts

seguinte, to fazendo um sistema e ele tá dando um erro na classe do banco de dados, onde eu tento usar o prepare() ele diz que to chamando um método de um não objeto, não sei o que pode ser, enfim, vou deixar as classes:

Model.class.php

<?php
namespace system;
use \system\DB;
Class Model {
	private $conn;
	protected $table;
	public $error;
	public function __construct(){
		$this->conn = DB::init();
	}
	public function setTable($table){
		$this->table = $table;
	}
	private function buildInsert(array $data){
		$columns = null;
		$values = null;
		foreach($data AS $key => $value):
			$columns .= "{$key},";
			$values .= '?,';
		endforeach;
		$columns = (substr($columns, -1) == ',') ? trim(substr($columns, 0, (strlen($columns) -1))) : $columns;
		$values = (substr($values, -1) == ',') ? trim(substr($values, 0, (strlen($values) -1))) : $values;
        $query = "INSERT INTO {$this->table}({$columns}) VALUES({$values})";
        return trim($query);
	}
	private function buildUpdate(array $data, array $condition, $operator = '='){
		$fields = null;
		foreach($data AS $key => $value):
			$fields .= "{$key} = ?,";
		endforeach;
		$where = null;
		foreach($condition AS $key => $value):
			$where .= "{$key} {$operator} ? AND ";
		endforeach;
		$fields = (substr($fields, -1) == ',') ? trim(substr($fields, 0, (strlen($fields) -1))) : $fields;
		$where = (substr($where, -4) == 'AND ') ? trim(substr($where, 0, (strlen($where) -4))) : $where;
		$query = "UPDATE {$this->table} SET {$fields} WHERE {$where}";
		return trim($query);
	}
	private function buildDelete(array $condition, $operator = '='){
		$where = null;
		foreach($condition AS $key => $value):
			$where .= "{$key} {$operator} ? AND ";
		endforeach;
		$where = (substr($where, -4) == 'AND ') ? trim(substr($where, 0, (strlen($where) -4))) : $where;
		$query = "DELETE FROM {$this->table} WHERE {$where}";
		return trim($query);
	}
	public function insert(array $data){
		try {
			$sql = $this->conn->prepare($this->buildInsert($data));
			$count = 1;
			foreach($data AS $value):
				$type = (is_numeric($value)) ? PDO::PARAM_INT : PDO::PARAM_STR;
				$sql->bindValue($count, $value, $type);
				$count++;
			endforeach;
			return $sql->execute();
		}catch(PDOException $e){
			echo "Erro: {$e->getMessage()}";
		}
	}
	public function update(array $data, array $where){
		try {
			$sql = $this->conn->prepare($this->buildUpdate($data, $where));
			$count = 1;
			foreach($data AS $value):
				$type = (is_numeric($value)) ? PDO::PARAM_INT : PDO::PARAM_STR;
				$sql->bindValue($count, $value, $type);
				$count++;
			endforeach;
			foreach($where AS $value):
				$type = (is_numeric($value)) ? PDO::PARAM_INT : PDO::PARAM_STR;
				$sql->bindValue($count, $value, $type);
				$count++;
			endforeach;
			return $sql->execute();
		}catch(PDOException $e){
			echo "Erro: {$e->getMessage()}";
		}
	}
	public function delete(array $where){
		try {
			$sql = $this->conn->prepare($this->buildDelete($where));
			$count = 1;
			foreach($where AS $value):
				$type = (is_numeric($value)) ? PDO::PARAM_INT : PDO::PARAM_STR;
				$sql->bindValue($count, $value, $type);
				$count++;
			endforeach;
			return $sql->execute();
		}catch(PDOException $e){
			echo "Erro: {$e->getMessage()}";
		}
	}
	public function generic($query, $params = false, $all = true){
		try {
			$sql = $this->conn->prepare($query);
			if($params):
				$count = 1;
				foreach($params AS $value):
					$type = (is_numeric($value)) ? PDO::PARAM_INT : PDO::PARAM_STR;
					$sql->bindValue($count, $value, $type);
					$count++;
				endforeach;
			endif;
			$sql->execute();
			if($all)
				return $sql->fetchAll(PDO::FETCH_OBJ);
			else
				return $sql->fetch(PDO::FETCH_OBJ);
		}catch(PDOException $e){
			echo "Erro: {$e->getMessage()}";
		}
	}
}
?>

DB.class.php

<?php
namespace system;
class DB {
	private static $conn;
	public static function init(){
		if(is_null(self::$conn)):
			try {
				self::$conn = new \PDO(DSN, USER, PASS);
			}catch(PDOException $e){
				echo "Erro ao conectar com o banco de dados: {$e->getMessage()}";
			}
		endif;
		return self::$conn;
	}
}
?>

me ajudem, pfv :s

Share this post


Link to post
Share on other sites

Mas amigo, o objeto statico ali só guarda o PDO, é o mesmo que se eu fizesse:

$pdo = DB::init();
$pdo->query();
// OU
DB::init()->query();

não consigo resolver esse problema de jeito nenhum! o erro que retorna é:

 

Fatal error: Call to a member function prepare() on a non object in Model.class.php on line 102.

E a linha 102 do Model.class.php:

$sql = $this->conn->prepare($query);

Eu acredito que o que ta rolando é que a $conn não está armazenando o pdo, alguem consegue me dar uma luz?

Share this post


Link to post
Share on other sites

O possível problema está no método init(), você está seguindo o fluxo normal do sistema caso haja um problema de conexão.

 

Ao invés de dar um echo, lance a exception.

try {
    self::$conn = new \PDO(DSN, USER, PASS);
} catch(PDOException $e){
    throw new \RuntimeException("Erro ao conectar com o banco de dados: {$e->getMessage()}" , 0 , $e);
} 
O que provavelmente está acontecendo é a não conexão com o banco de dados e a continuação do fluxo normal retornando o conteúdo existente da propriedade estática self::$conn, Que por defualt seu valor inicial é null.

Share this post


Link to post
Share on other sites

Qual é o contexto que essa função está sendo executada? Como é o fluxo de execução, e os códigos, até a chamada que ocorre o erro?

Share this post


Link to post
Share on other sites

Outra coisa que eu notei, talvez seja o erro, o autoload está tentando incluir a classe PDO:

D1DNxf0.png

 

autoload.php

spl_autoload_register(function($class){
	$class = MAIN_DIR.PATH.DIRECTORY_SEPARATOR.str_replace('\\', DIRECTORY_SEPARATOR, $class).'.class.php';
	if(file_exists($class)):
		require_once($class);
	else:
		throw new Exception("Error: Classe {$class} não encontrada", 1);
	endif; 	
});

Share this post


Link to post
Share on other sites

Então, to usando ela no Login do sistema, segue script:

namespace system\helpers;
use \system\Model, \system\helpers\Utils, \system\helpers\Bcrypt;
class Login extends Model{
	protected $table = "wb_users";
	private $login, $password;
	public function __construct($login, $password){
		$this->login = Utils::inject($login);
		$this->password = Utils::inject($password);
	}
	private function isEmpty(){
		return (empty($this->login) OR empty($this->password)) ? true : false;
	}
	public function check(){
		if($this->isEmpty()):
			return false;
		else:
			$check_login = $this->generic("SELECT id, login, senha FROM {$this->table} WHERE login = ?", array($this->login));
			if($check_login):
				echo "Tem usuario";
			else:
				echo "Usuário nao encontrado";
			endif;
		endif;
	}
}

Share this post


Link to post
Share on other sites

Fiz uma mudança, tirei o Extends e instanciei a classe Model dentro do metodo, ficou assim:

$model = new Model();
			$check_login = $model->generic("SELECT id, login, senha FROM {$this->table} WHERE login = ?", array($this->login));

E o erro retornado foi:

Fatal error: Uncaught exception 'Exception' with message 'Error: Classe system\PDO.class.php não encontrada'

PS: Encurtei o caminho do arquivo.

 

Então o que eu acho que seja o problema é que o PHP não está reconhecendo a classe PDO como nativa, ele tá tentando achar uma classe que eu tenha criado com nome PDO!

Share this post


Link to post
Share on other sites

Então galera, fiz um teste com a classe DateTime, e quando não usei "\" ANTES do nome da classe, ele retornou o MESMO erro que o que está dando com o PDO, tentando incluir um arquivo chamado PDO.class.php, porém o PDO está com a \ antes do nome, não sei como corrigir! DDDDDDDDDDDDD:

Share this post


Link to post
Share on other sites

Bom, encontrei o erro de não instanciar a classe PDO.

Você estava usando assim:

class Login extends Model{

	public function __construct($login, $password){
		$this->login = Utils::inject($login);
		$this->password = Utils::inject($password);
	}


Uma vez que era o construct de Model o responsável por instanciar PDO, você estava sobreescrevendo (override) o método construct, então o construct da Classe pai não seria chamado, teria que deixar a chamada explícita:

public function __construct($login, $password){
    parent::__construct();    

    $this->login = Utils::inject($login);
    $this->password = Utils::inject($password);

Sobre o segundo problema, provavelmente não está instalada no servidor a bibliteoca PDO.

Share this post


Link to post
Share on other sites

fiz uns debugs, e vi que a $conn na classe Model.class.php está SIM recebendo a instancia do PDO.

O problema é esse:

Uncaught exception 'Exception' with message 'Error: Classe system\PDO.class.php não encontrada'

 

ele tá tentando incluir um arquivo com nome PDO.class.php mesmo usando a "\", como eu disse acima, alguem consegue ajudar?

Share this post


Link to post
Share on other sites

eaiiiii, então galera, depois de revirar e refazer o script 2 vezes, finalmente encontrei o problema e eles estava nesta linha:

$type = (is_numeric($value)) ? PDO::PARAM_INT : PDO::PARAM_STR;

eu não tinha adicionado a barra "\" antes deles, então o autoload estava os reconhecendo como classes normais, resolvi alterando a seguinte linha do Model.class.php

// Disso:
//use \system\DB;
// Para isso:
use \system\DB, \PDO;

sendo assim, problema resolvido! horas quebrando a cabeça pra algo tão simples, ahh esse php...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Similar Content

    • By Alex Dias
      Olá amigo, não sou usuário avançado, conseguir um código-fonte que lista arquivos de uma pasta no servidor, esses fontes listavam apenas os arquivos, daí eu dei uma incrementada nele para além dos arquivos ele listar também o tamanho do arquivo e a data da última modificação, segue ANEXO como ele está exibindo os resultados com perfeição.

      A minha dificuldade é que ele lista os arquivos da pasta por ordem alfabética de A a Z e eu gostaria muito que essa lista de arquivos fosse exibida por ordem de data de modificação decrescente, da mais atual para a mais antiga, e não estou conseguindo realizar essa tarefa, gostaria muito da ajuda dos amigos para solucionar esse ocorrido, desde já agradeço a ajuda de todos.

      Segue o código-fonte

       
      <?php //$diretorio = "D:\SERVIDOR-APACHE\PATRIMONIO TECNOLOGIA\images"; $diretorio = "/home/patrimonio/www/sites/default/files/ftpdata/download/Acesso Remoto"; //USADO PARA LISTAR OS ARQUIVOS DA PASTA $url = "sites/default/files/ftpdata/download/Acesso Remoto/"; // USADO PARA FAZER O LINK DE DOWNLOAD // abre o diretório $ponteiro = opendir($diretorio); // monta os vetores com os itens encontrados na pasta while ($nome_itens = readdir($ponteiro)) { $itens[] = $nome_itens; } // ordena o vetor de itens sort($itens); // percorre o vetor para fazer a separacao entre arquivos e pastas foreach ($itens as $listar) { // retira "./" e "../" para que retorne apenas pastas e arquivos if ($listar!="." && $listar!=".."){ // checa se o tipo de arquivo encontrado é uma pasta if (is_dir($listar)) { // caso VERDADEIRO adiciona o item à variável de pastas $pastas[]=$listar; } else{ // caso FALSO adiciona o item à variável de arquivos $arquivos[]=$listar; } } } // lista as pastas se houverem if ($pastas != "" ) { foreach($pastas as $listar){ print "";} } // lista os arquivos se houverem if ($arquivos != "") { foreach($arquivos as $listar){ //CONDICAO PARA NOMEAR EM BYTES, KB, MB, GB, TB $tamanho = filesize("$url/$listar"); $kb = "1024"; $mb = "1048576"; $gb = "1073741824"; $tb = "1099511627776"; if($tamanho<$kb){ $tamanho_resposta = ($tamanho." bytes"); }else if($tamanho>=$kb&&$tamanho<$mb){ $kilo = number_format($tamanho/$kb,2); $tamanho_resposta = ($kilo." KB"); }else if($tamanho>=$mb&&$tamanho<$gb){ $mega = number_format($tamanho/$mb,2); $tamanho_resposta = ($mega." MB"); }else if($tamanho>=$gb&&$tamanho<$tb){ $giga = number_format($tamanho/$gb,2); $tamanho_resposta = ($giga." GB"); } // FIM CONDICAO PARA NOMEAR EM BYTES, KB, MB, GB, TB // DATA DA ULTIMA MODIFICACAO $modificado = date("d/m/Y H:i:s", filemtime("$url/$listar"))."<br>"; // FIM DATA DA ULTIMA MODIFICACAO //echo"$modificado"; // FAZ A LISTA DE XIBICAO DOS AQRUIVOS DO DIRETORIO // FAZ A LISTA DE XIBICAO DOS AQRUIVOS DO DIRETORIO echo" <tr> <td width='438' height='30' bgcolor='#ffffff'><p><font size='2'>&nbsp;&nbsp;<a href='$url/$listar' target='_blank'>$listar</a></font></p></td> <td width='192' bgcolor='#ffffff'><p><font size='2'>&nbsp;&nbsp;$tamanho_resposta</font></p></td> <td width='340' bgcolor='#ffffff'><p><font size='2'>&nbsp;&nbsp;$modificado</font></p></td> <td width='202' bgcolor='#ffffff'><p align='center'><a href='$url/$listar' target='_blank'><img src='images/nuvem.jpg'/></a></p></td> </tr> "; } } else { echo "<p><font color='#ff0000' size='3'>Não há nenhum arquivo.</font><p><br>"; } echo"</table>" ?>  

    • By danicarla
      Oi gente.. tenho uma tabela de endereços e uso php para fazer dois loops para exibir as cidades e depois os bairros daquela cidade,
      fica algo + ou - assim:
      $a = mysql_query('SELECT nome_cidade FROM tab GROUP BY nome_cidade'); while($b = mysql_fetch_array($b)){ echo $b['nome_cidade'].'<br>'; $c = mysql_query('SELECT nome_bairro FROM tab WHERE nome_cidade='$b[nome_cidade]' GROUP BY nome_bairro'); while($d = mysql_fetch_array($c)){ echo $d['nome_bairro'].'<br>'; } } Alguém sabe se eu consigo fazer isso somente com uma consulta? pra não precisar incluir um loop dentro do outro
    • By luialcantara
      Olá, a empresa onde trabalho tem uma página de login para área restrita que está com problema na função de cadastro. O formulário está enviando os dados para o banco de dados e o usuário se torna ativo para acesso normalmente. O problema é que a mesma função que salva os dados deveria redirecionar o cliente para a área restrita ou então para a página inicial para que ele digite usuário e senha e consiga acessar a página. 
       
      A página já estava pronta quando comecei aqui e eu não tenho domínio sobre php, mas já corrigi alguns erros que estavam impedindo o cadastro. Porém os clientes reclamam pois após concluir o cadastro a imagem de carregamento não desaparece, então apenas coloquei um delay para evitar os questionamentos, pois o usuário fica ativo, então é só voltar para o login que eles conseguem usar nosso site.
       
      A página está dividida entre uma de login (php), uma para cadastro (php) e a principal, que está no wordpress. 
       
      Função do formulário de cadastro:
                  submitHandler: function(form) {                 $(".botoesactions").hide();                 $(".ajaxloader").show();                 var dados = jQuery( form ).serialize();                  $(".ajaxloader").fadeOut(1500);                 $.ajax({type: "POST", data: dados, url:"<?php echo get_site_url(); ?>/atendimento/cadastrar",success: function(data){                     console.log(data);                     try {             var ret = JSON.parse(data);                     } catch (e) {          var ret = false;                    }                     $(".ajaxloader").hide();                     if(ret !== false && ret.retorno === "ok"){                         console.log(ret);                         alert("Cadastrado realizado com sucesso!");                         window.location.href = "<--!?php echo get_site_url(); ?-->/atendimento/";                     }else if(ret !== false && ret.retorno === "fail"){                         alert(ret.mensagem);                         $(".botoesactions").show();                     }else{                         $(".botoesactions").show();                     }                 }});             }  
       
      Função de inserção de informações no banco de dados:
      elseif('cadastrar' == $syjusaten){                         if(!isset($_SESSION) || !isset($_SESSION['jusate_session']['answeris']) || $_SESSION['jusate_session']['answeris'] != 42 ){                 if($_POST && $_POST['typos'] == "iscadastro"){                     $url= $urlServer.'/Cliente/ClienteSite/cadastraclientesite';                     $parms = array(                         "usuario" => $_POST['user'],                         "Senha" => $_POST['pass'],                         "Cliente.ClienteId" => $_POST['clienteId'],                         "Cliente.Nome" => $_POST['nome'] /*Existem outros dados, mas acho que ficaria muito codigo e não contribuem para erro*/                     );                     $respServer = syJuCurl($url, $parms);                     if($respServer == ""){                         echo json_encode( array(                             "retorno" => "fail",                             "mensagem" => "Não foi possivel realizar o cadastro. Tente novamente mais tarde"                         ));                     }else{     echo $respServer;                         }                 }else{                     echo "ELSEE";                     header("Location: ".get_site_url()."/atendimento");                 }                         exit;             }else{                 header("Location: ".get_site_url()."/atendimento/");             }         }  
      Agradeço pela atenção ;)
       
    • By TheRonaldoStar
      Olá, Venho aqui de novo para tirar uma dúvida que creio eu ser muito simples porem não sei como aplicar!;
      Como diz no título do post eu gostaria de fazer um select de cadastros cujo o id do usuário online está nesta coluna,
      Porem neste campo contem 2 id separados por uma ' , '. Sendo assim não dar para mim fazer uma pesquisa com com a tag WHERE id ='Valor'
      Em fim eu quero ajuda para selecionar todos os cadastro cujo o id do usuário online está por EX: Sou o usuário 1 existe dois cadastros que tem meu id: [1, 2] e [2, 1];
      Alem de pesquisar todos os cadastros que tenha meu id nesta coluna eu quero que não tenha interferência ou listar cadastro do usuário 1 se eu for o usuário 21 por ex.
       
      Qual quer ajuda é bem vinda!
      Atenciosamente,
      ~Ronaldo
    • By Agnosticado
      Olá senhores, estou intrigado com uma coisa: tenho o seguinte código:
      $id_exame = "50296"; $pesquisa = "SELECT motivo, CASE WHEN motivo = 'Intensa superposição celular em mais de 75% de esfregaço' THEN 'A' WHEN motivo = 'Sangue em mais de 75% de esfregaço' THEN 'B' WHEN motivo = 'Artefatos de dessecamento mais de 75% de esfregaço' THEN 'C' ELSE 'TESTE' END AS opcao FROM insatisfatorio WHERE exame_id = '$id_exame' ORDER BY opcao ASC"; $linha = mysql_query($pesquisa); while ($pesquisa = mysql_fetch_array($linha) or die(mysql_error())){ echo $pesquisa["opcao"]; } Quando executo usando
       
      $linha = mysql_query($pesquisa);
                 while ($pesquisa = mysql_fetch_array($linha) or die(mysql_error())){
              echo $pesquisa["opcao"];
              echo "<br>";
       
       
      a saída é palavra "TESTE" que o default e não o texto "B" que corresponde a string da chamada do $id_exame = 50296.
       
      O ESQUISITO é que quando executo todo select que está na variável $pesquisa direto no SGBD dá certo e o texto "B" aparece normalmente.
      PQ DIABOS ISSO ACONTECE???
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.