Ver Mensaje Individual
  #1 (permalink)  
Antiguo 30/05/2013, 05:09
yafuslae
 
Fecha de Ingreso: octubre-2012
Mensajes: 45
Antigüedad: 11 años, 6 meses
Puntos: 2
Error al cerrar sesion: Warning: Cannot modify header information

Hola a todos. Estoy con el tema de las sesiones php y al cerrar la sesión me da el error Cannot modify header information - headers already sent by (output started at /opt/lampp/htdocs/superguardian/app/vistas/menu.php:105) in /opt/lampp/htdocs/superguardian/app/controladores/login.php on line 18

El caso es que inicia sesión correctamente y de hecho la cierra pero en vez de volver al archivo index me saca ese error.
El index.php
Código:
<?php
session_start();
	//$_SESSION["centro"] = 1;
?>
<html>
	<head>
	   <meta http-equiv="content-type" content="text/html; charset=utf-8">
		<link rel="stylesheet" type="text/css" href="estilos/css/index.css" title="style">
		<!--Hacer limpio el siguiente código más adelante-->
		<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script><!--Librería de Jquery-->
		<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.2/jquery-ui.min.js"></script><!--Librería de Jquery UI-->
<!--IMPORTACION DE JS-->
		<script type="text/javascript" src="../librerias/scripts/openwysiwyg/scripts/wysiwyg.js"></script>
		<script type="text/javascript" src="../librerias/scripts/openwysiwyg/scripts/wysiwyg-settings.js"></script>
<!--Carga de todos los js de comprobaciones-->
		<script type="text/javascript" src="../app/js/comprobaciones/formularios.js"></script>
<!--Funciones de jquery tales como la carga de tabs dinámicos-->
		<script type="text/javascript" src="../app/js/funciones_jquery_ui.js"></script> 
<!--Carga el js de ventanas emergentes-->

<!--AL CARGAR LA PÁGINA-->

<script type="text/javascript" >

	$( document ).ready(function() {
//Para que un div se abra con el efecto 		
		$( ".highlight" ).show( "highlight" );
		$( ".blind" ).show( "blind",1000 );	
		
//Multiple checks
		$("#check_todos").click(function(event){
	     if($(this).is(":checked")) {
		 	$(".casilla:checkbox:not(:checked)").attr("checked", "checked");
		 }else{
			 $(".casilla:checkbox:checked").removeAttr("checked");
		 }
	   });
			
});
//Clona la lista de clases de ese centro que hay donde se cambian de clase los alumnos y la añade a la parte de filtros.
//Hace uso de DOM para ello.
$( document ).ready(function() {
	cloneNode=document.getElementById("clases_para_cambiar").cloneNode(true);
	document.getElementById("filtro_aula").appendChild(cloneNode);	
	//Quedaría ver cambiar el name.

});	
</script>



	
<script>
	$(function() {
		$( "#dialog_email" ).dialog({
		autoOpen: false,
		width:800,
		show: {
		effect: "puff",
		duration: 500
		},
		hide: {
		effect: "puff",
		duration: 500
		}
		});
		$( "#email" ).click(function() {
		$( "#dialog_email" ).dialog( "open" );
		});
	});
</script>
		
