Jump to content

[Resolvido] Mostrar mensagem de erro


bioshock

Recommended Posts

Boas,

O meu código estava a funcionar bem em localhost, no entanto quando o passei para o servidor começou me a dar os erros de 'headers already sent'. Ora, eu sabia a que se devia, mas achei estranho não ter dado em localhost, de maneiras que tive que adaptar o código ao erro.

Inicialmente, o código abaixo estava depois da tag body e funcionava direito (em localhost), ou seja se ele fizesse errado aparecia a mensagem de erro, caso contrário redireccionava para outra página. O que se passa é que neste momento se acertar no login ele continua a redireccionar e bem, mas caso o utilizador falhe as credenciais não é mostrada qualquer tipo de mensagem.

O código está actualmente no topo da página.

<?php
session_start();
include('go_login.php');
$chklogin = new login();
$chklogin->checklogin();

if (isset($_POST['submit'])) {
  $chklogin->log_in();

if (isset($_SESSION['message'])) {
  if ($_SESSION['message'] == 1){
  echo "<script type='text/javascript'>window.location='admin_gest.php'</script>";
  }else{
?>
		<script type='text/javascript'>
			$().toastmessage('showToast', {
				text : 'Username ou Password errados!',
				sticky : false,
				type : 'error'
});
</script>
		<?php
}
 }
}?>

Sugestões?

Edit: Para deixar claro, o script não funciona porque está a ser executado antes da chamada do plugin jquery, que neste caso é:

<script src="jquery/toast/jquery.toastmessage.js" type="text/javascript"></script>
Edited by bioshock
Link to comment
Share on other sites

O meu código estava a funcionar bem em localhost, no entanto quando o passei para o servidor começou me a dar os erros de 'headers already sent'. Ora, eu sabia a que se devia, mas achei estranho não ter dado em localhost, de maneiras que tive que adaptar o código ao erro.

Já passei pelo mesmo problema. Resolvi tirando os _ de todos os ficheiros e variáveis.

Estranha forma de vida que tem a capacidade de transformar comandos em mensagens de erro.

ndsotware.org

Link to comment
Share on other sites

Tens que partir isso aos bocados.

Obviamente, não podes chamar o session_start depois de teres enviado alguma coisa para o browser, que é o que acontece quando tens PHP mal entremeado com HTML - se estavas a chamar session_start depois do body, obviamente que ia dar erro.

Por isso: chamas o session_start logo à cabeça e fechas o bloco PHP; depois do body, então, logo fazes o resto que tens a fazer.

Se bem que lógica operacional no meio do HTML é coisa para me dar pesadelos durante uma semana...

"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.

Link to comment
Share on other sites

Mas óh @mjamado, eu tinha isso correcto. Tinha o meu código estruturado da seguinte forma:

<

<?php
session_start();
include('go_login.php');
$chklogin = new login();
$chklogin->checklogin();?>

<html>
<head></head>
<body>
</body>
<?php if (isset($_POST['submit'])) {
  $chklogin->log_in();

if (isset($_SESSION['message'])) {
  if ($_SESSION['message'] == 1){
	  echo "<script type='text/javascript'>window.location='admin_gest.php'</script>";
  }else{
?>
					<script type='text/javascript'>
							$().toastmessage('showToast', {
									text : 'Username ou Password errados!',
									sticky : false,
									type : 'error'
});
</script>
					<?php
	}
 }
}
?>
</html>

E em localhost funciona bem. Mas quando passei à pouco para o servidor é que começou a dar barraco a nível de headers. Então optei por colocar todo o código no topo, mas dessa forma não aparece a mensagem do plugin toastmessage().

Porque, presumo, para aparecer a mensagem definida tem que estar por baixo da chamada do script do plugin, ou seja, por baixo disto:

<script src="jquery/toast/jquery.toastmessage.js" type="text/javascript"></script>

Link to comment
Share on other sites

Referes-te ao charset? Se sim, não tenho. Mas em que é que isso poderá influenciar?

então tens em ISO-8859-1 ou em UTF8 com BOM ?

