Ir para conteúdo

POWERED BY:

Arquivado

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

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

Compartilhar este post


Link para o post
Compartilhar em outros 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?

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros 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?

Compartilhar este post


Link para o post
Compartilhar em outros 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; 	
});

Compartilhar este post


Link para o post
Compartilhar em outros 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;
	}
}

Compartilhar este post


Link para o post
Compartilhar em outros 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!

Compartilhar este post


Link para o post
Compartilhar em outros 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:

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros 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?

Compartilhar este post


Link para o post
Compartilhar em outros 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...

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por ILR master
      Tudo bem pessoal?
       
      No código abaixo, estou fazendo uma consulta nas tabelas, banners e banners_referencia
      Meu objetivo é trazer resultados com valores iguais ao nome da cidade declarada na $cidade ou resultados com a referencia Total.
      O problema é que está trazendo todos os resultados. Tenho 10 linhas, 1 com o nome da cidade e duas com o valor Total, então o resultado teria que ser de apenas 3 linhas, mas mostra tudo.
       
      $banner = "SELECT A.*, B.* FROM banners A, banners_referencia B WHERE B.cod_referencia = A.cod_referencia AND A.cidade = '$cidade' OR B.referencia = 'Total' ORDER BY RAND()";
      $banner = mysqli_query($conexao, $banner) or die ("Banner não encontrado");
      while($busca= mysqli_fetch_array($banner)){
          print $busca['cidade'].'<br>';
      };
       
      Alguém consegue me ajudar?
    • Por Rafael_Ferreira
      Não consigo carregar a imagem do captcha do meu formulário. Foi testado com o xampp e easyphp. Também não carregou a imagem de outros captcha. 
       
       
    • Por luiz monteiro
      Olá, tudo bem?
       
      Estou melhorando meu conhecimento em php e mysql e, me deparei com o seguinte. A tabela da base de dados tem um campo do tipo varchar(8) o qual armazena números. Eu não posso alterar o tipo desse campo. O que preciso é fazer um select para retornar o números que contenham zeros a direita ou a esquerda.
      O que tentei até agora
       
      Ex1
      $busca = $conexao->prepare("select campo form tabela where (campo = :campo) ");
      $busca->bindParam('campo', $_REQUEST['campo_form']);
       
      Se a direita da string $_REQUEST['campo_form'] termina ou inicia com zero ou zeros, a busca retorna vazio.
      Inseri dados numéricos, da seguinte maneira para testar: 01234567;  12345670: 12345678: 12340000... entre outros nessa coluna. Todos os valores que não terminam ou não iniciam com zero ou zeros, o select funciona.
       
       
      Ex2
      $busca = $conexao->prepare("select campo form tabela where (campo = 0340000) ");
      Esse número está cadastrado, mas não retorna.
       
      Ex3
      $busca = $conexao->prepare("select campo form tabela where (campo = '02340001' ) ");
      Esse número está cadastrado, mas não retorna.
       
       
      Ex4
      $busca = $conexao->prepare("select campo form tabela where (campo like 2340000) ");
      Esse número está cadastrado, mas não retorna.
       
      Ex5
      $busca = $conexao->prepare("select campo form tabela where (campo like '12340000') ");
      Esse número está cadastrado, mas não retorna.
       
      Ex6
      $busca = $conexao->prepare("select campo form tabela where (campo like '"12340000"' ) ");
      Esse número está cadastrado, mas não retorna.
       
       
      Ex7
      $busca = $conexao->prepare("select campo form tabela where (campo like :campo) ");
      $busca->bindParam('campo', $_REQUEST['campo_form'])
      Não retorna dados.
       
      O  $_REQUEST['campo_form'] é envio via AJAX de um formulário. 
      Usei o gettype para verificar o post, e ele retorna string.
      Fiz uma busca com número 12345678 para verificar o que o select retorna, e também retrona como string.
       
      Esse tipo de varchar foi usado porque os números que serão gravados nesse campo,  terão zeros a direita ou na esquerda. Os tipos number do mysql não gravam zeros, então estou usando esse. O problema é a busca.
      Agradeço desde já.
       
       
    • Por daemon
      Boa tarde,
       
      Eu tenho uma rotina que faz uma leitura do arquivo .xml de vários sites.

      Eu consigo pegar o tópico e a descrição, e mostrar a imagem que esta na pagina do link.
      Para isso utilizo esta função:
      function getPreviewImage($url) { // Obter o conteúdo da página $html = file_get_contents($url); // Criar um novo objeto DOMDocument $doc = new DOMDocument(); @$doc->loadHTML($html); // Procurar pela tag meta og:image $tags = $doc->getElementsByTagName('meta'); foreach ($tags as $tag) { if ($tag->getAttribute('property') == 'og:image') { return $tag->getAttribute('content'); } } // Se não encontrar og:image, procurar pela primeira imagem na página $tags = $doc->getElementsByTagName('img'); if ($tags->length > 0) { return $tags->item(0)->getAttribute('src'); } // Se não encontrar nenhuma imagem, retornar null return null; } // Uso: $url = "https://example.com/article"; $imageUrl = getPreviewImage($url); if ($imageUrl) { echo "<img src='$imageUrl' alt='Preview'>"; } else { echo "Nenhuma imagem encontrada"; }  
      Mas estou com um problema, esta funcão funciona quando coloco em uma pagina de teste.php. Preciso mostrar em uma página inicial diversas fotos de todos os links. (No caso acima só funciona 1).
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.