Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Ah! A programação... é por isso que gosto dela. Uma hora, funciona, então de repente, já não funciona mais.
É emoção o tempo todo :v
O problema dessa vez é o título do post. Já pesquisei e pelo que entendi é um redirecionamento feito .htaccess para erro do tipo 500, porém, a pergunta que não quer calar é, porque agora e do de repentemente?
O erro só acontece ao incluir a página home.php que é a página inicial.
O .htaccess
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
</IfModule>
A classe que inclui a página
class IncludePage {
private $page;
private $pieceOfUrl;
// Call the methods automatically
public function __construct($pieceOfUrl) {
$this->pieceOfUrl = $pieceOfUrl;
$this->definePage();
$this->includeFile();
}
/**
* <b>checkProduct(): </b>Check if we are look for an ads
*
* @return boolean
*/
private function checkProduct() {
$read = new Read;
$read->ExeRead('table', '*', 'WHERE modelo_tratado = :filter', "filter={$this->pieceOfUrl}");
if($read->getResult()):
$clicks = new RegistryClicks('product', $this->pieceOfUrl);
$clicks->registryClick();
return true;return false;
endif;
}
/**
* <b>checkCategory(): </b>Check if we are look for an category or a search
*
* @return boolean
*/
private function checkCategory() {
$read = new Read;
$read->ExeRead('table', '*', 'WHERE nome_tratado = :filter', "filter={$this->pieceOfUrl}");
if($read->getResult()):
$clicks = new RegistryClicks('category', $this->pieceOfUrl);
$clicks->registryClick();
return true;return false;
endif;
}
/**
* <b>definePage(): </b> Define the value for $this->page
*
* @return string The page to be include
*/
private function definePage() {
if(empty($this->pieceOfUrl)):
$this->page = 'home.php';
elseif(file_exists("pages/{$this->pieceOfUrl}.php")):
$this->page = "{$this->pieceOfUrl}.php";
elseif($this->checkProduct() == true):
$this->page = 'anuncio.php';
elseif($this->checkCategory() == true || $this->pieceOfUrl == 'search'):
$this->page = 'pesquisa.php';$this->page = '404.php';
endif;
}
/**
* <b>includeFile(): </b> Include the page
*
* @return boolean
*/
private function includeFile() {
if(require_once DIR . "pages/{$this->page}"):
return true;return false;
endif;
}
}
E por fim, a chamada de tudo isso na index.php
$sep=explode('/',filter_input(INPUT_GET,'url',FILTER_DEFAULT));
$page = new IncludePage($sep[0]);
Não se espantem com o código, ele funciona. Exceto no trecho que inclui a home.php, que funcionava e agora e agora ele criou essa paixão compulsiva e desconhecida pela página 500.shtml :v
Agradeço muito quem puder ajudar! :)
Obrigado pela dica Beraldo. Vou checar com meu host.
Beraldo, poderia me ajudar com uma dúvida?
Utilizando-se a mesma lógica do código acima, com o .htaccess redirecionando todo fluxo para a index.php:
index.php
...
// Objeto criado na index, algumas linhas acima do objeto da classe que inclui as páginas
$sys_config = new ReadId(1, "{$prefix_table}config");
Se eu for no arquivo header.php e usar $sys_config->any_method(), vai funcionar. Agora se eu usar a mesma sintaxe em qualquer página que está sendo incluída pela classe de inclusão, nao funciona e eu preciso redeclarar o objeto. Esse comportamento é normal?
Se dá erro de classe não encontrada, o arquivo da classe não está sendo incluído devidamente.
Verifique de novo o fluxo da aplicação e os includes/requires
Habilite todas as exibições de erro, como mostrado neste tópico, na Orientação No. 2. Vai ajudar no debug
Olha como está a index
// Configure errors
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors',1);
$prefix_table = 'app_';
// Configuration of system per the database
$sys_config = new ReadId(1, "{$prefix_table}config");
Agora na home, que é a página que está sendo incluída e não herda as variáveis da index.php
// Redeclarate object and work fine
$prefix_table = 'app_';
$sys_config = new ReadId(1, "{$prefix_table}config");
// Comment and it stop work
//$prefix_table = 'app_';
//$sys_config = new ReadId(1, "{$prefix_table}config");
Os demais objetos funcionam, desde que sejam incluídos diretamente na página que estão solicitando o uso do mesmo, por exemplo:
Ainda na home...
// It is enough, the autoload works and the class also
$rate = new Rate($iten_slider->id_produto);
O erro retornado é que não encontrou a variável que estou tentando usar, não chega a travar o sistema porque é não é um erro fatal, mas ai o trecho em específico, não funciona.
Undefined variable: sys_config
D:\Server\public_html\pages\home.php
O detalhe é, até o arquivo header.php funciona, só deixa de funcionar quando entra na página logo abaixo do header.
tente usar o user namespace talvez der certo.. não vai precisar de includes :ph34r:
Não entendi direito sua estrutura... quem faz include de quem?
Se $sys_config está definido em um arquivo externo, provavelmente está faltando o require/include dela no script onde dá erro
Vou postar o código completo da index.php pra você entender o que estou fazendo Beraldo ;)
<?php
// Configure errors
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors',1);
// Settings
header("Cache-Control: must-revalidate");
header( "Expires: " . gmdate("D, d M Y H:i:s", time() + 60 * 60 * 24 * 3) . " GMT" );
header( 'Content-Type: text/html; charset=utf-8' );
setlocale( LC_ALL, 'pt_BR', 'pt_BR.utf-8', 'pt_BR.utf-8', 'portuguese' );
date_default_timezone_set( 'America/Sao_Paulo' );
ob_start();
session_start();
// Configuration of system
require_once './api/Config.inc.php';
$config = new Config;
// Check session from user's logged
$session_logged = new CheckUserLogin;
// Table prefix
$prefix_table = 'app_';
// Validation functions
$validation = new Valid; <================================ ESSA VARIÁVEL não é reconhecida nas páginas que serão incluídas abaixo, porém no header.php, funciona.
// Navigator main
$main = new Main; // Esse é o menu, também funciona
// List all categories
$all_categories = new AllCategories; // Esse também funciona
// Configuration of system per the database
$sys_config = new ReadId(1, "{$prefix_table}config"); <================================ ESSA VARIÁVEL não é reconhecida nas páginas que serão incluídas abaixo, porém no header.php, funciona.
// Variables
$no_inc=filter_input(INPUT_GET,'no_inc',FILTER_DEFAULT);
$sep=explode('/',filter_input(INPUT_GET,'url',FILTER_DEFAULT));
$getSearch=filter_input(INPUT_GET,'p',FILTER_DEFAULT);
$titulo=new Titulo($sep[0], $getSearch);
/**
* @include header.php
* Include the header for all pages in this project
*
* @include footer.php
* Include the footer for all pages in this project
*
* @var mixed[] $page
* Include the page based on GET url set on .htaccess
*/
if(!isset($no_inc)):
include_once './templates/inc/header.php';
endif;
$page = new IncludePage();
if(!isset($no_inc)):
include_once './templates/inc/footer.php';
endif;header.php é um script provavelmente sem funções. Por isso ele identifica as variáveis externas a ele
IncludePage() é uma classe e seus métodos só vêm variáveis globais
Você pode forçar os métodos a verem uma variável usando isto dentro do método:
global $var;
Veja mais detalhes aqui
Eu entendi o lance com a global, ela vai definir uma variável sendo global fora do escopo onde ela está. Logo todos podem usar o valor dela.
Mas como eu faria isso pra uma função, porque pelo que entendi só se aplica as variáveis e preciso retornar o método 'x'.
Pode me dar um exemplo do uso da global na minha index.php Beraldo?
"global" vai dentro de funções e métodos
No seu caso, vai dentro do construtor de IncludePage, que, pelo que entendi, é quem faz os includes
Sim, desculpe minha ignorância Beraldo mas, não consigo encontrar um contexto para inserir "global" dentro do __construct
function __construct($no_inc = null) {
$this->no_inc = $no_inc;
$this->run_url();
$this->includePage();
// ? global ? não é possível atribuí-la à $this
}
Obs.: Só mudei o nome dos métodos mas a essência é a mesma.
Não é obrigatoriamente no __construct(). Você tem que incluir a declaração "global" no método que usa a variável global, definida no index.php (aparentemente é no includePage(), olhando seu código)
Erro 500 é só um código genérico
Veja o arquivo de logs do Apache para ver a mensagem de erro detalhada