Jump to content
Sign in to follow this  
Sir Pereira

[RESOLVIDO] Header depois de output

Recommended Posts

Sir Pereira

Boas pessoal,

é o seguinte, estou a criar um sistema, em que numa das fases é necessária a inserção de dados na página adicionar.php.

Esta página verifica se existe a variável GET envia=true, se existir ele vai fazer INSERT na bd com os dados do POST, e supostamente se o $sql foi concluído com sucesso, ele redireccionava para o index.php (listagem dos dados), mas no entanto, quando ele faz essa verificação o conteúdo é necessário que já esteja carregado.

O que posso fazer?

Share this post


Link to post
Share on other sites
softklin

Eu também não percebi muito bem o problema em concreto, mas posso adiantar-te uma solução típica:

Se sabes que existe a possibilidade de redireccionar o utilizador, então move essa lógica para um local que seja executado antes de qualquer output (inicio do ficheiro, se estiveres a fazer as coisas sem recurso a frameworks). A razão disto é: quando usas um header('Location: blah'), o browser vai redireccionar de imediato, e como tal, não justifica teres qualquer output antes porque o utilizador com um browser comum não o vai ver.

Se quiseres dar alguma informação a justificar porque é que o utilizador foi redireccionado, guardas essa info numa sessão, e mostras ao utilizador na página seguinte.


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Share this post


Link to post
Share on other sites
Sir Pereira

Bom, é assim.

index.php - Lista os utilizadores e à frente tem ícones de ação (ver perfil, editar e eliminar) e em cima da lista tem um botão de adicionar novo utilizador

adicionar.php - Página com formulário onde se cria o novo utilizador.

Quero uma única página tanto para o formulário como para a inserção dos dados na base de dados.

Como tal, o que fiz?

Pus como action do formulário action="adicionar.php?envia=true" -> Sinal que já está a enviar, isto é, que já tem os campos preenchidos, para que possa depois distinguir se os quero meter na base de dados, ou se não foi dada instrução de enviar, logo o formulário não está preenchido

Se existir a variável, ele insere na base de dados, e aparece-me uma mensagem a dizer que foi inserido com sucesso. E eu em vez da mensagem queria que ele redireccionasse para o index.php e no próprio index.php antes da lista de utilizadores aparecesse a notificação a dizer que o registo foi inserido com sucesso.

Share this post


Link to post
Share on other sites
softklin

Já percebi, então tu queres a página adicionar.php para preencher, e adicionar. Então a minha resposta adequa-se ao teu problema:

No topo do ficheiro, colocas as lógica para inserir e redirecionar em caso de sucesso. Em caso de falha, podes dizer os erros na própria página. Se fizeres isto, já é possível o utilizador ir para o index.php sem erros.

Agora a notificação: numa variável de sessão, guardas a mensagem que queres mostrar. No teu index.php, colocas um if, a questionar se essa variável de sessão existe, e se existir, mostras a mensagem que lá está guardada. Como bónus, este sistema serve não só para as inserções, mas para qualquer mensagem que queiras notificar o utilizador: basta preencher a sessão.

Um exemplo, para fazer voar a palha:

adicionar.php

<?php

  if (!empty($_POST)) {
    // o utilizador enviou o formulario com dados, vamos validar e inserir na bd
    // também podes usar a tua variável "envia" e comparar com TRUE, se quiseres
    //...
    
    if ($estadoTudoCerto == TRUE) {
        session_start();
        $_SESSION['notifications'] = "O seu registo X foi adicionado com sucesso";
        header("Location: index.php");
        exit();
    } 
  }


  <html>
   // os teus conteudos de página e formulario por aqui a abaixo
   // ...
?>

index.php

<?php
   // isto tem de estar no topo do ficheiro (antes do output)
   session_start();


   // no local onde queres mostrar a mensagem
   if (!empty($_SESSION['notifications'])) {
      echo "<p class=\"mensagem\">". $_SESSION['notifications'] . "</p>";
      $_SESSION['notifications'] = "";   // o utilizador ja foi notificado, apagar a mensagem
   }

   // resto da página

?>


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Share this post


Link to post
Share on other sites
Sir Pereira

Hmm, já percebi, penso que dê para o que queria fazer.

Eu antes até pensava em utilizar mais GET's do tipo notif=nr_notificacao, mas realmente assim parece-me bem melhor.

Outra coisa, imagina que eu quero colocar na sessão que inseri o registo com o nome X, para isso tenho que fazer uma query antes de definir a sessão. Ele assim não me vai considerar já isso como conteúdo?

Share this post


Link to post
Share on other sites
softklin

A sessão pode conter qualquer tipo de dados. Neste caso, aquilo é um string. Se por exemplo, fizeres os registo "cerejas", é provável que quando os dados chegam do POST tenhas uma variável que contém esse valor, seja $nome.

Assim, ao criares a notificação, no adicionar.php, podes fazer o seguinte:

$_SESSION['notifications'] = "O seu registo $nome foi adicionado com sucesso";

Como $nome é uma variável, vai ser substituída pelo seu conteúdo, e quando visitar o index.php, o user vê:

O seu registo cerejas foi adicionado com sucesso


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Share this post


Link to post
Share on other sites
Sir Pereira

Não é isso softclean, isso sei lol.

Tipo, é assim, pegando no teu código:

<?php

  if (!empty($_POST)) {
    // o utilizador enviou o formulario com dados, vamos validar e inserir na bd
    // também podes usar a tua variável "envia" e comparar com TRUE, se quiseres
    //...
   
    if ($estadoTudoCerto == TRUE) {
        session_start();


$sql = mysql_query("SELECT nome FROM scie_users WHERE id = '$_POST[id]' LIMIT 1");

if ($sql) {
while ($dados = mysql_fetch_assoc($sql)) {

        $_SESSION['notifications'] = "O seu registo ".$dados[nome]." foi adicionado com sucesso";

}
}
        header("Location: index.php");
        exit();
    }
  }


  <html>
   // os teus conteudos de página e formulario por aqui a abaixo
   // ...
?>

Algo tipo isto, não provocaria um erro a dizer que os headers não podiam ser enviados? É que eu preciso de passar no valor que envio pela variável de sessão também um nome que vou buscar à base de dados.

Share this post


Link to post
Share on other sites
softklin

Não deve ter qualquer problema. É perfeitamente possível fazer isso. A não ser que as funções de mysql estejam a dar erro e a escrever para a página, não deve haver problema.

A regra é: sessões, cookies e tudo o resto que mexe nos cabeçalhos/headers HTTP, deve ser feito antes de qualquer frase, tag, caractere ser escrito na página. Se não fizer output, então os cabeçalhos podem ser modificados, porque nenhum output foi enviado.


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Share this post


Link to post
Share on other sites
Sir Pereira

Ui, que isto já me tá a dar chatices. Como o sistema é um pouco complexo, tenho uns includes dentro de includes, e uns já me vão buscar informação do html do header (para as validações CSS)...

EDIT:

Bom aqui com uma aldrabice, fui buscar o código dos includes e pu-lo pela ordem que queria, e assim já dá. Obrigadão, 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
Sign in to follow this  

×
×
  • 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.