<!--CÓDIGO PARA QUE LOS BOTONES SE AJUSTEN AL TEMA DE JQUERY UI-->
	<!--	<script>
		  $(function() {
		    $( "input[type=submit], input[type=reset]")
		      .button()
		      .click(function( event ) {
		        event.preventDefault();
		      });
		  });
		 </script>	-->
		<script type="text/javascript">
		//Script para hacer visibles los submenus del menu principal.
			/*$(document).ready(function() {
				$('.menu li:has(ul)').hover(function(e){
					$(this).find('ul').css({display: "block"});
				},
				function(e){
					$(this).find('ul').css({display: "none"});
				});
			});*/
		 </script>

	</head>
	<body>
		<?php include('../app/includes_y_requires.php')?>
		
		<!--INICIO DEL CONTENIDO-->
		<div id="contenedor">
			<div id="top">
				<div><span onclick=" document.location.href = 'index.php?c=1'">SUPERGUARDIÁN</span></div>
				<div>
				<input type="text" class="search" size="50" />
				<button type="button" onclick="session_destroy()">Buscar</button>
				</div>
				<div><?php
					include("../app/vistas/menu.php");
				?>
				</div>
			</div>
			<!--Fin de menú-->
			<div id="principal">
				<div id="central">
					<?php
					if(isset($_SESSION["login"])) {
						//$accionPredefinida ="nueva_alta";
							if(!empty($_GET['controlador'])){
									$controlador = $_GET['controlador'];
									if(! empty($_GET['accion']))
										  $accion = $_GET['accion'];
									else{
										 // $accion = $accionPredefinida;

							}
								  
									//Ya tenemos el controlador y la accion.
									//Formamos el nombre del fichero que contiene nuestro controlador
									$controlador = "../app/controladores/".$controlador.".php";
	
									//Incluimos el controlador o detenemos todo si no existe
									if(is_file($controlador))
										  require_once $controlador;
									else
	
										  die('El controlador no existe - 404 not found');
	
									//Llamamos la accion o detenemos todo si no existe
									if(is_callable($accion))
										  $accion();
									else
										 // die('La accion no existe - 404 not found');
										  echo "NO SE HA SOLICITADO UNA ACCIÓN";
							}
						
						  if(empty($_GET['controlador']) && empty($_GET['accion'])){
								//require_once"../app/vistas/nuevo_alumno.php";
								include("../app/vistas/listar_alumnos.php");

						  }
						  }//Fin del if de comprobación de logueado
						  else {
						  		?>
						  			<form method="POST" action="../app/controladores/login.php"">
										<span class="b">ACCESO: </span>
										<span>Usuario</span><input type='text' name="user" value=" " size="10"/>
										<span>Contraseña</span><input type='password' name="pass" value="" size="10"/>
										<input type="submit" value="Entrar"/>
									</form>																	
								<?php	
						  }
					?>				
				</div>
				<!--Fin de central-->			
				<div id="derecha">
				</div>
				<!--Fin de derecha-->
			</div>
			<!--Fin de principal-->
		</div>
		<!--Fin de contenedor-->
	</body>
</html>
Su controlador.php

Código:
<?php
//Si se envía el formulario de login llama a login (modelo) con los parámetros de usuario y contraseña.
	if(isset($_POST['user'])) {		
		require '../modelos/conexion.php';
		require '../modelos/login.php';
		$u=$_POST['user'];
		$p=$_POST['pass'];		

		login($u,$p);
	}

	function cerrar_sesion() {
// Destruir todas las variables de sesión.
		$_SESSION = array();
// Si se desea destruir la sesión completamente, borre también la cookie de sesión.
// Nota: ¡Esto destruirá la sesión, y no la información de la sesión!
		if (ini_get("session.use_cookies")) {
	   	$params = session_get_cookie_params();
	    	setcookie(session_name(), '', time() - 42000,
	      $params["path"], $params["domain"],
	      $params["secure"], $params["httponly"]
	    	);
		}
// Finalmente, destruir la sesión.
		session_destroy();
		header("Location: ../../publico/index.php?");
	}
?>
Y su modelo.php

Código:
<?php
function login($u,$p){
			session_start();
	global $servidor, $bd, $usuario, $contrasenia;
	try{
		@ $db = new mysqli($servidor, $usuario, $contrasenia);
		if (mysqli_connect_errno() != 0)
			throw new Exception('Error conectando:'.mysqli_connect_error(), mysqli_connect_errno());
		
		$db->select_db($bd);
		if ($db->errno != 0)
			throw new Exception('Error seleccionando bd:'.$db->error, $db->errno);
		$consulta = $db->query("SELECT * FROM usuarios WHERE email='".$u."' AND password='".$p."'");
		
		if (mysqli_num_rows ($consulta) > 0){
			$_SESSION['login']=1;
			header("Location: ../../publico/index.php");
		}
		else {
			echo "Usuario o contraseña no coinciden";
			
		}

		if ($db->errno != 0)
			throw new Exception('Error realizando consulta:'.$db->error, $db->errno); 
		$db->close(); 
	}catch (Exception $e){
		echo $e->getMessage();
		if (mysqli_connect_errno() == 0)
			$db->close();
		exit();
	}	
	return $consulta;	
}

?>

Y el del menu.php
Código:
<ul class="menu"><img src="../pruebas/cara.jpg" alt="Configuración"/>
	<li><a>Perfil</a></li>
	<li><a href="#">tyutyuy</a></li>
	<li><a href="index.php?controlador=login&accion=cerrar_sesion">Salir</a></li>
</ul>
He visto soluciones del tipo comentar x linea en php.ini y cosas como que puede ser algún espacio. No quiero hacer trampas al servidor y no creo que tenga ningún espacio o carácter raro.

¿De que podría venir el fallo?

Última edición por yafuslae; 30/05/2013 a las 05:11 Razón: olvidé el menu.php