Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Tiago Souza Ribeiro

[Resolvido] Usar variável de uma função em outra função

Recommended Posts

Olá. Estou com uma dúvida noob aqui...

Estou iniciando agora em OOP, e estou convertendo algumas coisas aqui para esse método.

O problema: criei uma classe que será responsável por manipular qualquer dado do banco de dados. A princípio ela está +/- assim:

class db {
function _contruct($server, $user, $password, $database) {
	$mysqli = new mysqli($server, $user, $password, $database);
}
function _destruct() {
	$mysqli->close(); // Acho que o problema que estou acontece aqui também
}
public function get($table, $column) {
	$query = $mysqli->query("SELECT '".$column."' FROM '".$table."'"); // Aqui está o problema
	/*
	...
	*/
}
}

O problema é: como posso acessar a $mysqli que foi criada lá no _construct? Dessa maneira ae, diz que a variável $mysqli está indefinida, já tentei colocar global $mysqli; na função get mas dá o fatal error Call to a member function query() on a non-object in...Tentei substituir na get() o $mysqli por $this->$mysqli mas não adianta, causa um Cannot access empty property in... além de variável indefinida, que some se eu usar global $mysqli; novamente...

 

OOP ainda não entrou totalmente na minha cabeça.

 

Algum navegante destes mares poderia me dar uma ajudinha ae? :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

o mysqli no seu caso é uma propriedade da Classe(Objeto) e não da função (Método)

 

então ficaria assim

class db {
       private $mysql; 
       function _contruct($server, $user, $password, $database) {
               $this->mysqli = new mysqli($server, $user, $password, $database);
       }
       function _destruct() {
               $this->mysqli->close(); // Acho que o problema que estou acontece aqui também
       }
       public function get($table, $column) {
               $query = $this->mysqli->query("SELECT '".$column."' FROM '".$table."'"); // Aqui está o problema
               /*
               ...
               */
       }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu ae, não imaginei na possibilidade de criar a variável dentro da classe e mudar o "valor" dela pelas funções, kk.

Mas mesmo assim, continua dando isso:

Fatal error: Call to a member function query() on a non-object in .../db.class.php on line {linha do query}

No aguardo ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

na verdade acho que falei besteira pois você não vai instanciar nada fora da classe

 

tenta assim:

 

class db {
       function _contruct($server, $user, $password, $database) {
               $mysqli = new mysqli($server, $user, $password, $database);
       }
       function _destruct() {
               $db::mysqli->close(); // Acho que o problema que estou acontece aqui também
       }
       public function get($table, $column) {
               $query = $db::mysqli->query("SELECT '".$column."' FROM '".$table."'"); // Aqui está o problema
               /*
               ...
               */
       }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo, ... basta adicionar em propriedade da classe, como já dito pelo Vinicius Rangel

:seta: http://br2.php.net/manual/en/language.oop5.properties.php

 

class db {
private $mysqli ;

       function _contruct($server, $user, $password, $database) {
               $this->mysqli = new mysqli($server, $user, $password, $database);
       }
       function _destruct() {
               $this->mysqli->close(); // Acho que o problema que estou acontece aqui também
       }
       public function get($table, $column) {
               $query = $this->mysqli->query("SELECT '".$column."' FROM '".$table."'"); // Aqui está o problema
               /*
               ...
               */
       }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estranho, está ocorrendo isso:

 

Fatal error: Call to a member function query() on a non-object in D:\nginx\www\engine\classes\db.class.php on line {linha do query}

 

Qual seria a causa para isso? Estou pesquisando aqui sobre, mas até agora nada :(

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como você tá executando isso ? provavelmente não tá achando o ->query porque você não deve ter conectado ao banco de dados ...

joga um

var_dump ( $this ) ;

Depois da instância de mysqli construct e joga o resultado aqui.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tá... ficou assim:

 

$dbData = new db("localhost", "root", "minhasenha", "bancodedados");
var_dump($dbData);

 

E retornou:

object(db)#1 (1) { ["mysqli":"db":private]=> NULL } 

 

Fiz outro teste, comentei a classe toda, deixando só:

class db {
public $mysqli;
function _construct($server, $user, $password, $database) {
	$this->mysqli = new mysqli($server, $user, $password, $database);
}
}

 

Chamei ela e fiz uma condicional:

$conn = new db("localhost", "root", "minhasenha", "bancodedados");
if(!$conn->mysqli) { echo "Falha"; }

 

Retornou Falha... Não sei se fiz a condicional erroneamente, ou é problema na conexão ao db... Eu loguei aqui no phpmyadmin normalmente, usando os mesmos dados que usei na classe. Estranho...

 

Testei conectar pelo método procedural, e foi normalmente.

 

Chamei a classe mysqli diretamente, e usei a função mysqli_connect_errno() para checar erros e não houve nenhum, funcionou normalmente, sem erros. Então é algum problema na classe db :(

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pera, vejamos ... agora que estou em casa dá pra analisar melhor, enfim ... seu problema é no nome do método, veja você colocou apenas um underscore, QUALQUER método mágico são dois underscores, ficando __construct ( ) ; provavelmente esse é o seu problema, faça o seu teste novamente mudando o nome do método.

 

Abraços,

Andrey Knupp Vital

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.