Jump to content
Ericsson Berg

Class - Problema na segunda chamada da função

Recommended Posts

Boa tarde, galera!!

 

Tô com um problema na chamada da segunda função de uma class.

 

As functions trazem consultas do banco de dados, assim, em uma consulta eu terei que trazer dois arrays, então dentro da classe Veículos criei 

uma função base para chamar as duas função que trarão o resultado dos Selects, porém somente a primeira função traz resultado, a segunda somente funciona

se eu omitir a primeira, deve ser algo em relação a conexão, segue o código:

 

class Veiculos
{
        public function veic_lb_ll() 
		{

             $dados1 = Veiculos::query1();   
             $dados2 = Veiculos::query2();
             Retorno_consulta::formatResults($dados2); //Esta parte é só para demonstrar        
        }  
	public static function query1()
	{
            include_once('veiculos/veic_lb_ll.php'); //Este include traz a query   = armazena em $sql        
            $dados1 = Conexao::oracle($sql);
            return  $dados1;
	}
	public static function query2()
	{
            include_once('veiculos/veic_lb_ll.php');  //Este include traz a mesma query para teste         
            $dados2 = Conexao::oracle($sql);
            return  $dados2;
	}
      
}
//Classe de Conexão com o Banco de Dados
class Conexao{
    
    public static function oracle()
    {  
        $conn = oci_connect(DB_USER, DB_PASSWORD, DB_HOST) or die ("Conexão com o banco Falhou!");
        $statement = oci_parse($conn,$sql);
        oci_execute($statement);
        oci_close($conn);   
        //Criar um array
        $dados = array();
        //Transfere os dados para o array
        $x=0;                
        while (($row = oci_fetch_object($statement)) != false){
                $x++;
                $dados[$x] = $row;
        }
        oci_free_statement($statement);

        return $dados;
    }
    
}

 

Share this post


Link to post
Share on other sites

De uma Pesquisada em Padroes de Projeto, Autoload, PSRs, Composer e S.O.L.I.D

Share this post


Link to post
Share on other sites

Entendo que esta começando os estudos com OOP, mas Oo é mais parecido com o mundo real do que imaginamos, tentar desacoplar o máximo possível é fundamental.

 

Sua conexão é estática, mas é problemática, se pelo menos fosse uma singleton ja resolveria, pois usaria uma unica instancia. E tem um while ali que não entendi.

 

Bom minha dica é, use registry para criar sua conexão, com resgistry você já tem o pattern singleton implementadoo e pode add quantas classes e conexões quiser.

Aqui tem um exemplo de uso.
https://github.com/wsduarte/php.registry

 

E tire aqueles include_onces dentro dos objetos!

Padre+Quevedo+isto+non+ecziste+1.jpg

 

 

 

 

Share this post


Link to post
Share on other sites

kkkkkk, tirei o include_once mas deixei o include, porque traz as variáveis com o Select, achei a melhor forma de utilizar.

class Veiculos
{
    
    public function veic_lb_ll($requisicao)
        {
            include('veiculos/veic_lb_ll.php'); //Inclusão das querys
            $dados1 = $this->query1($sql1);  //Realiza o Select 1
            $dados2 = $this->query2($sql2);  //Realiza o Select 2
            $dados = array($dados1,$dados2);  //Cria array dos resultados

            Retorno_requisicao::formatResults($dados); //Devolve resultado da requisição criptografada       
        } 
}

.................................................................................

 

Então, tô tentando usar o Registry, mas estou tendo problemas para instanciar, se poder tirar uma dúvida no código. agradeço.

 

<?php

$ora_bd = "
    (DESCRIPTION=
                (ADDRESS_LIST=
                      (ADDRESS=(PROTOCOL=TCP) 
                        (HOST=10.0.00.000)(PORT=000)
                      )
                )
    (CONNECT_DATA=(SERVICE_NAME=SMAFF))  
)";
//Página do registry

// Hostname
define ( 'DB_HOST', $ora_bd);
// Username
define ( 'DB_USER', 'imasters' );
// Password
define ( 'DB_PASSWORD', 'im****' );
// Databse Name
define ( 'DB_DB', 'IMASTERS' );

class Registry{
    /**
     * Conjunto de dados
     * @var instanceof ArrayObject
    */
    private $data;
 
    /**
     * Aqui ficará a instancia do próprio objeto
     * @var instanceof self
    */
    private static $instance;
 
    /**
     * Private para não permitir ser instanciado
    */
    private function __construct(){ $this->connections = new ArrayObject; }
 