é que UTF8 com BOM adiciona um byte que é convertido num byte invisível num editor de texto mas que é interpretado como dados pelo PHP, tornando essa a informação enviada antes do session_start()

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Mas óh @mjamado, eu tinha isso correcto. Tinha o meu código estruturado da seguinte forma:

Ninguém adivinha.

Segue com a solução do HappyHippyHippo, embora não tenha grande fé - em teoria, também devia dar problemas em localhost. Entretanto, se não resultar, dá mais informação sobre o erro. Os erros de PHP dizem sempre em que ficheiro e linha está a dar erro, e não incluíste essa informação (again, a malta não adivinha).

"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.

Link to comment
Share on other sites

Os erros de PHP dizem sempre em que ficheiro e linha está a dar erro, e não incluíste essa informação (again, a malta não adivinha).

Ele pode ter configurado o php para n mostrar os erros.

@bioshock

Usas esta função? Eu não a vejo. É boa ideia usa-la para ter a certeza que os erros aparecem. Há tb um key no php.ini mas n me lembro do nome.

"[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%.

Link to comment
Share on other sites

Ele pode ter configurado o php para n mostrar os erros.
O meu código estava a funcionar bem em localhost, no entanto quando o passei para o servidor começou me a dar os erros de 'headers already sent'.

"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.

Link to comment
Share on other sites

Pois mas esses são 2 servidores diferentes com 2 configurações independentes que facilmente podem ser diferentes. É por aí.

"[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%.

Link to comment
Share on other sites

Viva,

O charset que estou a utilizar é o ISO.

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />

Neste momento tenho o código estruturado da seguinte forma:

<?php
session_start();
include('go_login.php');
$chklogin = new login();
$chklogin->checklogin();?>
<html>
<head></head>
<body>
</body>

<?php
if (isset($_POST['submit'])) {
  $chklogin->log_in();

if (isset($_SESSION['message'])) {
  if ($_SESSION['message'] == 1){
?>
	<script type='text/javascript'>window.location='admin_gest.php'</script>
<?php
  }else{
 ?>
<script type='text/javascript'>
$().toastmessage('showToast', {
text : 'Username ou Password errados!',
sticky : false,
type : 'error'
});
</script>
<?php
}
  }
 echo error_reporting(E_ALL);
}?>
</html>

O que acontece é que ele dá devidamente a mensagem de erro (ou seja aparece o plugin toastmessage) caso o utilizador falhe o login, mas caso o utilizador acerte o login, dá o tal erro dos headers.

Warning: Cannot modify header information - headers already sent by (output started at /htdocs/public/www/admin.php:14) in /htdocs/public/www/go_login.php on line 36

Ora, na linha 36 do ficheiro go_login.php, tenho a seguinte estrutura deste a linha 31 à 39:

if ($query->num_rows() == 1) {
$this->id = $result;
$_SESSION['message'] = 1;
$_SESSION['username'] = $this->username;
$_SESSION['id'] = $this->id;
setcookie("username", $this->username, time() + 3600);
} else {
$_SESSION['message'] = 0;
}
Link to comment
Share on other sites

Ora, na linha 36 do ficheiro go_login.php, tenho a seguinte estrutura deste a linha 31 à 39:

if ($query->num_rows() == 1) {
$this->id = $result;
$_SESSION['message'] = 1;
$_SESSION['username'] = $this->username;
$_SESSION['id'] = $this->id;
setcookie("username", $this->username, time() + 3600);
} else {
$_SESSION['message'] = 0;
}

Ora aí está. Deixa-me adivinhar: esse pedaço de código está dentro da função log_in(), não está?

Lê lá o erro com atenção: está-te a informar que não consegue modificar os headers, porque o output já começou (onde tens a primeira tag HTML); o erro ocorreu na linha 36 do go_login.php, que é um setcookie (sim, definir um cookie altera os headers), chamado pela linha 13 do admin.php.

"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.

Link to comment
Share on other sites

Eu indiquei-te para usares o error_reporting() e tu metes a chamada à função no final do ficheiro... Isso é inútil! Aonde ele é útil é imediatamente depois do primeiro "<?php" e antes do session_start();.

Além do teu problema:

Aonde é que está o doctype?

Aonde é que está a tag <title>?

Porque é que tens uma tag <script> fora do <body>?

"[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%.

Link to comment
Share on other sites

