Site colocado online - erro nos headers

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:
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.
 
ngr disse:
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
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
 
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?
 
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 :)
 
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 :)

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>";
 
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.
 
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");
        }
?>

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:
Viva

P3dro disse:
$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 :))
Após a publicação, apercebi-me desse erro assim como o do
p3dro disse:
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.
p3dro disse:
já agora, pk é k estás a ir buscar variáveis por GET e POST no mesmo script?
Isso foi uma coisa quejá resolvi, pois não tinha razão de ser, dado no form estar a usar o POST
p3dro disse:
tens a certeza k a instrução $sql tá bem construída??
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 =)
 
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 =)

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:)
 
p3dro disse:
mas então ficou resolvido o problema?
Sim, esses pormenores dos == e dos GET's e POST's

p3dro disse:
secalhar no localhost funciona bem pk por ex podes ter variáveis globais activas (just a wild guess :x2:)
Apesar de ser um wild guess :-D qual pensas que poderá ser a melhor maneira para resolver a questão?
 
Bem, ainda não consegui resolver o problema... >(

Agora tenho outro código, onde tenho o mesmo erro:
Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\novo_grpm\index.php:13) in C:\xampp\htdocs\novo_grpm\login\tratalogin.php on line 25
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:
Back
Topo