Ir para conteúdo
Fórum Script Brasil
  • 0

conexão em uma subclasse?


AppenTureen

Pergunta

Tenho uma classe de conexão:

class Conecta { 

private $Servidor = '127.0.0.1'; 
private $Usuario = 'root'; 
private $Senha = 'senha'; 
private $Banco = 'banco'; 
protected $Conecta;


public function conectar(){ 
   $this->conecta = mysqli_connect($this->servidor,$this->usuario,$this->senha,$this->banco);
   mysqli_set_charset($this->conecta, "utf8");
   
   if (mysqli_connect_errno() != 0) {
       $this->erro(mysqli_connect_error());
       header("Location: erro/erro.php");
   }
   private function erro($erroValor){
   error_log(filter_input(INPUT_SERVER,"PHP_SELF")." - CODPT 0001: (".@date("d/m/Y") ." às ".@date("H:i").") - ".$erroValor."\r\n",3,"log/erro.log");
   error_log("Erro no sistema de conexão do cliente MCB. CODPT 0001: ".$erroValor,1,"meuemail@gmail.com");
   
   }
}

Que é extendida na classe de métodos:

class Metodos extends Conecta{

    public function metodoi(){
         $this->conectar();
         $conexao = $this->conecta;
         
         $sql = mysqli_query($conexao,"MINHA QUERY");
    }
}

Ok.. funciona... porém quando tento colocar:

$sql = mysqli_query(parent::conectar(), "MINHA QUERY");

Não funciona... gostaria de saber se ao invés de colocar:

$this->conectar();
$conexao = $this->conecta;

Teria algum outro meio, pois coloco o código acima em todos os métodos.

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Classes são bem difíceis de trabalhar e o banco de dados é pior ainda.

Aconselho a fazer coisas mais simples primeiro. O que segue é um péssimo exemplo de programação, ele não contempla tratamento de erro, ele não contempla a convenção da documentação do código, mas ele funciona!

<?php
define('Servidor','localhost');
define('Usuario','root');
define('Senha','');
define('BD','teste');


class Conexao 
{ 
    private $conexao;

    public function __construct()
    {
        $this->conexao = new mysqli(Servidor,Usuario,Senha,BD);
    }

    public function consulta($sql)
    {
        $query = $this->conexao->query($sql);
        return $query->fetch_assoc();
    }

}

$teste = (new Conexao)->consulta("select message from chirps where id=1");
var_dump($teste);
echo $teste['message'];

Eu comecei a estudar o PHP em 2020, mas só estudei as classes em 2024, quando apareceu a Gemini. Tem sugestões dela que faz perder muito tempo, mas tem outras que funcionam, os meus primeiros códigos eram assim:

 

<?php
$mysqli=new mysqli("localhost","root","","teste");
$query=$mysqli->query("select message from chirps where id=1");
$row=$query->fetch_assoc();
echo $row['message']

Em 2020, eu não tinha a menor ideia do que era a palavra "new", só em 2024 é que aprendi que mysqli é o nome de uma classe do PHP, ele tem centenas de métodos, mas eu só conheço o método query e o fetch. Para saber de outros métodos, é preciso ler o manual do PHP, ele é enorme e difícil de entender. Eu prefiro a Gemini, ontem, por exemplo, ela disse que o PHP tem outra classe chamada ZipArchive, Nossa, como eu gostei dele! Enfim, para utilizar uma classe é necessário usar a palavra new.

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

  • 1

Crie um constructor
Inicie a conexão no constructor e ela estará disponível para todos os methods

Conecta.php

<?php

class Conecta
{
  private static array $dbConfig = [
    'db_host' => '127.0.0.1',
    'db_user' => 'root',
    'db_pass' => 'my-secret-pw',
    'db_name' => 'my-database',
  ];

  protected $connection;

  public function conectar()
  {
    $this->connection = new mysqli(self::$dbConfig['db_host'], self::$dbConfig['db_user'], self::$dbConfig['db_pass']);
    $this->connection->select_db(self::$dbConfig['db_name']);
    $this->connection->set_charset('utf8');
  }

  public function erro($erroValor)
  {
    error_log(filter_input(INPUT_SERVER, 'PHP_SELF') . ' - CODPT 0001: (' . @date('d/m/Y') . ' às ' . @date('H:i') . ') - ' . $erroValor . "\r\n", 3, 'log/erro.log');
    error_log('Erro no sistema de conexão do cliente MCB. CODPT 0001: ' . $erroValor, 1, 'meuemail@gmail.com');
  }
}

Metodos.php

<?php

class Metodos extends Conecta
{
  public function __construct()
  {
    $this->conectar();
  }

