Ir para conteúdo

POWERED BY:

Arquivado

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

Nerdmonkey

Falha ao instanciar conexão em página que recebe include_once

Recommended Posts

Boa noite pessoal.
Saberiam me dizer porque sempre que tento utilizar a variável $pdo em uma página incluida nesse trecho:
/**
 * Set page
 */
include_once __DIR__ . '/controller/define_page.php';
$page = new Pagina;
$page->setPage( $urr, $one, $row_try_cat );
preciso fazer novamente
$pdo = Database::conexao();
e
include_once __DIR__ . '/model/funcoes/funcoes.php';
$funcoes = new valid();
Index.php
<?php
/**
 * Display errors
 */
error_reporting( E_ALL );
ini_set( 'display_errors', 1 );
 
/**
 * Session
 */
session_start();
 
/**
 * Charset
 */
header( "Content-Type: text/html; charset=utf-8" );
 
/**
 * Flux
 */
ob_start();
 
$urr = addslashes( trim( $_GET[ 'url' ] ) ) ? addslashes( trim( $_GET[ 'url' ] ) ) : addslashes( trim( $_POST[ 'url' ] ) );
$sep = explode( '/', $urr );
$one = $sep[ 0 ];
$too = $sep[ 1 ];
$tre = $sep[ 2 ];
 
/**
 * Conection
 */
include_once __DIR__ . '/controller/define_conn.php';
$pdo = Database::conexao();
 
/**
 * Functions
 */
include_once __DIR__ . '/model/funcoes/funcoes.php';
$funcoes = new valid();
 
/**
 * User data log
 */
include_once __DIR__ . '/controller/define_log.php';
 
/**
 * System configuration
 */
include_once __DIR__ . '/controller/define_config.php';
 
/**
 * Header
 */
include_once __DIR__ . '/view/inc/header.php';
 
/**
 * Define url
 */ 
include_once __DIR__ . '/controller/define_url.php';
 
/**
 * Set page
 */
include_once __DIR__ . '/controller/define_page.php';
$page = new Pagina;
$page->setPage( $urr, $one, $row_try_cat );
 
/**
 * Footer
 */
include_once __DIR__ . '/view/inc/footer.php';
?>

 

Caso contrário dá erro fatal dizendo que não existe o objeto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que esse cara faz: /controller/define_config.php ? poste ele.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ele configura partes diversas do sistema.

 

 

<?php
// Config
$sql_config = $pdo->prepare( "SELECT * FROM config" );
$exe_config = $sql_config->execute();
$row_config = $sql_config->rowCount();
 
if( $row_config > 0 )
{
$lin_config      = $sql_config->fetch( PDO::FETCH_OBJ );
$exibir_busca    = $lin_config->exibir_busca;
$exibir_ban_p    = $lin_config->exibir_ban_patro;
$excluir_inatios = $lin_config->excluir_inatios;
$limite_a        = $lin_config->limite_anuncios;
$limite_s        = $lin_config->limite_servicos;
$limite_c        = $lin_config->limite_contas;
$itens_pp        = $lin_config->itens_pp;
$facebook        = $lin_config->facebook;
$google          = $lin_config->google;
$twitter         = $lin_config->twitter;
$sobre           = $lin_config->sobre;
$termos          = $lin_config->termos;
}
?>

Não estou vendo erro na lógica. Chamo o header, depois chamo a página e por fim o footer.

 

E lembando da matemática rs, da união de conjuntos

 

 

 
$page->setPage( $urr, $one, $row_try_cat );
 

 

está contido em index.php, logo... $pdo estaria acessível em $page, não é isso ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Poste uma tentativa sua de utilizar a variável $pdo

Acho q você está esquecendo do escopo..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não. Quando instancio de novo, funciona!

 

 

