bioshock Posted December 4, 2012 at 07:35 PM Report #485738 Posted December 4, 2012 at 07:35 PM (edited) 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 December 4, 2012 at 08:36 PM by bioshock
NunoDinis Posted December 4, 2012 at 07:40 PM Report #485741 Posted December 4, 2012 at 07:40 PM 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
bioshock Posted December 4, 2012 at 08:35 PM Author Report #485762 Posted December 4, 2012 at 08:35 PM Mas isso não tem lá muito haver com o problema dos headers, pelo menos que eu conheça. Actualizei o código no post inicial porque me esqueci de colocar parte do código.
HappyHippyHippo Posted December 4, 2012 at 08:37 PM Report #485763 Posted December 4, 2012 at 08:37 PM tens (todos) os ficheiros em UTF8 sem BOM ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
bioshock Posted December 4, 2012 at 09:58 PM Author Report #485780 Posted December 4, 2012 at 09:58 PM tens (todos) os ficheiros em UTF8 sem BOM ? Referes-te ao charset? Se sim, não tenho. Mas em que é que isso poderá influenciar?
mjamado Posted December 4, 2012 at 10:06 PM Report #485782 Posted December 4, 2012 at 10:06 PM 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.
bioshock Posted December 4, 2012 at 10:38 PM Author Report #485790 Posted December 4, 2012 at 10:38 PM 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>
HappyHippyHippo Posted December 4, 2012 at 10:48 PM Report #485793 Posted December 4, 2012 at 10:48 PM 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 Portugol Plus
mjamado Posted December 5, 2012 at 01:04 AM Report #485824 Posted December 5, 2012 at 01:04 AM 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.
brunoais Posted December 5, 2012 at 10:33 AM Report #485842 Posted December 5, 2012 at 10:33 AM 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%.
mjamado Posted December 5, 2012 at 10:38 AM Report #485845 Posted December 5, 2012 at 10:38 AM 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.
brunoais Posted December 5, 2012 at 10:50 AM Report #485846 Posted December 5, 2012 at 10:50 AM 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%.
bioshock Posted December 5, 2012 at 04:21 PM Author Report #485887 Posted December 5, 2012 at 04:21 PM 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; }
HappyHippyHippo Posted December 5, 2012 at 04:22 PM Report #485889 Posted December 5, 2012 at 04:22 PM eu não perguntei o charset do HTML, mas sim o enconding de gravação do ficheiro onde se encontra o código IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
mjamado Posted December 5, 2012 at 04:31 PM Report #485890 Posted December 5, 2012 at 04:31 PM 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.
brunoais Posted December 5, 2012 at 05:10 PM Report #485898 Posted December 5, 2012 at 05:10 PM 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%.
bioshock Posted December 5, 2012 at 06:11 PM Author Report #485920 Posted December 5, 2012 at 06:11 PM 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.
mjamado Posted December 5, 2012 at 06:17 PM Report #485925 Posted December 5, 2012 at 06:17 PM 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.
bioshock Posted December 5, 2012 at 06:19 PM Author Report #485926 Posted December 5, 2012 at 06:19 PM (edited) 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? Edited December 5, 2012 at 06:19 PM by bioshock
mjamado Posted December 5, 2012 at 06:25 PM Report #485927 Posted December 5, 2012 at 06:25 PM 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... 1 Report "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.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now