Jump to content
Astuto

MySqli e Class

Recommended Posts

Astuto

Boas, 

Tou a começar a experimentar o uso de classes com PHP e então decidi criar uma simples class só para ligar à base de dados, mas não funciona e se fizer um var_dump da o seguinte:

<?php


class LigarBD
{
    
    public $servidor;
    public $basedados;
    public $username;
    public $password;
    
    public function __construct()
    {
        $this->servidor = "127.0.0.1";
        $this->basedadps = "tecsupport";
        $this->username = "root";
        $this->password = "password";
    }
    
    public function Ligar()
    {
        $ligar = mysqli_connect($this->servidor, $this->username, $this->password) or die("Não foi possivel ligar à base de dados!!!");;
        
        var_dump($ligar);
    }
}
    
 
?>

Erro: 

object(mysqli)#2 (19) { ["affected_rows"]=> int(0) ["client_info"]=> string(79) "mysqlnd 5.0.11-dev - 20120503 - $Id: 76b08b24596e12d4553bd41fc93cccd5bac2fe7a $" ["client_version"]=> int(50011) ["connect_errno"]=> int(0) ["connect_error"]=> NULL ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["field_count"]=> int(0) ["host_info"]=> string(20) "127.0.0.1 via TCP/IP" ["info"]=> NULL ["insert_id"]=> int(0) ["server_info"]=> string(21) "5.5.5-10.1.16-MariaDB" ["server_version"]=> int(50505) ["stat"]=> string(129) "Uptime: 14 Threads: 1 Questions: 1 Slow queries: 0 Opens: 22 Flush tables: 1 Open tables: 11 Queries per second avg: 0.071" ["sqlstate"]=> string(5) "00000" ["protocol_version"]=> int(10) ["thread_id"]=> int(2) ["warning_count"]=> int(0) }

Share this post


Link to post
Share on other sites
tiago.f

Oi. Tirando o "basedadps" parece estar tudo bem.

A ligação foi feita com sucesso.

Share this post


Link to post
Share on other sites
Astuto

Hmmm, 
Estranho é que não está a introduzir nada na BD. Vou ver se na class que introduz conteudo se ta tudo bem...

Share this post


Link to post
Share on other sites
HappyHippyHippo
53 minutes ago, Astuto said:

Hmmm, 
Estranho é que não está a introduzir nada na BD. Vou ver se na class que introduz conteudo se ta tudo bem...

o código que apresentas também não tem nenhuma instrução de inserir dados


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Astuto

HappyHippyHippo,

 

Certo, nao cheguei a colar a class para registo de dados mas aqui vai. O problema esta aqui.

 

<?php

require_once 'ligardb.class.php';

class RegistarCliente
{
    public $nomeCliente;
    public $localizacaoCliente;
    public $pessoaCliente;
    public $contactoCliente;
    public $tabela;
    
    public function Registar($tabela, $nomeCliente, $localizacaoCliente, $pessoaCliente, $contactoCliente)
    {
        $this->tabela = $tabela;
        $this->nomeCliente = $nomeCliente;
        $this->localizacaoCliente = $localizacaoCliente;
        $this->pessoaCliente = $pessoaCliente;
        $this->contactoCliente = $contactoCliente;
                  
        $ligacao1 = new LigarBD();
        $ligacao1->Ligar();
                                
        $query = mysqli_query($ligacao1, "INSERT INTO '$this->tabela' ('cliente_nome', 'cliente_localizacao', 'cliente_pessoa', 'cliente_contacto') VALUES ('$this->nomeCliente', '$this->localizacaoCliente', '$this->pessoaCliente', '$this->contactoCliente')");
                    
                
    }
}

?>

 

Share this post


Link to post
Share on other sites
tiago.f

Em

