1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

PHP - Cannot modify header information

Discussão em 'Web Development' iniciada por hardmotion, 17 de Maio de 2008. (Respostas: 14; Visualizações: 2516)

  1. hardmotion

    hardmotion Power Member

    Boas,
    Agradecia alguma ajuda na resoluçao deste erro....ja estive a pesquisar e descobri que é um erro muito comum e que pode ser derivado de varias causas, no entanto como estou a começar a estudar agora PHP ainda nao descobri de onde vem o erro e como posso sulocioná-lo...

    Obrigado

    ERRO:
    CÓDIGO:
    PHP:
    <?php require_once('../Connections/SI14.php');
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Real Coliseu</title>
    <link  rel="stylesheet" href="../estilos.css" type="text/css" />
    </head>
    <body>
    <?php require_once "../top_frame.php";?>
    <table width="741" height="637" border="0" align="center" cellpadding="0" cellspacing="0">
      <tr>
        <td height="15" colspan="2" bgcolor="#F0F0F0">&nbsp;</td>
      </tr>
      <tr>
        <td width="575" height="500" valign="top"><table width="100%" height="486" border="0" cellpadding="0" cellspacing="0">
          <tr>
            <td width="195">
    <?php require_once "../classes/sala.php";
    // Se existirem dados é porque o formulário já foi submetido, logo adiciona a sala
    if(isset($_POST["nome"]) and isset($_POST["lotacao"]))
    {
    require_once(
    '../Connections/SI14.php');
    header("Location: ../classes/sala.php");
        
    $sala = New Sala(NULL,$_POST["nome"], $_POST["lotacao"]);
        
    //$sala->insert();
        
    }?>
     
  2. K0mA

    K0mA Power Member

    O header tem de estar na linha 1.

     
  3. MPalhas

    MPalhas Power Member

    na primeira linha não, mas tem de estar pelo menos antes de qualquer output, ou seja antes de fazers echo ou de escreveres html
     
  4. slack_guy

    slack_guy Power Member

    Tens razão: é um erro comum em principiantes, em qualquer linguagem de programação, no desenvolvimento de aplicações web. Depois de perceberes a razão deste erro nunca mais volta a acontecer.
    Devem contar-se pelos dedos de uma mão aqueles a quem nunca tenha acontecido isto pelo menos uma vez.
     
  5. hardmotion

    hardmotion Power Member

    Obrigado pelas respostas, mas podiam ser um pouco mais especificos?
    É que se colocar exactamente na primeira linha aparece uma pagina em branco...
     
  6. MPalhas

    MPalhas Power Member

    só não percebo muito bem a lógica desse código

    Código:
    <?php require_once "../classes/sala.php"; 
    // Se existirem dados é porque o formulário já foi submetido, logo adiciona a sala 
    if(isset($_POST["nome"]) and isset($_POST["lotacao"])) 
    { 
    require_once('../Connections/SI14.php'); 
    header("Location: ../classes/sala.php");
    
    primeiro fazes require ao sala.php e a outro ficheiro, e logo a seguir redireccionas para o sala.php, que ou já foi executado antes, ou então contém funções que nem chegaste a usar.
    acho que também não deves ter percebido muito bem o funcionamento disso

    quanto ao header, repara. qual seria o sentido de escreveres html e logo a seguir redireccionar sem dar tempo ao utilizador de ver a página?

    uma boa maneira é pores o código que tem output separado dos procedimentos (e dos headers)
    assim o php vai executando o código e só escreve realmente alguma coisa quando é necessário

    mas isso seria mais dificil de ajustar a esse código. o que podes fazer é, em vez de escreveres, atribuis tudo a uma variavel, e fazes echo a essa váriavel no final do código. acho que também é uma maneira muito usada
     
  7. hardmotion

    hardmotion Power Member

    O sala.php é uma classe que contem funcoes e variaveis relativas a um objecto sala.
    O SI14.php contem apenas os dados da ligaçao à bd.
    Eu ainda nao percebi muito bem para que serve o header(location) pois estou a tentar alterar uns ficheiros php que tinha e adaptar à minha situaçao pois sao muito semelhantes.
    Esta pagina php, cujo codigo postei acima, serve para adicionar uma sala à base de dados. Recorre a uma funcao do sala.php que contem um insert(). Nao sei é como hei-de passar o header para antes de qualquer codigo html..
     
  8. Gurzi

    Gurzi Power Member

    Como já disseram, não podes fazer output nenhum antes de usar o header();

    Cuidado que se deixares espaços em branco depois do <? ou ?> ele conta como output
     
  9. MPalhas

    MPalhas Power Member

    então só queres usar uma função que está dentro do sala.php? não precisas do header

    já fizeste o require ao ficheiro agora podes chamar a função que queres como se ela estivesse declarada no ficheiro actual. é isso que faz o require, é como se copiasse o código do outro ficheiro para dentro desse.

    o header("Location...") é para redireccionar. é como se o utilizador escrevesse o url do ficheiro no browser, mas neste caso de forma automatica
     
  10. metralha761

    metralha761 1st Folding then Sex

    header
    include
    include_once
    require
    require_once
    get_included_files

    O melhor local para saber o q cada função faz é ir ao site oficial e pesquisar.
    Eu tou la todas a vezes q programo PHP, mesmo quando sao funçoes faceis e q usei algumas vezes, ás vezes nao sabes td o potencial dessa função e entao vamos rever o q da para espremer mais. E ainda ha os casos em q sugere outras funções uteis.
     
  11. função de redirreccionamento

    Eu agora uso sempre esta função de redireccionamento, assim não tenho de me preocupar se já houve output antes:

    function vai($url){
    @header("location: ".$url) or die('<script>window.location="'. $url. '";</script>');
    die;
    }
     
  12. Gurzi

    Gurzi Power Member


    usar @ nas funções é uma péssima péssima política. Atrasa a aplicação e não é eticamente correcto :P
     
  13. hardmotion

    hardmotion Power Member

    Já alterei o codigo e a parte do header ja está funcional. No entanto ha outro problema, relacionado possivelmente com uma funçao insert criada por mim que nao está a funcionar...

    add2.php (adicionar salas à base de dados)
    PHP:
    <?php
    require_once('../Connections/config.php'); 
    require_once(
    '../Connections/ligabd.php'); 
    require_once (
    '../classes/sala.php');


    // Se existir dados é porque o formulário já foi submetido, logo adiciona o livro
    if(isset($_POST["nome"]) and isset($_POST["lotacao"]))
    {
        
    $sala = New Sala(NULL,$_POST["nome"], $_POST["lotacao"]);
        
    // $livro->insert();
        
    header("Location: http://wwww.google.pt");
    }
    ?>
    <table width="500" border="0">
      <tr>
        <td>&nbsp;
            
            <br />
        </td>
      </tr>
      <tr>
        <td>
            <h2>Adicionar livro</h2>
            <form id="form1" name="form1" method="post" action="add2.php">
                  <p>
                  <label>Título:
                      <input type="text" name="nome" />
                  </label>
                  </p>
                  <p>
                  <label>ISBN:
                      <input type="text" name="lotacao" />
                  </label>
                  </p>
                  <p>
                <label>
                    <input type="submit" name="Submit" value="Adicionar" />
                </label>
                  </p>
            </form>    
    sala.php (classe)
    PHP:
    <?
        class 
    Sala {
            var 
    $id_sala;
            var 
    $nome;
            var 
    $lotacao;

            function 
    Sala ($id_sala null$nome null$lotacao null)
            {
                If (
    $id_sala != null && ($nome != null || $lotacao != null))
                    
    // Cria apenas o objecto sem interferir com a BD
                    
    $this->sala3 ($id_sala$nome$lotacao);
                elseif(
    $id_sala == null && ($nome != null || $lotacao != null))
                    
    // Novo registo na base de dados
                    
    $this->sala2 ($nome$lotacao);
                else
                    
    // Obtém a informação da BD para o livro com o código id_sala
                    
    $this->sala1($id_sala);
            }

            function 
    sala2 ($nome null$lotacao null)
            {
                
    // Novo registo na base de dados
                
    $this->id_sala $id_sala;
                
    $this->nome $nome;
                
    $this->lotacao $lotacao;
                
    $this->insert();
            }
            
            
            function 
    insert() 
            {
                
    $result mysql_query("INSERT INTO sala (nome,lotacao) values ('"$this->nome "','".$this->lotacao."')");
                if (!
    $result) {
                       die(
    'insert: Invalid query: ' mysql_error());
                }
                
    $result mysql_query("select * from sala where lotacao = '" .$this->lotacao"'");
                if (!
    $result) {
                       die(
    'insert: Invalid query: ' mysql_error());
                }
                
    $row mysql_fetch_assoc($result);
                
    $this->id_sala $row["id_sala"];
            }
        }
    ?>
    Só escrevi as partes do codigo que interessavam.

    O erro que me dá é: insert: Invalid query: No database selected


    Qual será o problema?
     
  14. MPalhas

    MPalhas Power Member

    nunca tive esse erro mas imagino o que seja. ligaste-te ao servidor mas não escolheste uma base de dados. depois de fazeres o mysql_connect, tens que usar a função:

    mysql_select_db($bd, $connection)

    em que $bd é o nome da base de dados, e $connection é a variavel que recebeu o mysql_connect
     
  15. hardmotion

    hardmotion Power Member

    Obrigado! :):)

    Era mesmo isso! Andava há um dia à volta com este erro! muito obrigado mesmo.
     

Partilhar esta Página