    /**
     * Cria a instancia do objeto
     * @return instanceof Registry
    */
    public static function getInstance(){
        if( !( self::$instance instanceof Registry ) ){
            self::$instance = new Registry;
        }
 
        return self::$instance;
    }
 
    /**
     * Adiciona um dado ao Registry
     * @param $key Nome para reconhecimento de determinado registro
     * @param $value Registro
     * @throws InvalidArumentException Caso a key já tenha sido adicionada
    */
    public function addElement( $key, $value ){
        if( $this->data->offsetExists( $key ) ){
            throw new InvalidArgumentException( sprintf( '"%s" have already added', $key ) );
        }
 
        $this->data->offsetSet( $key, $value );
    }
 
    /**
     * Remove um dado do Registry
     * @param $key O nome relacionado ao registro
     * $throws InvalidArgumentExcpeiton Caso o nome não esteja associado a algum registro
    */
    public function removeElement( $key ){
        if( !$this->data->offsetExists( $key ) ){
            throw new InvalidArgumentException( sprintf( '"%s" not found', $key ) );
        }
 
        $this->data->offsetUnset( $key );
    }
 
    /**
     * Retorna um registro
     * @param $key Nome de registro do elemento
     * @return Algum valor registrado
     * $throws InvalidArgumentExcpeiton Caso o nome não esteja associado a algum registro
    */
    public function getElement( $key ){
        if( !$this->data->offsetExists( $key ) ){
            throw new InvalidArgumentException( sprintf( '"%s" not found', $key ) );
        }
 
        return $this->data->offsetGet( $key );
    }
 
    /**
     * Retorna se um determinado nome de registro existe
     * @param $key Nome de registro do elemento
     * @return bool
    */
    public function existsElement( $key ){
        return $this->data->offsetExists( $key );
    }
}
       

$registry = Registry::getInstance();    
 
$connection = oci_connect(DB_USER, DB_PASSWORD, DB_HOST); 

//***************************/ O problema começar aqui e o código buga....
$registry->addElement( 'connection_1', $connection );    
																	
$registry = Registry::getInstance();
 
$connection = 'connection_1';
 
if( $registry->existsElement( $connection ) ){
    $oracle = $registry->getElement( 'connection_1' );//Ou connection_2
}

E já li algumas coisas e mexi e remexi código, mas sem êxito...

 

Share this post


Link to post
Share on other sites
4 horas atrás, Ericsson Berg disse:

kkkkkk, tirei o include_once mas deixei o include, porque traz as variáveis com o Select, achei a melhor forma de utilizar.

Não existe oque você está fazendo, seja com require, include ou require_once.

 

O problema é que você está querendo usar o paradigma procedural inteiro dentro de classes, achando que isso é programar em OOP, apesar do PHP ser hibrida, tem que saber separar os conceitos.

 

O que tem dentro disso?

veic_lb_ll.php

Sobre a Registry, que desse um include nela ou use um Autoload

Share this post


Link to post
Share on other sites

Dentro de veic_lb_ll.php tem as querys;

 

$sql1 = "Select query 1";

$sql2 = "Select query 2";

[...]         
include('veiculos/veic_lb_ll.php'); //Inclusão das querys
$dados1 = $this->query1($sql1);  //Realiza o Select 1
$dados2 = $this->query2($sql2);  //Realiza o Select 2
[...]    

Quanto a Registry, fiz o código acima e dei uma include.

Vou ver como fazer com o Autoload.

Share this post


Link to post
Share on other sites

Mas pra isso não precisa de include, você pode montar o select na própria classe veículos.

E deixar o construtor de Query fora da classe de conexão e, para usar na classe Veículos, é só instanciar através do construtor. Já que é uma abstração e não uma implementação. 

 

Um exemplo simples:

 

/**
 * Class Veiculos
 */
class Veiculos
{

    /**
     * @var QueryBuilder
     */
    protected $builder;

    /**
     * Veiculos constructor.
     */
    public function __construct()
    {
        $this->builder = new QueryBuilder();
    }


    /**
     * @return object
     */
    public function queryFoo()
    {

        $sql = "SELECT * FROM foo WHERE .......LIMIT 1";

        return $this->builder->query( $sql );

    }

    /**
     * @return object
     */
    public function queryBar()
    {

        $sql = "SELECT * FROM bar WHERE ....... ORDER BY ASC";

        return $this->builder->query( $sql );

    }

}

 

 

QueryBuilder

require_once 'registry.php';

/**
 * Class QueryBuilder
 */
