AppenTureen Postado Junho 14 Denunciar Share Postado Junho 14 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Frank K Hosaka Postado Junho 14 Denunciar Share Postado Junho 14 (editado) 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 Junho 14 por Frank K Hosaka Citar Link para o comentário Compartilhar em outros sites More sharing options...
1 lowys Postado Junho 14 Denunciar Share Postado Junho 14 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; Citar Link para o comentário Compartilhar em outros sites More sharing options...
1 Frank K Hosaka Postado Junho 15 Denunciar Share Postado Junho 15 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 lowys Postado Junho 16 Denunciar Share Postado Junho 16 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
AppenTureen
Tenho uma classe de conexão:
Que é extendida na classe de métodos:
Ok.. funciona... porém quando tento colocar:
Não funciona... gostaria de saber se ao invés de colocar:
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
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.