  public function metodoi()
  {

    $result = $this->connection->query('select * from users');
    echo '<pre>$result: ';
    print_r($result);
    echo '</pre>';
  }
}

index.php

<?php

if (phpversion() < 8.2) {
  exit('Atualize a versão do php para 8.2+');
}
spl_autoload_register(fn ($class) => require str_replace('\\', DIRECTORY_SEPARATOR, $class) . '.php');

try {
  (new Metodos())->metodoi();
} catch(Exception $e) {
  (new Conecta())->erro('<p><b>ERRO</b>: ' . $e->getMessage() . '</p>');
  header('Location: erro/erro.php');
  exit();
}

erro/erro.php

<?php

$logContent = file('../log/erro.log', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

echo '<h3>Logs</h3><a href="../">Back to index</a><pre>$logContent: ';
print_r(array_reverse($logContent, true));
echo '</pre>';

log/log.php (empty file)

database.sql

create schema `my-database`;
use `my-database`;
create table users(
  id int(9) AUTO_INCREMENT PRIMARY KEY,
  name varchar(255),
  created_at timestamp default current_timestamp
) Engine = InnoDB;

 

Link para o comentário
Compartilhar em outros sites

  • 1
11 horas atrás, lowys disse:

Crie um constructor
Inicie a conexão no constructor e ela estará disponível para todos os methods

Conecta.php

<?php

class Conecta
{
  private static array $dbConfig = [
    'db_host' => '127.0.0.1',
    'db_user' => 'root',
    'db_pass' => 'my-secret-pw',
    'db_name' => 'my-database',
  ];

  protected $connection;

  public function conectar()
  {
    $this->connection = new mysqli(self::$dbConfig['db_host'], self::$dbConfig['db_user'], self::$dbConfig['db_pass']);
    $this->connection->select_db(self::$dbConfig['db_name']);
    $this->connection->set_charset('utf8');
  }

  public function erro($erroValor)
  {
    error_log(filter_input(INPUT_SERVER, 'PHP_SELF') . ' - CODPT 0001: (' . @date('d/m/Y') . ' às ' . @date('H:i') . ') - ' . $erroValor . "\r\n", 3, 'log/erro.log');
    error_log('Erro no sistema de conexão do cliente MCB. CODPT 0001: ' . $erroValor, 1, 'meuemail@gmail.com');
  }
}

Metodos.php

<?php

class Metodos extends Conecta
{
  public function __construct()
  {
    $this->conectar();
  }

  public function metodoi()
  {

    $result = $this->connection->query('select * from users');
    echo '<pre>$result: ';
    print_r($result);
    echo '</pre>';
  }
}

index.php

<?php

if (phpversion() < 8.2) {
  exit('Atualize a versão do php para 8.2+');
}
spl_autoload_register(fn ($class) => require str_replace('\\', DIRECTORY_SEPARATOR, $class) . '.php');

try {
  (new Metodos())->metodoi();
} catch(Exception $e) {
  (new Conecta())->erro('<p><b>ERRO</b>: ' . $e->getMessage() . '</p>');
  header('Location: erro/erro.php');
  exit();
}

erro/erro.php

<?php

$logContent = file('../log/erro.log', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

echo '<h3>Logs</h3><a href="../">Back to index</a><pre>$logContent: ';
print_r(array_reverse($logContent, true));
echo '</pre>';

log/log.php (empty file)

database.sql

create schema `my-database`;
use `my-database`;
create table users(
  id int(9) AUTO_INCREMENT PRIMARY KEY,
  name varchar(255),
  created_at timestamp default current_timestamp
) Engine = InnoDB;

 

Esse é um código bem sofisticado e engenhoso. Não sabia que a variável "protected" tornava visível o $connection na subclasse. Mas eu acho que faz mais sentido a classe Conecta iniciar a conexão, do que pedir para a classe Metodos ou outra subclasse iniciar a conexão, ou seja, eu mudaria a função conectar( ) para __construct( ) na classe Conecta.

Link para o comentário
Compartilhar em outros sites

  • 0
16 horas atrás, Frank K Hosaka disse:

faz mais sentido a classe Conecta iniciar a conexão

Excelente observação! Tens toda razão! Concordo!
Talvez até se escreva menos código.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,9k
×
×
  • Criar Novo...