Class QueryBuilder {


    /**
     * @var
     */
    private $conn;

    /**
     * QueryBuilder constructor.
     */
    public function __construct()
    {
        $this->conn =  registry::getInstance()->get('nome_da_conexao');
    }

    /**
     * @param $sql
     * @return object
     */
    public function query($sql)
    {
        $statement = oci_parse($this->conn,$sql);
        oci_execute($statement);
        $data = oci_fetch_object($statement);
        oci_free_statement($statement);
        return $data;
    }

}

Lembrando que o arquivo de conexão não tem nada haver com essas duas classes acima, você tem que criar separadamente. 

Uma dica é usar inversão de dependência e, injetar, mas pra quem  já ta apanhando, seria meio complexo.

Share this post


Link to post
Share on other sites

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

  • Similar Content

    • By Vinicius Bazan
      Estou tendo um problema em elaborar o meu código com javascript, estou fazendo um teste em html e css simples pra depois elaborar um website, o objetivo aqui é fazer um relógio pelo JS e ter um contador em baixo desse relógio que vai pegar valores a partir de um switch para esse contador funcionar, isso porque se trata de dados sobre tipos de agressões contra as mulheres, então os cases do switch tem o dado em segundos para executar a formula, uma mensagem inicial e uma mensagem final.
       O usuário teria dois botões, um de cada lado (nesse caso estou usando 2 div com as ID's #btd e #bte, ao apertar esses botões aumentaria o valor de uma variável em +1 ou -1 e isso faria o switch escolher outro case e trocar os dados do contador, mas os dados não são trocados, mantendo as informações iniciais.
       Ao todo tem 4 funções, a função relogio(), contador(), btd() e bte(), sendo que a btd e bte estão dentro da contador() 
       Estou colocando o codigo dentro do spoiler, se alguém puder me ajudar a achar alguma solução agradeço
       
      OBS: Eu nem sei se pode ter uma function dentro da outra, mas como estou aprendendo JS ainda, imagino que assim como outras estruturas (If, Else, Switch, etc...) possa ser possível colocar uma função dentro da outra.
       
       
    • By Vinicius Bazan
      Galera to com uma duvida aqui, no javascript é possível fazer uma função dentro de outra e uma acessar os valores de uma var da outra?
       
      Por exemplo digamos que eu tenha uma function a() e uma function b(), eu preciso que a function a utilize valores de variáveis que estarão na function b, se isto for possível a função b terá que estar dentro de a ou seria ao contrario?
    • By camisbales
      Olá,
      preciso resolver o seguinte exercício:
      Uma professora de programação, cansada de que os estudantes cheguem tarde, decidiu que vai cancelar a aula se há poucos presentes.
      Ela representa a entrada dos estudantes como um array de tempos de chegada tarde, em minutos. Por exemplo, se um estudante chegou 10 minutos atrasado, outro 5 minutos antes da hora, outro com 3 minutos de atraso, e outro pontual, poderá representar assim:
      var alunosDaSegunda = [10, -5, 3, 0];
      Com essa informação e a quantidade mínima de estudantes para que suceda o curso, a professora quer saber se a aula acontecerá. Por exemplo, supondo que a quantidade mínima de estudantes para que a aula aconteça é de 2 alunos, então o curso da segunda-feira se realizará, porque houve um estudante que foi pontual e um estudante que chegou cedo.
       acontece(alunosDaSegunda, 2)
      true
      Mas se a quantidade mínima fosse 3, a aula não aconteceria:
       acontece(alunosDaSegunda, 3)
      false
      Escreva as seguintes funções: 1. acontece, que diz se a aula sucederá de acordo com o array dos estudantes que entraram. 2. aberturas, que utiliza um array com os arrays dos estudantes que entraram nos outros dias, e a quantidade mínima de estudantes, e diga quais os dias em que as aulas aconteceram e quais não. Por exemplo:
      aberturas([alunosDaSegunda, alunosDaTerça, alunosDaQuarta], 2)
      [true, false, false]
      A seguir o código que eu escrevi e os erros apresentados:
      function acontece (alunosDia, quorum){
          let resultado = [];
          for (let i = 0; i < alunosDia.length; i++){
          if (alunosDia <= 0){
          resultado.push (alunosDia);}
          if (resultado.length >= quorum) {
          return true;}
          }
      }
          
      function aberturas (alunosDia, quorum){
          let resultadoArray = [];
          for (let i = 0; i < alunosDia.length; i++){
          resultadoArray.push(acontece(alunosDia, quorum));
          }
      }
      ERROS
      acontece([10, -5, 3, 0], 4) - deveria retornar false;
       acontece([10, -5, 3, 0], 3 - deveria retornar false;
       aberturas([[0, 0, 3, 0], [1, 2, 4, 5], [0, 0, -1]], 3) - undefined deepEqual [ true, false, true ];
       aberturas([[0, 0, -3, 0], [1, 2, 4, 5], [0, 0, -1]], 4) - undefined deepEqual [ true, false, false ].
       
    • By carlosguimaraes1801
      Olá,
       
      Gosto muito de programação, mas comecei a programar a pouco tempo.
      Recentemente decidimos fazer uma grande modificação no site da empresa na qual sou sócio.
       
      Deu tudo certo, mas achei uma limitação no LearnPress, o plugin de gerenciamento de cursos que utilizamos. Gostaríamos de exibir os preços parcelados abaixo do valor integral de cada curso cadastrado no LearnPress.
       
      Como não encontrei nenhum add-on ou algo pronto na internet, criei a seguinte function que calcula o preço parcelado de cada curso, com valor mínimo da parcela de R$9,00 e a adicionei ao arquivo functions.php do Wordpress.
       
      Eu testei a function e ela funcionou perfeitamente.
       
      <?php /*------------------CALCULA O PREÇO PARCELADO------------------*/ function installment_price_course($nparcelas, $sale_price) { $sale_price = (float)$sale_price; $pparcelado = $sale_price/$nparcelas; if ($sale_price < 9) { $nparcelas = 1; $pparcelado = $sale_price; echo $nparcelas.' x R$ '.number_format($pparcelado, 2, ",", ".").' sem juros'; } else { if ($pparcelado >=9) { $nparcelas = 12; echo $nparcelas.' x R$ '.number_format($pparcelado, 2, ",", ".").' sem juros';} else { for ($nparcelas = 12; $nparcelas >= 1; $nparcelas--) { $pparcelado = $sale_price/$nparcelas; if ($pparcelado >= 9) { break; } } echo $nparcelas.' x R$ '.number_format($pparcelado, 2, ",", ".").' sem juros'; } } } /> No entanto, ao chamar a function com os parâmetros (12, $price) aparecem o seguinte erros:
       
      Warning: A non-numeric value encountered in /home/.../eduma-child/functions.php on line 101 1x R$ Warning: number_format() expects parameter 1 to be float, string given in /home/.../eduma-child/functions.php on line 106 sem juros  
      Pensei que poderia ser que a variável $price fosse uma string. Então inseri o seguinte trecho na function para converter a string em float:
      <?php $sale_price = floatval($sale_price); ?> Após inserir esse trecho o erro desapareceu mas o valor parcelado mostrado é 0. O estranho é que se eu substituo o parâmetro variável por um número qualquer, ele retorna o valor parcelado corretamente.
       
      Segue o código da página de curso.
       
      <?php defined( 'ABSPATH' ) || exit(); $user   = LP_Global::user(); $course = LP_Global::course(); $class = ''; $class .= ( $course->has_sale_price() ) ? ' has-origin' : ''; if ( $course->is_free() ) {     $class .= ' free-course'; } if ( ! $price = $course->get_price_html() ) {     return; } ?> <div class="course-price">     <div class="value <?php echo $class;?>">         <?php if ( $course->has_sale_price() ) { ?>             <span class="course-origin-price"> <?php echo $course->get_origin_price_html(); ?></span>         <?php } ?>         <?php echo $price; ?>     </div>     <span style="font-size: 14px; font-weight: normal"><?php installment_price_course (12, $price);?></span> </div> ?>  
      --------- Atualização ---------
      Também notei que se eu defino uma variável $price2 e atrubuo um valor qualquer a ela, posso usá-la sem problemas como parâmetro da function. Ex.:
       
      (installment_price_course (12, $price);  
      Além disso, a variável $price está ok e ela mostra o preço integral do curso normalmente. Testei-a com o echo $price e está ok.
       
      ------------------
       
      Alguém poderia me ajudar? Será que isso que estou tentando fazer de colocar uma variável na chamada da function é incorreto?
      Preciso muito solucionar este problema.
       
      Desde já agradeço a atenção de todos.
    • By Guss
      A programadora Cafiaspirina Cruz deseja que todos os elementos <h2> de sua página ganhassem a classe "titulo", para que depois a fonte dos <h2> pudesse ser modificada por um CSS,  deixando-os com um destaque específico. Escreva abaixo um código em Javascript para que todos os <h2> da página ganhem a classe "titulo" de uma única vez?
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.