Jump to content

Recommended Posts

Posted

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) }

Posted

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')");
                    
                
    }
}

?>
Posted

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

Posted

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 

Posted

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;
        
    }
Posted
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')");

Posted (edited)

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
Posted

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);
                     
        
    }
    
}

?>
Posted (edited)

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
Posted (edited)

Boas HappyHippyHippo,

Obrigado pelo código, como tou a iniciar OOP tava pelo mais básico daí fazer como mostrei 😛 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
Posted

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
Posted

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.

Posted

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? 

Posted

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

Posted (edited)

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

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.