Jump to content
Sir Pereira

Header "Dinâmico"

Recommended Posts

Sir Pereira

Boas pessoal,

estou a trabalhar na PAP, e estou aqui com uma dúvidazita.

Comecei agora a incorporar o login e os sessions, e como tal, tenho numa página que é anexada a todas as outras (tpl/head.php) o seguinte excerto de código (e mais um bocado que não interessa para a questão):

<?php

session_start();

if (!$_SESSION['id']) {
header('Location: login.php');
}

include(ROOT_DIR.'/tpl/header.php');

?>

No entanto, eu para os directórios baterem todos certo com um directório base, um root, tenho um ficheiro config.php que me define um caminho geral, neste caso:

define( 'ROOT_DIR', dirname(__FILE__) );

define( 'HTTP_DIR', 'http://localhost/scie/v3' );

No entanto, eu queria acrescentar este código ao código que tenho acima do head.php, mas não estou a conseguir.

Se puser algo como:

<?php

session_start();

if (!$_SESSION['id']) {
header('Location: '.ROOT_DIR.'login.php');
}

include(ROOT_DIR.'/tpl/header.php');

?>

Ele simplesmente não me está a reencaminhar para lado nenhum, no entanto se tirar isso, tal como o 1º código, ele reencaminha sem problemas.

Alguém tem sugestões?

Cumps

Share this post


Link to post
Share on other sites
mjamado

Caminho <> URL

O que tens na constante ROOT_DIR é um caminho, e o header location está à espera de um URL.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
scorch

Não. Repara, tu dás-lhe um C:\xpto (por exemplo) e ele quer um http:// . :P


PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.

Share this post


Link to post
Share on other sites
mjamado

Caminho <> URL!!

Caminho: /var/www/www.teusite.com/public_html/index.php

URL: http://www.teusite.com/index.php

Não podes construir um caminho a partir de URL, nem um URL a partir de um caminho.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
Sir Pereira

Bom, nesse caso utilizei o HTTP_DIR.

<?php

session_start();

if (!$_SESSION['id']) {
header('Location: login.php');
}

include(ROOT_DIR.'/tpl/header.php');

?>

Mas parece-me que ele me está a criar um loop infinito ou algo do género, pois não abre nenhuma das páginas (nem a do index.php que vai fazer include à head.php) nem a do login.php.

Código da parte de cima da login.php:

<?php require('config.php');
require(ROOT_DIR.'/funcoes.php');

if ((isset($_REQUEST['id'])) AND (isset($_REQUEST['pwd']))) {
	$verLogin = verificaLogin($_REQUEST['id'],$_REQUEST['pwd']);
	if ($verLogin == true) {
		session_start();
		$_SESSION['id'] = $_REQUEST['id'];
		header("Location: index.php");
	} else { $wrongfields = 1; }
}

require(ROOT_DIR.'/tpl/head.php');
?>

(com código de formulário depois no body)

