Foros del Web » Programando para Internet » PHP »

warning!

Estas en el tema de warning! en el foro de PHP en Foros del Web. hola buenas, 1º cree mi web y 0 problemas 2º como trabajaba en modo local nunca tube problemas 3º ahora monte mi pagina, y cuando ...
  #1 (permalink)  
Antiguo 28/01/2009, 09:54
 
Fecha de Ingreso: enero-2009
Mensajes: 142
Antigüedad: 15 años, 3 meses
Puntos: 1
warning!

hola buenas,
1º cree mi web y 0 problemas
2º como trabajaba en modo local nunca tube problemas
3º ahora monte mi pagina, y cuando accedo a ella , me aparece este error, y supongo que es por el header que tengo

Warning: Cannot modify header information - headers already sent by (output started at /home/mcifuent/public_html/intranet/index2.php:6) in /home/mcifuent/public_html/intranet/index2.php on line 50

mmm que problema tengo con eso??
  #2 (permalink)  
Antiguo 28/01/2009, 10:00
Avatar de darkasecas  
Fecha de Ingreso: marzo-2005
Ubicación: SantaCata, NL, Mexico
Mensajes: 1.553
Antigüedad: 19 años, 1 mes
Puntos: 77
Respuesta: warning!

Asi parece, estas enviando un header en la linea 50, pero ya enviaste algo en la linea 6, por lo que te marca el warning (tal vez en local tenias deshabilitados los warnings y por eso no marcaba nada?)
  #3 (permalink)  
Antiguo 28/01/2009, 10:04
 
Fecha de Ingreso: enero-2009
Mensajes: 142
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: warning!

plop igual aca dejo el codigo