$sql_s_adm = $pdo->prepare( "...

 

Da erro de cara. Diz que a variável pdo foi chamada a um não objeto. Ai vou lá e crio o objeto logo acima, no caso, na página que terá a query, e funciona.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Instancia de novo o que ?

isso aqui é um estático de um Singleton:

$pdo = Database::conexao();
você não está instanciando de novo. O Singleton impede isso.

 

--

 

Vamos lá, esse cara aqui:

$page = new Pagina;
$page->setPage( $urr, $one, $row_try_cat );
dentro da classe Pagina, ela chama a variavel $pdo ?

 

Se a resposta for sim, então você está errando no escopo.

Se tiver dúvidas, poste o trecho da classe página que utiliza o $pdo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok.

Então, não chamo nenhum método, apenas verifico a url pra definir a página atual

 

 

class Pagina { 
 
private $url;
 
public function setPage( $url, $one, $load_cat ){
if( empty( $url ) ){
include_once 'view/pages/home.php';
}elseif( is_file( 'view/pages/' . $url . '.php' ) ){
include_once 'view/pages/' . $url . '.php';
}else{
include_once 'view/pages/404.php';
}
} 
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, qual cara dentro de onde tenta usar a variavel $pdo ?

 

Curiosidade: qual framework é esse ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

A página que está sendo incluída. Ai dentro dessa página, se tiver uma consulta, ele acusa erro na variável $pdo.

Não é um framework ainda. Eu mesmo que fiz... 4 anos fazendo isso rsrs... e ainda tem muito que melhorar. Mas vlw pela comparação à um :D

 

Esse erro não existia, ai você para pra revisar e debugar o código dá isso kkkk

 

Você consegue ver, pelas linha até aqui, -porque não tem milhões de atrelações não, é isso ai mesmo, simples e prático rs.- alguma inconsistência. Que ódio desses bugs secretos!!

 

 

Para funções, a solução foi declarar a variável $pdo como Global. Assim dá pra usá-la corretamente no escopo da função.

 

 

Erro retornado

 

Fatal error: Call to a member function prepare() on a non-object in D:\xampp\htdocs\ftp\pcriativa_api\view\pages\home.php on line 26

Registry.php

 

<?phpclass Registry {/*** Instância única de Registry* @var Registry*/private static $instance; /*** Nosso registro* @var ArrayObject*/private $storage; /*** Registry é um caso de uso de Singleton*/protected function __construct() {$this->storage = new ArrayObject();} /*** Recupera um registro utilizando sua chave* @param string $key* @return mixed O valor armazenado* @throws RuntimeException Se não houver um registro para a chave especificada*/public function get( $key ) {if ( $this->storage->offsetExists( $key ) ) {return $this->storage->offsetGet( $key );} else {throw new RuntimeException( sprintf( 'Não existe um registro para a chave "%s".' , $key ) );}} /*** Recupera a instância única de Registry* @return Registry*/public static function getInstance() {if ( !self::$instance )self::$instance = new Registry(); return self::$instance;} /*** Registra um valor à uma chave* @param string $key A chave que será utilizada no registro* @param mixed $value O valor que será registrado* @throws LogicException Se a chave já estiver registrada*/public function set( $key , $value ) {if ( !$this->storage->offsetExists( $key ) ) {$this->storage->offsetSet( $key , $value );} else {throw new LogicException( sprintf( 'Já existe um registro para a chave "%s".' , $key ) );}} /*** Remove o registro de uma chave específica* @param string $key A chave que será removida* @throws RuntimeException Se não houver um registro para a chave especificada*/public function unregister( $key ) {if ( $this->storage->offsetExists( $key ) ) {$this->storage->offsetUnset( $key );} else {throw new RuntimeException( sprintf( 'Não existe um registro para a chave "%s".' , $key ) );}}}

Chamada na página index.php

 

// Conectionrequire_once __DIR__ . '/controller/Registry.php'; $pdo      = new PDO( 'mysql:host=127.0.0.1;dbname=dbname' , 'root', '' );$registry = Registry::getInstance();$registry->set( 'PDO' , $pdo );$pdo     = $registry->get( 'PDO' );

Compartilhar este post


Link para o post
Compartilhar em outros sites

poste os arredores da linha: (10 acima, e 10 abaixo)

 

home.php on line 26
da 16 a 36 mais ou menos..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sem problemas.

Loop padrão

<?php 
$sql_reg = $pdo->prepare( "SELECT * FROM api_hosts" );
$exe_reg = $sql_reg->execute();
$row_reg = $sql_reg->rowCount();
 
if( $row_reg > 0 )
{
$i = 1;
while( $linha_reg = $sql_reg->fetch( PDO::FETCH_OBJ ) )
{
 
?>
 
... interation user
 
<?php } ?>
<?php }else{ ?>
 
<p class="not_found">Nenhum registro</p>
 
<?php } ?>
 
 

Que bosta de erro sem fim kkk


Olha só

 

 

 
Antes....
 
// Conection
require_once __DIR__ . '/controller/Registry.php';
 
$pdo = new PDO( 'mysql:host=127.0.0.1;dbname=api_pcriativa' , 'root', '' );
$pdo = Registry::getInstance()->set( 'PDO' , $pdo );
 
Notice: Undefined variable: pdo in D:\xampp\htdocs\ftp\pcriativa_api\view\pages\home.php on line 26

Fatal error: Call to a member function prepare() on a non-object in D:\xampp\htdocs\ftp\pcriativa_api\view\pages\home.php on line 26
 
Depois...
 
// Set page
include_once __DIR__ . '/controller/define_page.php';
$page = new Pagina;
$page->setPage( $urr );
 

 

Como, se o arquivo está sendo incluído na página ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

isso aqui está errado:

 

$pdo = Registry::getInstance()->set( 'PDO' , $pdo );
o set não retorna nada, ai o teu $pdo fica nulo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

To quebrando a cabeça com isso. Mas é tão elegante e prático que vale a pena.

 

O get retorna erro

 

 

$pdo = Registry::getInstance()->get( 'PDO' , $pdo );
 
Aqui estou dizendo ao método getInstance() que a minha conexão atual esta na variável $pdo, certo ?
 
ERROR
Fatal error: in D:\xampp\htdocs\ftp\pcriativa_api\controller\Registry.php on line 32

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.