PHP - Cannot modify header information

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:
Warning: Cannot modify header information - headers already sent by (output started at /opt/si/si14/gestao/inicio.php:11) in /opt/si/si14/gestao/inicio.php on line 25

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();
	}?>
 
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
 
ja estive a pesquisar e descobri que é um erro muito comum (...) no entanto como estou a começar a estudar agora PHP (...)
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.
 
Obrigado pelas respostas, mas podiam ser um pouco mais especificos?
É que se colocar exactamente na primeira linha aparece uma pagina em branco...
 
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
 
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..
 
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
 
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
 
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;
}
 
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;
}


usar @ nas funções é uma péssima péssima política. Atrasa a aplicação e não é eticamente correcto :P
 
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?
 
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
 
Back
Topo