Ir para conteúdo

POWERED BY:

Arquivado

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

Nerdmonkey

500.shtml

Recommended Posts

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;
else:
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;
else:
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';
else:
$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;
else:
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! :)

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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;

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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)

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.