<?php
session_start();
?>
<html>
<head><title></title>
<style type="text/css">
body { background: #336699 url(16b.jpg) repeat-x;}
</style>
</head>
<body>
<?php
// Conectar a la base de datos
mysql_connect ('localhost', 'mcifuent_mcifuen', '');
mysql_select_db("mcifuent_bd1");
if($_POST['username'] ==NULL){
?>
<div align ="center">
Error, ingrese nombre de usuario<br>
<input type="button" value = "Login" onclick="location='index.php'" ><br>
</div>
<?php
} else {if($_POST['username']){
//Comprobacion del envio del nombre de usuario y password
$username=$_POST['username'];
$password=$_POST['password'];

if($password==NULL ){
echo "El usuario y/o password no fueron enviados";
}else{
$query = mysql_query("SELECT usuario,clave FROM usuarios WHERE usuario = '$username'") or die(mysql_error());
$data = mysql_fetch_array($query);

if($data['clave'] != $password){
echo "<center>";
echo "Login incorrecto";
echo "</center>";
}else{
$query = mysql_query("SELECT usuario,clave,observacion FROM usuarios WHERE usuario = '$username'") or die(mysql_error());
$row = mysql_fetch_array($query);
$_SESSION["s_username"] = $row['usuario'];
$_SESSION["o_observacion"] = $row["observacion"];
if($row['observacion'] == 'Usuario'){

echo "Bienvenido ".$_SESSION['s_username'].", ahora puedes ingresar tus solicitudes" ;
header("Location: ingsolicitud.php");//paso automatico a otra pagina

}else{

echo "Bienvenido ".$_SESSION['s_username']." ingresaste como ".$_SESSION['o_observacion']." " ;
header("Location: solicitudes.php"); //AQUI LA LINEA 50
}

}
}
}
}
?>
</body>
</html>
  #4 (permalink)  
Antiguo 28/01/2009, 10:09
Avatar de Sommy  
Fecha de Ingreso: septiembre-2008
Mensajes: 228
Antigüedad: 15 años, 7 meses
Puntos: 6
Respuesta: warning!

Un error clasico y muy tratado... Cuando trabajas de modo local, me imagino que es en windows, con un apache, etc etc... Esto es muy permisivo, cuando lo subis a linux, la realidad es otra, y es cruel, pero segura...

Si no me equivoco el tema es que ya abriste y cerraste un <? ?> cuando iniciaste session, ahi se enviaron los headers... Esta es una gran cagada de PHP, deberia tener algo simple y no problematico como el response.redirect de ASP que nunca jode y siempre anda...

Lo que suelo hacer es un echo, de un javascript para redireccionar, en lugar de los header location... Te pongo una muestra...

Código PHP:
echo "<script>document.location.href='pagina.php'</script>"
Suerte!
  #5 (permalink)  
Antiguo 28/01/2009, 10:11
 
Fecha de Ingreso: enero-2009
Mensajes: 142
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: warning!

gracias sommy vere si funciona o no
  #6 (permalink)  
Antiguo 28/01/2009, 11:17
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: warning!

Pues es claro el error, la salida de texto empezo en la linea 6, que es el <html>, recuerda que no puede haber nada de salida de texto, ni html, ni nada antes de llamar a header().

Saludos
  #7 (permalink)  
Antiguo 28/01/2009, 11:30
Avatar de Sommy  
Fecha de Ingreso: septiembre-2008
Mensajes: 228
Antigüedad: 15 años, 7 meses
Puntos: 6
Respuesta: warning!

La verdad que deja mucho que desear con las redirecciones PHP, decir que no es super importante...

Espero que hagan alguna funcion de redireccion en el PHP 6.

Saludos!
  #8 (permalink)  
Antiguo 28/01/2009, 11:47
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: warning!

Sommy, perdon por contradecirte, pero las redirecciones (del lado de servidor) son encabezados (headers) y PHP los trabaja en forma excelente. Y, tal como tu respondiste, las redirecciones del lado del cliente puedes manejarlas usando Javascript.

Todo depende de tu forma de programar y las necesidades especificas en cada redireccion.
__________________
- León, Guanajuato
- GV-Foto
  #9 (permalink)  
Antiguo 28/01/2009, 12:04
Avatar de Sommy  
Fecha de Ingreso: septiembre-2008
Mensajes: 228
Antigüedad: 15 años, 7 meses
Puntos: 6
Respuesta: warning!

Cita:
Iniciado por Triby Ver Mensaje
Sommy, perdon por contradecirte, pero las redirecciones (del lado de servidor) son encabezados (headers) y PHP los trabaja en forma excelente. Y, tal como tu respondiste, las redirecciones del lado del cliente puedes manejarlas usando Javascript.

Todo depende de tu forma de programar y las necesidades especificas en cada redireccion.
Es cierto, esta fuera de duda que si se puede, pero solo al inicio del archivo. En el caso este, como harias en PHP para redireccionar? Hay que acudir a parches de javascript...

Si alguna forma me encantaria saberla!

Me refiero a que en ASP o PERL uno pones la sentencia de redireccion, y listo... sin histeria, ni un drama... php siempre llora con eso, como cuando queres abrir las sessions en cualquier parte del archivo...
  #10 (permalink)  
Antiguo 28/01/2009, 12:19
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: warning!

No es necesario que sea al inicio del archivo, ¿donde leiste eso? , puede ser perfectamente al final de un archivo en medio en donde quieras.

Lo importante y clave es que NO puedes enviar nada de texto, esto es por diseño del protocolo HTTP, si realmente no puedes diseñar correctamente el flujo de tu script entonces puedes recurrir a las funciones de salida de PHP para controlar la salida de texto:
Código php:
Ver original
  1. <?php
  2. ?>
  3. <html>
  4. <head>
  5. <title>blah</title>
  6. </head>
  7. <body>
  8. <p>blah</p>
  9. <?php
  10. echo "foo";
  11. ?>
  12. </body>
  13. </html>
  14. <?php
  15. header("Location: algo.php");
  16. ?>

Como te comento no es por PHP, y que PHP "llore", el problema es el mal diseño de muchos scripts, y el diseño del protocolo HTTP, cuando tu envias una cabezera esta debe de ser ANTES del documento de salida, por eso si envias texto, pues automaticamente cortas con el proceso de la transferencia, y por ende ya no puedes enviar las cabeceras.

Saludos
  #11 (permalink)  
Antiguo 28/01/2009, 12:32
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: warning!

Cita:
Iniciado por Sommy Ver Mensaje
Me refiero a que en ASP o PERL uno pones la sentencia de redireccion, y listo... sin histeria, ni un drama... php siempre llora con eso, como cuando queres abrir las sessions en cualquier parte del archivo...
Segun recuerdo, en PERL tambien puedes crear cookies en cualquier parte de tu script, independientemente de si ya enviaste contenido o no.

El hecho de que otros lenguajes permitan hacer uso de headers fuera de contexto no quiere decir que PHP no sepa manejarlos, sino, por el contrario, PHP nos obliga a manejarlos correctamente: primero envias todos los encabezados (cookies, sesiones, redirecciones, etc.) y despues envias contenido, porque esa es la forma en que debe recibirlos el navegador.
__________________
- León, Guanajuato
- GV-Foto
  #12 (permalink)  
Antiguo 28/01/2009, 12:37
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: warning!

Puedes poner cookies en cualquier parte el chiste es manejar correctamente el buffer, por eso el ejemplo que deje usando ob_start().

Saludos
  #13 (permalink)  
Antiguo 28/01/2009, 12:39
Avatar de Sommy  
Fecha de Ingreso: septiembre-2008
Mensajes: 228
Antigüedad: 15 años, 7 meses
Puntos: 6
Respuesta: warning!

Cita:
Iniciado por GatorV Ver Mensaje
No es necesario que sea al inicio del archivo, ¿donde leiste eso? , puede ser perfectamente al final de un archivo en medio en donde quieras.

Lo importante y clave es que NO puedes enviar nada de texto, esto es por diseño del protocolo HTTP, si realmente no puedes diseñar correctamente el flujo de tu script entonces puedes recurrir a las funciones de salida de PHP para controlar la salida de texto:
Código php:
Ver original
  1. <?php
  2. ?>
  3. <html>
  4. <head>
  5. <title>blah</title>
  6. </head>
  7. <body>
  8. <p>blah</p>
  9. <?php
  10. echo "foo";
  11. ?>
  12. </body>
  13. </html>
  14. <?php
  15. header("Location: algo.php");
  16. ?>

Como te comento no es por PHP, y que PHP "llore", el problema es el mal diseño de muchos scripts, y el diseño del protocolo HTTP, cuando tu envias una cabezera esta debe de ser ANTES del documento de salida, por eso si envias texto, pues automaticamente cortas con el proceso de la transferencia, y por ende ya no puedes enviar las cabeceras.

Saludos
Me alegra saber que existe forma!! realmente no conocia lo de ob_start(). Ahora, eso no comera mas recursos? Pregunto porque ni idea... Me suena que php tiene que pensar y esforzarse un poco mas...

Sin duda, es superior a cualquier cosa, pero asi como superior, no pueden negarme que es mas hincha cocos... Lo cual no esta mal, porque como dice Triby nos obliga a hacer las cosas bien.

Lo que es fatal que veo en muchos lados es que hardcodean todo el HTML para poder hacer un header... Triste...

Gracias hicos!
  #14 (permalink)  
Antiguo 28/01/2009, 12:51
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Es que la forma ideal para hacer tus scripts es:

1- Realizas comprobacion de sesion (solo si es necesario)
2- Tomas toda la informacion necesaria de GET, POST o SESSION
3- Verificas que todo sea correcto y, si es necesario, consultas la base de datos

En este punto, normalmente ya sabes si hay errores o no, si los hay, te brincas directo al paso 5 o redireccionas, mandas mensaje de error, etc., Si no hay errores, continuas al paso 4

4- Insercion o actualizacion en base de datos (solo si es necesario), envio de correo electronico, etc.

Aqui tambien puedes guardar cookies, sesiones, redireccionar, mandar mensaje o lo que sea que quieras hacer.

5- Muestras el contenido de tu pagina actual. Aqui ya no puedes crear cookies, sesiones, ni redireccionar, aqui solo envias contenido.

Cita:
Iniciado por GatorV Ver Mensaje
Puedes poner cookies en cualquier parte el chiste es manejar correctamente el buffer, por eso el ejemplo que deje usando ob_start().
Y, como dijiste antes, ob_start() no es la solucion mas elegante para hacer las cosas correctamente.
__________________
- León, Guanajuato
- GV-Foto

Última edición por GatorV; 28/01/2009 a las 14:04
  #15 (permalink)  
Antiguo 28/01/2009, 14:04
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: warning!

Exacto, solo es para que vean que sí es posible hacerlo, por otro lado ob_start() no genera una "sobrecarga" ya que PHP en lugar de enviar el buffer de salida, lo guarda, no hay diferencia en cuanto a rendimiento, de hecho la directiva output_buffering, en el php.ini por defecto viene así:

output_buffering = 4096

Es decir que PHP va a guardar hasta 4096 bytes de contenido impreso (con echo, print, o saliendo de modo PHP), y después de esos 4096 va enviar el contenido, por eso a veces PHP NO marca error cuando vemos algo así:
Código php:
Ver original
  1. <html>
  2. <?php
  3. header("Location: foo.php");
  4. ?>

Ya que si esta activada PHP va a guardar ese <html> extra y te permite enviar las cabeceras.

Saludos
  #16 (permalink)  
Antiguo 28/01/2009, 14:20
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: warning!

Lo malo es que ni con ob_start() se soluciona el problema de diegonazho:
Código PHP:
if($row['observacion'] == 'Usuario'){

echo 
"Bienvenido ".$_SESSION['s_username'].", ahora puedes ingresar tus solicitudes" ;
header("Location: ingsolicitud.php");//paso automatico a otra pagina

}else{

echo 
"Bienvenido ".$_SESSION['s_username']." ingresaste como ".$_SESSION['o_observacion']." " ;
header("Location: solicitudes.php"); //AQUI LA LINEA 50

Diegonazho, mas bien necesitas redireccionar con <meta name="refresh" ... />, de forma que el usuario vea el mensaje y despues sea redirigido.

Edito:
GatorV, gracias por unir mis dos mensajes anteriores.
__________________
- León, Guanajuato
- GV-Foto
  #17 (permalink)  
Antiguo 28/01/2009, 14:24
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: warning!

o usar el mismo header(), pero con la cabecera correcta!

Código PHP:
header("Refresh: 5;url=solicitudes.php");

echo 
'Algo...'
pero ojo... debes siempre imprimir después de este header() no antes!!!
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #18 (permalink)  
Antiguo 28/01/2009, 14:24
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: warning!

Por accesibilidad, lo más recomendable es hacerlo como en este foro, que te presenta el mensaje "gracias por iniciar sesión, y te redirecciona a la pagina que estabas viendo, y aparte te muestra un boton para presionar".

Saludos
  #19 (permalink)  
Antiguo 28/01/2009, 14:30
 
Fecha de Ingreso: enero-2009
Mensajes: 142
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: warning!

xuata tengo la media ensala en la cabeza, vere con <meta name="refresh" ... />haber si me deja bien esta cosa
oe gatorv por casualidad sabes el codigo que dices tu ??

gracias por iniciar sesión, y te redirecciona a la pagina que estabas viendo, y aparte te muestra un boton para presionar".



uta me quede dormido en la pega, me perdi de mucho parece :D
  #20 (permalink)  
Antiguo 28/01/2009, 14:31
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: warning!

Normalmente yo uso plantillas y hago una para redirigir, por eso sugeri el meta refresh.

pateketrueke, sabes algo sobre ventajas y desventajas respecto a la redireccion por meta o por header?

Supongo, que en todo caso, tambien con el header se debe hacer una salida completa, es decir, desde <html><head>.... hasta ...</body></html>
__________________
- León, Guanajuato
- GV-Foto
  #21 (permalink)  
Antiguo 28/01/2009, 14:36
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: warning!

Cita:
Iniciado por Triby Ver Mensaje
[...] sabes algo sobre ventajas y desventajas respecto a la redireccion por meta o por header?

[...]
en realidad el efecto es el mismo... sin duda!

¿ventajas?

que con header() no debes escribir nada de HTML, solo si es necesario ... en el caso de usar plantillas (buena idea) es mejor usar <meta/> para no tener que lidiar siempre con PHP
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #22 (permalink)  
Antiguo 28/01/2009, 15:02
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: warning!

Ok, gracias, me quedo entonces con la plantilla y el meta.
__________________
- León, Guanajuato
- GV-Foto
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:47.