eu não perguntei o charset do HTML, mas sim o enconding de gravação do ficheiro onde se encontra o código

Na gravação do ficheiro não me aparece o encoding, fui no entanto às preferências do notepad++ e vejo lá que por defeito, quando se inicializa um novo documento, é ANSI. Presumo então que os ficheiros sejam gravados nesse encoding. Não sei se responde à tua pergunta?

Ora aí está. Deixa-me adivinhar: esse pedaço de código está dentro da função log_in(), não está?

Lê lá o erro com atenção: está-te a informar que não consegue modificar os headers, porque o output já começou (onde tens a primeira tag HTML); o erro ocorreu na linha 36 do go_login.php, que é um setcookie (sim, definir um cookie altera os headers), chamado pela linha 13 do admin.php.

Optei por melhorar um pouco o código atendendo, se bem percebi, ao que me tentaste dizer.

Portanto, neste momento está estruturado da seguinte forma:

admin.php

<?php
include('go_login.php');
$chklogin = new login();
$chklogin->checklogin();
?>
<html>
<head></head>
<body>
<?php
if (isset($_POST['submit'])) {
$chklogin->log_in();

if (isset($_SESSION['message'])) {
if ($_SESSION['message'] == 1){
?>
<script type='text/javascript'>window.location='admin_gest.php'</script>
<?php
}else{
?>
<script type='text/javascript'>
$().toastmessage('showToast', {
text : 'Username ou Password errados!',
sticky : false,
type : 'error'
});
</script>
<?php
}
}
}?></body></html>

Como podes ver não faço referência ao session_start(), porque creio não ser preciso aqui e por causa dos cookies, de maneiras que o outro código, que está em go_login.php, está agora da seguinte forma:

if ($query->num_rows() == 1) {
setcookie("username", $this->username, time() + 3600); // primeiro cookies
$this->id = $result;
session_start(); // inicia a session
$_SESSION['message'] = 1;
$_SESSION['username'] = $this->username;
$_SESSION['id'] = $this->id;
} else {
$_SESSION['message'] = 0;
}

O meu objectivo foi então colocar os cookies antes de qualquer outro output de headers.

Eu indiquei-te para usares o error_reporting() e tu metes a chamada à função no final do ficheiro... Isso é inútil! Aonde ele é útil é imediatamente depois do primeiro "<?php" e antes do session_start();.

Além do teu problema:

Aonde é que está o doctype?

Aonde é que está a tag <title>?

Porque é que tens uma tag <script> fora do <body>?

Quanto ao error_reporting() já havia testado no topo de tudo e não tinha dado nenhuma mensagem de erro para além dos headers.

Quanto ao resto, não coloquei aqui o doctype, tags title, etc porque achei desnecessário para o problema. O script já está dentro do body.

Resumindo, atendendo às alterações que fiz no código, agora aparece-me o seguinte:

Warning: Cannot modify header information - headers already sent by (output started at /htdocs/public/www/admin.php:14) in /htdocs/public/www/go_login.php on line 31

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /htdocs/public/www/admin.php:14) in /htdocs/public/www/go_login.php on line 33

Portanto, apesar de compreender o 2º erro, voltei ao mesmo. Se for preciso posso colocar aqui o o código da função log_in(), mas posso-vos garantir que não tem nenhum output de headers, é uma função apenas para pegar nos dados da base de dados.

Link to comment
Share on other sites

bioshock, do princípio: setcookies atira headers; session_start, também. Depois de começares a fazer o output, que é o que acontece no momento em que mandas nem que seja um espaço fora dos blocos PHP, nada pode atirar headers. Nada, nunca.

Depois de isto bem entendido, consegues perceber onde está o problema?

"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.

Link to comment
Share on other sites

Sim, compreendi, mas se eu preciso de usar tanto os cookies como as sessions, estás-me a dizer que só fazendo um de cada vez é que é possível?

Eh pá, hoje estás a carvão molhado... 😕

Podes atirar tantos headers quantos quiseres, de toda a forma e feitio, desde que seja antes de enviar qualquer tipo de output para o browser. Não consigo explicar melhor sem te fazer um desenho...

  • Vote 1

"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.

Link to comment
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.