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

Site colocado online - erro nos headers

Discussão em 'Web Development' iniciada por khaluh, 20 de Junho de 2007. (Respostas: 12; Visualizações: 1979)

  1. khaluh

    khaluh Power Member

    Viva

    Ao fazer o 1º teste online do site que tenho andado a desenvolver, verifiquei que me dá sempre erro nas páginas que contêm instruções do género de
    PHP:
    header("location:../index.php?opcao=discos");
    A nível de localhost, funcionou sempre correctamente e como é o 1º teste online que faço a um site, podem-me explicar qual a possivel razão de isto acontecer?

    A mensagem de erro devolvida é a seguinte:
    Warning: Cannot modify header information - headers already sent by (output started at /home/malta/public_html/ligacao_bd.php:19) in /home/malta/public_html/discos/mexe_db_discos.php on line 26

    E o ficheiro mexe_db_discos.php é o seguinte:
    PHP:
    <?php
        
    include '../ligacao_bd.php';

        
    //Captura da opção
        
    $opcao == $_GET['submit'];
        
    //Captura do id do disco
        
    $id $_POST['id_discos'];
        
    //Captura do estado do disco
        
    $estado $_POST['estado_alt'];
        
        if (
    $opcao 'Alterar')
        {
        
    /*
        *  executa consulta em SQL
        */
            
            
    $sql =     "
                    UPDATE discos 
                    SET     
                        di_estado = '
    $estado
                    WHERE di_id_discos = '
    $id'
                    "
    ;

            
    $resultado mysql_query($sql)
            or die (
    "Erro ao actualizar dados do disco.");
            
        
    header("location:../index.php?opcao=discos");

        }
        else
            {
            
    header("location:../index.php?opcao=discos");
            }
    ?>
    O ficheiro ligacao_bd.php
    PHP:
    <?php                     
        
    /* identificação das variaveis */
        
    $servidor 'localhost'
        
    $utilizador 'root';
        
    $password '';
        
        
    /* ligação à base de dados */
        
    $ligacao mysql_connect($servidor$utilizador$password
        or die (
    "Ligação foi à vida");  
        
        
    /*selecção da base de dados a utilizar */
        
    mysql_select_db('novotecna');
    ?>
    No php.ini tenho
    error_reporting = E_ALL & ~E_NOTICE
     
    Última edição: 20 de Junho de 2007
  2. ngr

    ngr

    Um header tem de ser enviado antes de qualquer output. Se tiveres um print (provavelmente no ficheiro ligacao_bd.php na linha 19) ou algum outro output, o header não funciona. Provavelmente não te dava erro localmente porque tens o error reporting desligado. Experimenta error_reporting(E_ALL) no início do scrit quando estás a testar ou alteras no php.ini.
     
  3. khaluh

    khaluh Power Member

    Pois, essa parte eu sei, tanto que em nenhum dos ficheiros foram colocadas instruções de escrita. E o pior, é que no ligacao_bd.php não existe linha 19, como mostrado no código do ficheiro entretanto adicionado
     
  4. BMarques

    BMarques Power Member

    Possivelmente poderás ter algum problema na ligação à BD e ele estar a escrever o resultado do die. Tens garantia que isso está a funcionar?
     
  5. khaluh

    khaluh Power Member

    Foi como disse, a nivel local funciona perfeitamente, em modo online é que dá o berro...
     
  6. BMarques

    BMarques Power Member

    Pois, por isso mesmo. Online a tua base de dados tb se acede como root e sem password? É que localmente isso faz sentido, agora online costuma ser um bocado mais robusto :)
     
  7. khaluh

    khaluh Power Member

    Este código
    PHP:
     /* identificação das variaveis */
        
    $servidor 'localhost'
        
    $utilizador 'root';
        
    $password '';
    não corresponde aos reais valores da coisa, como é obvio... Mas não é por aí, pois consigo aceder à BD, às consultas que faço com, por exemplo, este tipo de código:
    PHP:
    $discos =     "
                        SELECT di_id_discos, di_nome, di_estado
                        FROM  discos
                    "
                    
    ;
        
    $resultado mysql_query($discos)  or  die ("Não foi possível realizar a consulta por motivos técnicos.");

        while (
    $linha=mysql_fetch_array($resultado))
        {

               echo 
    "<tr>";
            echo 
    "<td>{$linha['di_nome']}</td>";
               echo 
    "<td>{$linha['di_estado']}</td>";
               echo 
    "<td><a href='discos/alterar_discos.php?id={$linha['di_id_discos']}'>Alterar</a> &nbsp;&nbsp; ";
               echo 
    "<a href='discos/apagar_discos.php?id={$linha['di_id_discos']}'>Apagar</a></td>";
               echo 
    "</tr>";
        }

        echo 
    "</table>";
     
  8. BMarques

    BMarques Power Member

    Suponho então que se comentares as duas linhas do "header" a coisa corre sem erros. É isso?

    Outra coisa, dentro do header dás um caminho relativo : "../index.php". Não sei até que ponto não terás que definir o caminho todo, mas o erro que tens não deve ser por ai.
     
  9. p3dro

    p3dro Power Member

    tens a certeza k a instrução $sql tá bem construída? digo isto pk tens alguns erros no código php k poderão indirectamente resultar naquele erro, por ex:

    $opcao == $_GET['submit']; -> isto vai dar 1 ou 0, é uma comparação, deverá ser: $opcao = $_GET['submit']; (mas o problema de enviar algo para o output antes da instrução header, k é o k realmente está a acontecer, não provém daqui, é apenas 1 aviso meu para alterares :))

    if ($opcao = 'Alterar') -> o código vai entrar sempre nesta condição, visto que não estás a fazer uma comparação, mas sim uma assignação, isto vai smp dar true, fazendo com k o php processe as instruções dentro dakele if, digo isto pk secalhar qdo fazes o "Alterar" não passas as variáveis necessárias (que 2º o teu script vão ser assignadas às variáveis $estado e $id) para construir o $sql, gerando ai 1 erro e consequentemente dar dar erro no header pk já foi enviada informação para o output.

    já agora, pk é k estás a ir buscar variáveis por GET e POST no mesmo script?

    ... just my 2 cents :)
     
    Última edição: 20 de Junho de 2007
  10. khaluh

    khaluh Power Member

    Viva

    Após a publicação, apercebi-me desse erro assim como o do
    Isso foi uma coisa quejá resolvi, pois não tinha razão de ser, dado no form estar a usar o POST
    Quando usada no localhost, funcionou sem problemas...

    Antes de publicar, tinha tudo a funcionar (apesar de usar alguns GET's na vez de POST's e de ter uns == onde deveria estar =)
     
  11. p3dro

    p3dro Power Member

    mas então ficou resolvido o problema?

    secalhar no localhost funciona bem pk por ex podes ter variáveis globais activas (just a wild guess :x2:)
     
  12. khaluh

    khaluh Power Member

    Sim, esses pormenores dos == e dos GET's e POST's

    Apesar de ser um wild guess :-D qual pensas que poderá ser a melhor maneira para resolver a questão?
     
  13. khaluh

    khaluh Power Member

    Bem, ainda não consegui resolver o problema... >(

    Agora tenho outro código, onde tenho o mesmo erro:
    Os ficheiros em questão são:index.php
    Código:
    <?php 
        session_start();
                                        //Ligação à BD 
        include 'ligar_a_bd.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=iso-8859-1" />
        <title>Gabinete Relações Públicas e Marketing</title>
         <link href="estilos_grpm.css" rel="stylesheet" type="text/css" />
    </head>
    <body>
        <div id="caixasite">
            <div id="topo"> </div>
        <div id="esquerda">
        <?php
                                         //Menu de navegação
            include 'include/menu_esq.php';
        ?>
    </div>
    <div id="caixacentral">
        <?php
                                        //Definição da opção a tomar, mediante a selecção efectuada
            $opcao = $_GET['opcao'];
            if ($opcao == logout)
                include 'login/logout.php';
            else if ($opcao == inicio)  
                include 'include/index_centro.php'; 
            elseif ($opcao == eventos)
                include 'include/eventos.php';
            elseif ($opcao == equipa)
                include 'include/equipa.php';
            elseif ($opcao == colb)
                include 'include/colaboradores.php';
            elseif ($opcao == noticias)
                include 'noticias/controlar_publicacoes.php';
            elseif ($opcao == hist_not)
                include 'include/hist_not.php';
            elseif ($opcao == artigos)
                include 'include/artigos.php';
            elseif ($opcao == hist_art)
                include 'include/hist_art.php';
            elseif ($opcao == links)
                include 'include/links.php';
            elseif ($opcao == sugest)
                include 'sugestoes/sugest.php';
            else
                include 'include/index_centro.php'; 
        ?>
    </div>
    <div id="direita">
        <?php
                                            //Verificação se é um utilizador válido do sistema
            include 'login/tratalogin.php';
                                             //Notícias        
            include 'noticias/noticias.php'; 
        ?>    
    </div>
    <div id="rodape">
        <?php
                                            //Rodapé 
            include'include/rodape.php'; 
        ?>
    </div>
    </div>
    </body>
    </html>
    E tratalogin.php
    PHP:
    <?php
        session_start
    ();
                                            
    // Valores por defeito
        
    $_SESSION['username'] = 'johndoe';
        
    $_SESSION['nivel'];    
                                            
    // Inicio da Validação
        
    $username $_POST['username'];
        
    $password $_POST['password'];    
                                            
    // Fim da validação
                                            // 
                                            // Ligação a BD 
        
    include 'ligar_a_bd.php';    
                                            
    // Pesquisa na BD se existe o user e a password
                                            //
                                            // Consulta ao nivel de utilizador
                                            //
        
    $nivel "SELECT log_nivel FROM login WHERE log_user = '$username' AND log_passwd = '$password'";
        
    $resultado mysql_query($nivel);
                                            
    // Verificação de existência
        
    $existe mysql_fetch_row($resultado);
                                            
    // Utilizador inexistente
        
    if (mysql_num_rows($resultado) == 0)
        {
            
    $_SESSION '';
            
    header("location:../index.php");
        }
            else
            {
                if (
    $existe['log_nivel'] == 'ADMINISTRADOR')
                {
                    
    header("location:../administrator/administrador.php");
                }
            }
        
    ?>
    Ninguem faz uma pequenininininha ideia do que possa ser? Há outra forma de redireccionar ?

    Outra coisa: se eu insiro na BD uma password encriptada com md5, depois para ver se a password que fizemos no login combina com o user, devo fazer md5($pass_inserida) == %pass_na_bd ?
     
    Última edição: 22 de Junho de 2007

Partilhar esta Página