e código da index.php (mas penso que não tenha nada a ver com isto:

<?php require('config.php'); ?>
<?php require(ROOT_DIR.'/tpl/head.php');

if (isset($_REQUEST['terminarsessao'])) {
	$var1 = '1'; //estas vars são para debug, só para saber até onde ele vai (com echos no código)
	if ($_REQUEST['terminarsessao'] == true) {
		$var2 = '2';
		if (isset($_SESSION['id'])){
			$var3= '3';
		  session_unset(); // Eliminar todas as variáveis da sessão
		  session_destroy(); // Destruir a sessão
		  $var4='4';
		}
	}
}
?>

Do que será?

Share this post


Link to post
Share on other sites
socopo

Continuas a usar a path em vez do URL! Usa a constante HTTP_DIR.

Tenta alterando os requires por includes (nunca percebi qual a diferença). Caso não for isso experimenta em todos os includes/requires alterar para include_once/require_once. Pode ser que estejas a importar um ficheiro várias vezes n sei

E a session_start() pela experiência que tenho é pôr sempre no inicio da página!

Share this post


Link to post
Share on other sites
Sir Pereira

O código que eu tinha era:

<?php

session_start();

if (!$_SESSION['id']) {
header('Location: '.HTTP_DIR.'/login.php');
}

include(ROOT_DIR.'/tpl/header.php');

?>

(esqueci-me foi de o pôr aqui modificado :P )

Mas a session start, naquele fica sempre no início da página - senão até dava o erro dos headers já terem sido enviados.

E porquê alterar? O require simplesmente não te deixa correr até ao fim da página sem o ficheiro em questão, o include inclui o seu conteúdo (?).

É que isto nem me deixa entrar nem no login.php nem no index.php ->

A página não está a redireccionar correctamente

          O Firefox detectou que o servidor está a redireccionar o pedido para este endereço de modo a que o processo nunca esteja concluído.

Não percebo é porquê  :dontgetit:

Share this post


Link to post
Share on other sites
brunoais

Tens isso na página login.php? (se tens é óbvio q ele mostre esse erro)


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
socopo

poe aqui o código como tens actualmente de todos os ficheiros envolventes que eu logo resolvo o problema. Agora n tenho mt tempo

Share this post


Link to post
Share on other sites
Sir Pereira

Já tratei disso, era mesmo um problema de lógica.

No entanto agora estou com outro problema. Quero ter uma verificação em todas as páginas para ver se a sessão ainda está aberta. Todas as páginas incluem o ficheiro head.php, como tal coloquei lá um session_start:

tpl/head.php

<?php

session_start();

include(ROOT_DIR.'/tpl/header.php');

?>

No entanto agora no index.php precisava de fazer uma verificação caso receba um REQUEST de terminarsessao=true, então ele faz unset da sessão, mas...

index.php

<?php require('config.php');

//COMEÇA A SESSAO
//SENAO EXISTIR REENCAMINHA
require(ROOT_DIR.'/tpl/head.php');

if (isset($_REQUEST['terminarsessao'])) {
	//$var1 = '1';
	if ($_REQUEST['terminarsessao'] == true) {
		//$var2 = '2';
		if (isset($_SESSION['id'])){
			//$var3= '3';
		  session_unset(); // Eliminar todas as variáveis da sessão
		  session_destroy(); // Destruir a sessão
		  //$var4='4';
		}
	}
}

require(ROOT_DIR.'/sessao/check.php');

?>

sessao/check.php

<?php

//VERIFICA SE A SESSÃO ESTÁ ACTIVA

if (!$_SESSION['id']) {
header('Location: '.HTTP_DIR.'/login.php');
}

?>

O objectivo até era colocar o código do sessao/check.php no código do tpl/head.php, no entanto eu logo a seguir a iniciar a sessão tenho que verificar se pretendo terminar a sessão ou não, porque se faço o header antes não me faz a verificar do terminarsessao, e acho que é isso que causa o loop, mas com o código assim, ele não me deixa terminar a sessão porque estou a fazer o check (que inclui um header dentro do código) já depois de ter havido output.

Mas sinceramente já estou confuso. Alguém que me venha aqui libertar um pouco as ideias?  :wallbash:

Share this post


Link to post
Share on other sites
socopo

Pois isso é uma regra do php, há servidores que a cumprem e não deixam mudar o header depois de enviar algum output e à outros que deixam. Eu pelo menos tenho essa experiência porque usava o Wamp que deixava e agora uso o Mamp que não deixa.

Para o teu problema a solução é pores o session_start() fora do header.php e poes-lo sempre no inicio e assim podes pôr o header.php só depois de fazer todas as instruções que podem originar um uso de header().

Eu usei algo parecido com  esta estrutura nos meus últimos projectos

[*]session_start();

[*]importar Constantes

[*]fazer ligação a BD

[*]condições de mudança de header (autenticação ou por outro motivo qualquer)

[*]funções usadas na página

[*]$extraHead[]= ""; //adicionar linhas ao <head>, importar javascript, css, ou metatags, com um array que será "imprimido" em header.php

[*]include("header.php"); //cabeçalho da página inclui extraHead se existir

[*]Corpo especifico da página

[*]include("footer.php"): //imprime o rodapé e fecha base de dados

Share this post


Link to post
Share on other sites
mjamado

Pois isso é uma regra do php, há servidores que a cumprem e não deixam mudar o header depois de enviar algum output e à outros que deixam. Eu pelo menos tenho essa experiência porque usava o Wamp que deixava e agora uso o Mamp que não deixa.

Nenhum servidor deixa enviar headers depois de enviado conteúdo. Isso não faz sentido, porque, para existir conteúdo enviado, os headers foram enviados no início desse mesmo conteúdo (nem que tenha sido apenas o http status).

A configuração que te levou a pensar isso, porque "parece" que é isso que acontece, nem sequer está relacionada com headers: é a output_buffering que, como o nome indica, desvia o envio de conteúdo para um buffer, esvaziado quando atingir o limite ou quando a execução terminar. Neste caso, apesar de já ter sido colocado conteúdo no buffer, os headers ainda estão em aberto, porque ainda não foram enviados para o cliente e, como tal, ainda os podemos modificar.

De qualquer forma, é melhor não deduzir se o buffer já foi esvaziado ou não, e controlar como e quando é enviado conteúdo, por via das instruções ob_*.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
socopo

Nenhum servidor deixa enviar headers depois de enviado conteúdo. Isso não faz sentido, porque, para existir conteúdo enviado, os headers foram enviados no início desse mesmo conteúdo (nem que tenha sido apenas o http status).

A configuração que te levou a pensar isso, porque "parece" que é isso que acontece, nem sequer está relacionada com headers: é a output_buffering que, como o nome indica, desvia o envio de conteúdo para um buffer, esvaziado quando atingir o limite ou quando a execução terminar. Neste caso, apesar de já ter sido colocado conteúdo no buffer, os headers ainda estão em aberto, porque ainda não foram enviados para o cliente e, como tal, ainda os podemos modificar.

De qualquer forma, é melhor não deduzir se o buffer já foi esvaziado ou não, e controlar como e quando é enviado conteúdo, por via das instruções ob_*.

Obrigado pela correcção :thumbsup: nunca pesquisei muito sobre o assunto, apenas tinha reparado nisso quando mudei para o Mamp e surgiu-me essa problema. Mas nunca me preocupei em saber o que fazia com que no Wamp desse para mudar o Header depois de fazer output.

Share this post


Link to post
Share on other sites
Sir Pereira

Hmm, então é isso.

Alterei o código assim e já funcionou:

<?php require('config.php');

session_start();

if (isset($_REQUEST['terminarsessao'])) {
	//$var1 = '1';
	if ($_REQUEST['terminarsessao'] == true) {
		//$var2 = '2';
		if (isset($_SESSION['id'])){
			//$var3= '3';
		  session_unset(); // Eliminar todas as variáveis da sessão
		  session_destroy(); // Destruir a sessão
		  //$var4='4';
		}
	}
}

require(ROOT_DIR.'/sessao/check.php');

//COMEÇA A SESSAO
//SENAO EXISTIR REENCAMINHA
require(ROOT_DIR.'/tpl/head.php');

?>

</head>

O chato disto tudo vai ser agora em todas as páginas tar a mudar o header :)

Mas já trato disso, obrigadíssimo :thumbsup:

Resolvido!

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

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.