Ir para conteúdo

POWERED BY:

Arquivado

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

Thiago Dias_132983

Pdo

Recommended Posts

Tô começando no OO e no PDO agora ai fiz essa classe de conexão com o BD

<?php
class banco {

	public $user = 'root';
	public $db = 'iniciante';
	public $pass = NULL;
	public $con;
	protected $dsn;

	public function __construct() {

		if (empty($this -> dsn)) :

			$this -> dsn = "mysql:host=localhost;dbname={$this->db}";

		endif;

		 return $this -> con = new PDO($this -> dsn, $this -> user, $this -> pass);

	}

}

 

 

ai eu chamo ela em outra pagina

include ('db.class.php')

 

e dps eu crio uma instancia
$banco = new banco;

 

porém eu não consigo usa-la pra fazer instruções sql , isso deve ser besteira ,mas preciso de ajuda !

$sql = $banco;
$sql->prepare("blabla"):

 

dá um erro :

Fatal error: Call to undefined method banco::prepare() in xxx/xxxx/xxxx/header.php on line 5

AJudem :/

Compartilhar este post


Link para o post
Compartilhar em outros sites

evite deixar as propriedades como public crie get/set(s), o metodo prepare fica com a conexão($con).

vc pode criar outra classe q somente processa instruções sql, recebendo no construtor uma instancia de banco.

 

 

<?php
class banco {

    private $user = 'root';
    private $db = 'iniciante';
    private $pass = NULL;
    private $con;
    private $dsn;

    public function __construct() {

        if (empty($this -> dsn)) :
            $this->dsn = "mysql:host=localhost;dbname={$this->db}";
        endif;
         return  new PDO($this->dsn, $this->user, $this->pass);
    }

}


class DAO{
    private $conexao;
    public function __construct($banco){
        $this->conexao = $banco;
    }
    
    
    public function insert(){
        $sql = 'insert...';
        $stmt = $this->conexao->prepare($sql);
        
        if(!$stmt->execute()){
            return false;
        }else{
            return true;
        }
        
    }
    
    
}


$banco = new banco();

$dao = new DAO($banco);

$dao->insert();

 

 

depois vc pode criar uma classe abstrata ou interface, contendo as operações comuns de banco de dados (insert, update, delete listar, buscar). Assim td a classe q executar alguma instrução no banco vai herdar/implementar os metodos de DAO.

Compartilhar este post


Link para o post
Compartilhar em outros sites

1. Qual o objetivo da classe banco?? Qual problema ela resolve??

 

2. Como o @shini já explicou, os métodos da PDO estão na instância da PDO. Você precisaria repassar todas as chamadas à ela



    public function __call($name, $arguments) {
        return call_user_func_array(array($this->con, $name), $arguments);
    }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu , quero pegar a instancia da classe bando de dados , e usar instruções sql externo da classe , porém dá erro .

ex :

$banco = new bd;
$exemplo = $banco->prepare("SELECT ....");

da um Fatal Error :/



Fugindo um pouco , os set/gets que você disse é +/- assim ?

	public function setUser($user){
		
		$this->user = $user;
	}
	public function getUser(){
		
		return $this->user;
	}

Compartilhar este post


Link para o post
Compartilhar em outros sites

posta ai como esta sua classe.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Eu , quero pegar a instancia da classe bando de dados , e usar instruções sql externo da classe

Beleza, essa parte eu entendi. O que eu não entendo é onde você precisa criar uma nova classe pra fazer isso, se a PDO já faz sozinha?

Fugindo um pouco , os set/gets que você disse é +/- assim ?

 

 

 


	public function setUser($user){
		
		$this->user = $user;
	}
	public function getUser(){
		
		return $this->user;
	}

 

 

Isso mesmo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não , assim , como eu sou novo nisso ainda , eu queria testar uma instrução da classe , por que nunca fiz isso antes , estou começando agora com PDO e OO ...



por exemplo :

eu fiz uma classe banco de dados , ai depois eu inclui essa classe de alguma forma na pagina (autoload) , instanciei ela e quero usar uma instrução sql com o prepare do PDO , só que dá erro .

$banco = new banco ;

$banco->prepare("SELECT * ...");

$banco->execute();

OBS: o nome da classe é BD e a função é uma construtora (__construct)



Aqui está a classe não está completa , só pra vocês terem uma ideia !

 

<?php
class banco {

	protected $user = 'root';
	protected $db = 'iniciante';
	protected $pass = NULL;
	protected $con;
	protected $dsn;
	
	public function setUser($user){
		
		$this->user = $user;
	}
	public function getUser(){
		
		return $this->user;
	}

	public function __construct() {

		if (empty($this -> dsn)) :

			$this -> dsn = "mysql:host=localhost;dbname={$this->db}";

		endif;

		 return $this -> con = new PDO($this -> dsn, $this -> user, $this -> pass);

	}

}

 

 



 



usando set/gets eu teria que informar o usuário e senha na instancia , correto ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

tente:

 

$banco  = new banco();
$sql = "select ....";
$banco->con->prepare($sql);
....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Glória a deus ! rs

Consegui, amigos muito obrigado !

tai :

$banco = new banco();
$sql = "SELECT * FROM test";
$st = $banco->con->query($sql);
echo $st->RowCount();

 

Muito Obrigado meeeeeeeeesmo !

Compartilhar este post


Link para o post
Compartilhar em outros sites

Outra coisinha , a $user não deveria ser public para ou poder instancia-la e alterar fora do escopo da classe sem a necessidade de criar um metodo setUser ? não entendo muito bom a vantagem .

Compartilhar este post


Link para o post
Compartilhar em outros sites

não, uma vantagem de possuir um metodo para acessar um propriedade é realizar validação nas entradas. vc também centraliza o codigo em um ponto na hora da manutenção somente um ponto do codigo sera alterado e não varios arquivos.

 

veja sobre Encapsulamento

 

http://www.macoratti.net/net_oocb.htm

http://www.slideshare.net/marconirds/encapsulamento-em-oo

Compartilhar este post


Link para o post
Compartilhar em outros sites

tai :



$banco = new banco();
$sql = "SELECT * FROM test";
$st = $banco->con->query($sql);
echo $st->RowCount();

 

 

@Thiago Dias_132983, eu ainda não vi utilidade na classe banco.
$banco = new PDO('mysql:host=127.0.0.1', 'root', 'root');
$banco->exec('use iniciante');
$sql = 'select * from test';
$st = $banco->query($sql);
echo sizeof($st->FetchAll(PDO::FETCH_NUM));
Veja que, como você disse que está aprendendo OO, a minha preocupação aqui é que você aprenda o jeito certo para não ter que aprender denovo.

 

Atualmente, sua classe banco não resolve nenhum problema. Ela atuaria como um proxy mas, como não faz nenhuma interferência, está implementada de forma inútil.

 

1. Adiciona uma dependência

2. Tem alto acoplamento

3. Não é flexível

4. Não é reutilizável

 

Para tentar te esclarecer onde eu quero chegar, deixo uma pergunta:

 

No cenário que você montou, utilizando a classe que você desenvolveu, como eu faria pra conectar em dois bancos de dados ao mesmo tempo?? Suponhamos que eu quero fazer um backup, eu quero passar o conteúdo de A para B. Como sua classe me atenderia?

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.