mysqli_query($ligacao1 ....

"$ligacao1" é a tua classe LigarBD e não o retorno da função 

mysqli_connect(

como deveria ser.

 

Share this post


Link to post
Share on other sites
Astuto

Mas o mysqli_connect não serve apenas para ligar à bd e o mysqli_query para consultas, neste caso inserir dados? Se eu uso a classe de ligação tenho de criar um método de retorno de algo? E que o query pede parâmetros e ainda e que não sei o q fazer

Share this post


Link to post
Share on other sites
tiago.f

O mysqli_query recebe, como primeiro prametero, o retorno da função mysqli_connect.

 

Tens, portanto, no função Ligar() que retornar (ou melhor ainda, guardar numa variável da classe (membro)) a resultado do mysqli_connect.

Depois, usas passas  essa variável como o primeiro parametro do mysqli_query 

Share this post


Link to post
Share on other sites
Astuto

Tipo isto:

public function Ligar()
    {
        
        $ligar = mysqli_connect($this->servidor, $this->username, $this->password) or die ("Não foi possivel ligar à base de dados!!!");
        return $ligar;
        
    }

 

Share this post


Link to post
Share on other sites
Astuto
9 minutes ago, Astuto said:

Tipo isto:


public function Ligar()
    {
        
        $ligar = mysqli_connect($this->servidor, $this->username, $this->password) or die ("Não foi possivel ligar à base de dados!!!");
        return $ligar;
        
    }

 

E  a query ficar assim por exemplo?

$query = mysqli_query($ligacao1->Ligar(), "INSERT INTO '$this->tabela' ('cliente_nome', 'cliente_localizacao', 'cliente_pessoa', 'cliente_contacto') VALUES ('$this->nomeCliente', '$this->localizacaoCliente', '$this->pessoaCliente', '$this->contactoCliente')");

Share this post


Link to post
Share on other sites
tiago.f

Por exemplo, sim.

Agora sugeria que na classe LigarBD guardes o variável $ligar como membro de classe e só executes o mysqli_connect se ela ainda não tiver sido inicializada.

 

Boa continuação 

Edited by tiago.f

Share this post


Link to post
Share on other sites
Astuto

Boas tiago.f,

Acho que cheguei lá à base da experiência e com a tua dica.

ficheiro: ligarbd.class.php

<?php

    class LigarBD{
        
        public $servidor;
        public $basedados;
        public $username;
        public $password;
        public $ligacao;
        
        public function Ligar()
        {
            
            $this->servidor = "127.0.0.1";
            $this->basedados = "tecsupport";
            $this->username = "root";
            $this->password = "password";     
            
            $ligacao = mysqli_connect($this->servidor, $this->username, $this->password, $this->basedados) or die ("Sem ligacao a BD");
            
            return $ligacao;
                                                                                    
        }
       
        
    }

?>

ficheiro registarcont.class.php

 

<?php

require_once 'ligarbd.class.php';

class RegistoCliente
{
    
    public $tabela_bd;
    public $cliente_nome;
    public $cliente_localizacao;
    public $cliente_pessoa;
    public $cliente_contacto;
    
    public function RegistarCliente($tabela, $clienteN, $clienteLocal, $clientePess, $clienteContact)
    {
        $this->tabela_bd = $tabela;
        $this->cliente_nome = $clienteN;
        $this->cliente_localizacao = $clienteLocal;
        $this->cliente_pessoa = $clientePess;
        $this->cliente_contacto = $clienteContact;
        
        $ligar1 = new LigarBD();        
        $con = $ligar1->Ligar();
        
        $query= "INSERT INTO ". $this->tabela_bd . " (`cliente_nome`, `cliente_localizacao`, `cliente_pessoa`, `cliente_contacto`) VALUES  ('".$this->cliente_nome."', '".$this->cliente_localizacao."', '".$this->cliente_pessoa."', '".$this->cliente_contacto."')";
        
        $reg = mysqli_query($con, $query);
                     
        
    }
    
}

?>

 

Share this post


Link to post
Share on other sites
HappyHippyHippo

já que estás numa de OOP, então :

<?php
abstract class AbsPersist {
  static protected $servidor  = "127.0.0.1";
  static protected $basedados = "tecsupport";
  static protected $username  = "root";
  static protected $password  = "password";
  static protected $conn      = null;

  protected function getConnection() {
    if (!self::$conn)
      self::$conn = mysqli_connect(self::$servidor, self::$username, self::$password, self::$basedados) or die ("Sem ligacao a BD");
    return self::$conn;
  }
}

class Cliente extends AbsPersist {
    static protected $tabela_bd = "tabela";
    
    static public function registar($nome, $localizacao, $pessoa, $contacto) {
        $query = "INSERT INTO ". self::$tabela_bd . " (`cliente_nome`, `cliente_localizacao`, `cliente_pessoa`, `cliente_contacto`)
                                              VALUES  (?,              ?,                     ?,                ?)";

        $stmt = self::getConnection()->prepare($query);
        $stmt->bind_param('ssss', $nome, $localizacao, $pessoa, $contacto);
        $stmr->execute();
    }
}

 

Edited by HappyHippyHippo
better code

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Astuto

Boas HappyHippyHippo,

Obrigado pelo código, como tou a iniciar OOP tava pelo mais básico daí fazer como mostrei :P no entanto eu se usar o exemplo que fizeste, se eu necessitar de por exemplo das classes para remover clientes ou para editar, eu crio por exemplo a class remover.class.php e cria a class abstrata para a ligaçao e crio no mesmo ficheiro uma class extend com as consultas de remoção certo?
 

 

PS: eu estou a usar exemplos de clientes e contratos e afins mas não sou programador de profissão é um hobbie e não trabalho para clientes só faço e mini ferramentas para me organizar nos meus trabalhos

Abrtaço

Edited by Astuto

Share this post


Link to post
Share on other sites
HappyHippyHippo

uma das filosofias de classes é o aglomerar das funcionalidades relativas a um tipo de dado. se pretendes ter funcionalidades relativas a um cliente, então todas elas deverias estar declaradas na mesma classe.

o que quero dizer é : se tens a funcionalidade de criar/editar/remover um cliente, então todas elas deveriam existir na mesma classe


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Astuto

Pois nisso tens razão, o meu problema ainda é mesmo estruturar a aplicação ou página, porque a minha ideia inicial era fazer uma classe que tivesse os vários métodos o registar, apagar, e o ler/consultar registos tudo num só ficheiros mas não sabia ser era a maneira mais correcta de o fazer.

Share this post


Link to post
Share on other sites
Astuto

Boas novamente,

Outra dúvida, em relação ao processamento de formularios em php, por norma sem objectos o que eu fazia era criar uma pagina com um form, e no action definir a pagina que processava o formulario recebendo as var pelo post e seguindo os metodos de gravaçao ou entao na propria pagina. Sendo com objectos os dados do post podem ser passados atraves  do action para a pagina da class? 

Share this post


Link to post
Share on other sites
Astuto

Assim muito básico:

o form.php

<form method="POST" action="processar.php">
  <input name="teste" id="teste">
  <button id="registar" name="registar" type="submit">Registar</button>
</form>

o processar.php

 

<?php

	$exemplo = $_POST['teste'];
	
	$sql = mysql_query("........")

?>

Isto muito resumido,

Agora com objectos, 

 

por exemplo

com o mesmo form como passo para um metodo de uma classe registar
eu uso por exemplo 
$registo1 = new Ligar();
$registo1->RegistarCodigo("nome_tabela", "Codigo", "tipo_de_codigo....etc");

como passo os valores dos inputs no POST para o metodo da classe  fazer o processamento do registo

Share this post


Link to post
Share on other sites
HappyHippyHippo

a função registar está declarada na classe mas é uma função estática, isto porque apesar estar no contexto de uma acção sobre o objecto Cliente, não é uma acção sobre uma instÂncia da classe. isto quer dizer que não é uma funcionalidade a ser actuada sobre um cliente em específico.

para fazer o que pretendes, basta:

<?php
$valor = $_POST['val'];

// TODO : validar dados do post

Cliente::registar($nome, /* patati, patata */);

 

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

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

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.