Astuto Posted October 4, 2016 at 06:39 PM Report #599377 Posted October 4, 2016 at 06:39 PM 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) }
tiago.f Posted October 4, 2016 at 06:48 PM Report #599379 Posted October 4, 2016 at 06:48 PM Oi. Tirando o "basedadps" parece estar tudo bem. A ligação foi feita com sucesso.
Astuto Posted October 4, 2016 at 06:52 PM Author Report #599380 Posted October 4, 2016 at 06:52 PM Hmmm, Estranho é que não está a introduzir nada na BD. Vou ver se na class que introduz conteudo se ta tudo bem...
HappyHippyHippo Posted October 4, 2016 at 07:45 PM Report #599385 Posted October 4, 2016 at 07:45 PM 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 Portugol Plus
Astuto Posted October 4, 2016 at 08:52 PM Author Report #599391 Posted October 4, 2016 at 08:52 PM 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')"); } } ?>
tiago.f Posted October 4, 2016 at 09:03 PM Report #599392 Posted October 4, 2016 at 09:03 PM Em mysqli_query($ligacao1 .... "$ligacao1" é a tua classe LigarBD e não o retorno da função mysqli_connect( como deveria ser.
Astuto Posted October 4, 2016 at 09:21 PM Author Report #599393 Posted October 4, 2016 at 09:21 PM 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
tiago.f Posted October 4, 2016 at 09:57 PM Report #599394 Posted October 4, 2016 at 09:57 PM 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
Astuto Posted October 4, 2016 at 10:07 PM Author Report #599395 Posted October 4, 2016 at 10:07 PM 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; }
Astuto Posted October 4, 2016 at 10:17 PM Author Report #599396 Posted October 4, 2016 at 10:17 PM 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')");
tiago.f Posted October 5, 2016 at 08:31 AM Report #599403 Posted October 5, 2016 at 08:31 AM (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 October 5, 2016 at 08:32 AM by tiago.f
Astuto Posted October 6, 2016 at 09:11 AM Author Report #599421 Posted October 6, 2016 at 09:11 AM 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); } } ?>
HappyHippyHippo Posted October 6, 2016 at 09:47 AM Report #599423 Posted October 6, 2016 at 09:47 AM (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 October 6, 2016 at 10:05 AM by HappyHippyHippo better code IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Astuto Posted October 6, 2016 at 09:58 AM Author Report #599425 Posted October 6, 2016 at 09:58 AM (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 October 6, 2016 at 10:00 AM by Astuto
HappyHippyHippo Posted October 6, 2016 at 10:04 AM Report #599426 Posted October 6, 2016 at 10:04 AM 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 Portugol Plus
Astuto Posted October 6, 2016 at 10:19 AM Author Report #599428 Posted October 6, 2016 at 10:19 AM 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.
Astuto Posted October 6, 2016 at 09:20 PM Author Report #599439 Posted October 6, 2016 at 09:20 PM 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?
HappyHippyHippo Posted October 6, 2016 at 10:15 PM Report #599442 Posted October 6, 2016 at 10:15 PM não estou a perceber o problema ... podes dar um exemplo ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Astuto Posted October 6, 2016 at 10:27 PM Author Report #599443 Posted October 6, 2016 at 10:27 PM 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
HappyHippyHippo Posted October 7, 2016 at 07:14 AM Report #599446 Posted October 7, 2016 at 07:14 AM (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 October 7, 2016 at 07:14 AM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now