Foros del Web » Programando para Internet » PHP »

Duda con header()

Estas en el tema de Duda con header() en el foro de PHP en Foros del Web. Hola a [email protected] otra vez :), He estado mirando en los mensajes del foro, en php.net y tengo una duda con header porque no me ...
  #1 (permalink)  
Antiguo 12/07/2006, 13:02
 
Fecha de Ingreso: marzo-2004
Ubicación: Sureste
Mensajes: 186
Antigüedad: 13 años, 9 meses
Puntos: 0
Duda con header()

Hola a [email protected] otra vez :),

He estado mirando en los mensajes del foro, en php.net y tengo una duda con header porque no me funciona este código:

Código PHP:
<?php
function redirect($url) {
    if (!
headers_sent()) {
        
header('Location: http://' $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . '/' $url);
        } else {
            die(
'No se puede redireccionar; Titulares ya enviados.');
        }
    }
?>
Este código está en un archivo llamado http.php que se solicita con require_once en un archivo que es el action de un formulario (para insertar noticias en una base de datos) donde están los diferentes casos de las noticias mediante switch { case ...

El formulario está en otro archivo diferente, siendo el proceso este:

formulario.php -> accion.php -> http.php -> index.php (donde apareceria el listado de documentos)

Los datos del formulario se están insertando correctamente en la tabla, pero cuando va a redireccionar aparece el error: Could not redirect; Headers already sent (output).

Este error es debido a que los archivos anteriores al paso http.php tienen salidas echo y html, o puede ser debido al switch??

Gracias y un saludo!!!
Kailea
  #2 (permalink)  
Antiguo 12/07/2006, 13:20
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Si expusieras todo el código que usas y el mensaje de error sería lo ideal .. digo el mensaje de error completo NO omitas líneas que se hacen mención ni nombres de los scripts (si quieres .. quita las referencias de las rutas comprometedoras).

Es en ese mensaje de error donde se menciona donde está tu problema. Es decir, en que línea de que script se está originando un envio de cabeceras HTTP antes de las que PHP pretende enviar por header().

Por eso mismo el código implicado (verlo, de hecho halas de un tal "switch" que no vemos ...) ayuda a decirte como re-ordenar tu código si corresponde u otros consejos.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #3 (permalink)  
Antiguo 14/07/2006, 10:52
 
Fecha de Ingreso: marzo-2004
Ubicación: Sureste
Mensajes: 186
Antigüedad: 13 años, 9 meses
Puntos: 0
A ver si me podéis ayudar entonces :)

Este es el archivo del formulario desde donde se envía:

compose.php
Código PHP:
<?php
require_once '../includes/conn.php';
include(
'header.php');

$titulo '';
$cuerpo '';
$article '';
$autor_id '';

if (isset(
$_POST['a']) 
    and 
$_POST['a'] == 'edit' 
    
and isset($_POST['article']) 
    and 
$_POST['article']) {

    
$sql "SELECT titulo,cuerpo,autor_id FROM not_main WHERE not_id=" $_POST['article'];
    
$result mysql_query($sql,$conn)
        or die(
'No se pueden obtener los datos del artículo; ' mysql_error());

    
$row = @mysql_fetch_array($result);

    
$titulo $row['titulo'];
    
$cuerpo $row['cuerpo'];
    
$article $_POST['article'];
    
$autor_id $row['autor_id'];

    }

require_once 
'header.php';

?>

<form method="post" action="transact-article.php">
<h2>Escribir documento</h2>
<p>Titulo:</p>
<p><input type="text" class="titulo" name="titulo" size="93" maxlength="500" value="<?php echo htmlspecialchars($titulo); ?>" /></p>
<p>Texto:</p>
<p><textarea class="cuerpo" name="cuerpo" rows="20" cols="70"><?php echo htmlspecialchars($cuerpo); ?></textarea></p>
<p>
<?php
echo '<input type="hidden" name="article" value="' $article "\" />\n";
    if (
$_SESSION['access_lvl'] < 2) {
        echo 
'<input type="hidden" name="autor_id" value="' $autor_id "\" />\n";
    }
    if (
$article) {
        echo 
'<input type="submit" class="submit" name="action" ' "value=\"Guardar cambios\" />\n";
    } else {
        echo 
'<input type="submit" class="submit" name="action" ' "value=\"Enviar\" />\n";
    }
?>
</p>
</form>

<?php require_once 'footer.php'?>
Este es el archivo transact-article:

Código PHP:
<?php
    session_start
();
    require_once 
'../includes/conn.php';
    require_once 
'http.php';

    if (isset(
$_POST['action'])) {
        switch (
$_POST['action']) {
            case 
'Enviar':
                if (isset(
$_POST['titulo'])
                    and isset(
$_POST['cuerpo'])
                    and isset(
$_SESSION['autor_id']))
                {
                    
$sql "INSERT INTO not_main (not_id,titulo,cuerpo,autor_id,fecha_envio)  VALUES ('','" $_POST['titulo']  . "','" $_POST['cuerpo'] . "','" $_SESSION['autor_id'] . "', NOW())";

                    
mysql_query($sql,$conn)
                        or die(
'No se puede enviar el artículo; ' mysql_error());
                }
                
redirect('index.php');
                break;

            case 
'Editar':
                
redirect('compose.php?a=edit&article=' $_POST['article']);
                break;

            case 
'Guardar los cambios':
                if (isset(
$_POST['titulo']) and isset($_POST['cuerpo']) and isset($_POST['articulo']))
                {
                    
$sql="UPDATE not_main " "SET title='" $_POST['titulo'] . "', cuerpo='" $_POST['cuerpo'] . "', fecha_envio='" date("d-m-Y H:i:s"time()) . "' " "WHERE not_id=" $_POST['article'];
                    if (isset(
$_POST['autor_id'])) {
                        
$sql .= " AND autor_id=" $_POST['autor_id'];
                    }

                    
mysql_query($sql$conn)
                        or die(
'No se puede actualizar el artículo; ' mysql_error());
                }
                if (isset(
$_POST['autor_id'])) {
                    
redirect('cpanel.php');
                } else {
                    
redirect('pending.php');
                }
                break;

        case 
'Retroceder':
            if (
$_POST['article']) {
                
$sql "UPDATE not_main " "SET esta_publicada=0,fecha_publicacion=''" "WHERE not_id=" $_POST['article'];
                
mysql_query($sql,$conn)
                    or die(
'No se puede retroceder al artículo; ' mysql_error());
            }
            
redirect('pending.php');
            break;

        case 
'Borrar':
            if (
$_POST['article']) {
                
$sql "DELETE FROM not_main " "WHERE esta_publicada=0 " "AND " "not_id=" $_POST['article'];
                
mysql_query($sql,$conn)
                    or die(
'No se puede borrar el artículo; ' mysql_error());
        }
        
redirect ('pending.php');
        break;
        case 
'Enviar comentario':
            if (isset(
$_POST['article'])
                and 
$_POST['article']
                and isset(
$_POST['comment'])
                and 
$_POST['comment'])
            {
                
$sql "INSERT INTO not_comments " "(not_id,fecha_comment,comment_user,comment_text) " "VALUES (" $_POST['article'] . ",'" "VALUES (" $_POST['article'] .",'" date("Y-m-d H:i:s"time()) . "'," $_SESSION['autor_id'] . ",'" $_POST['comment'] . "');";
                
mysql_query($sql,$conn)
                    or die(
'No se puede añadir un comentario; ' mysql_error());
            }
            
redirect('viewarticle.php?article=' $_POST['article']);
            break;

        case 
'Eliminar':
            if (isset(
$_GET['article']) and isset($_SESSION['autor_id']))
            {
                
$sql "DELETE FROM not_main " "WHERE not_id=" $_GET['article'] . " AND autor_id=" $_SESSION['autor_id'];
                
mysql_query($sql,$conn)
                    or die(
'No se puede eliminar el artículo; ' mysql_error());
            }
            
redirect('cpanel.php');
            break;
    }
    } else {
    
redirect('index.php');
    }
?>

Pues ese es el código de los dos archivos a ver qué sale... porque funcionó y después volvió a dar el error... :?

Gracias :)
  #4 (permalink)  
Antiguo 14/07/2006, 12:51
 
Fecha de Ingreso: marzo-2004
Ubicación: Sureste
Mensajes: 186
Antigüedad: 13 años, 9 meses
Puntos: 0
Bueno, además,ahora al ejecutar por primera vez el archivo compose.php me sale este mensaje:


Código PHP:
WarningUnknown(): Your script possibly relies on a session side-effect which existed until PHP 4.2.3Please be advised that the session extension does not consider global variables as a source of dataunless register_globals is enabledYou can disable this functionality and this warning by setting session.bug_compat_42 or session.bug_compat_warn to offrespectivelyin Unknown on line 0 

Y el caso es que ayer todo funcionaba perfectamente y hoy... a saber qué habrá pasado.
  #5 (permalink)  
Antiguo 14/07/2006, 13:36
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
El mensaje de error te indica que estás pretendiendo acceder a una variable de sesión (o que está creada en una sesión) en forma global, es decir ..

Si la variable de sesión es de nombre "variable" .. tu pretendes accederlas por:
$variable
Cuando lo que debes hacer es:
$_SESSION['variable']

A todo esto .. puede ser que tengas una confusión o duplicidad de nombres de variables (tuyas que usa en tiempo de ejecución ese script y de sesión que generas) .. ojo con eso.

También te comenta como "desactivar" esa comprobación que hace PHP por tí y por tu seguridad .. fijate en las directivas de php.ini que hace mención ...


Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #6 (permalink)  
Antiguo 15/07/2006, 04:24
 
Fecha de Ingreso: marzo-2004
Ubicación: Sureste
Mensajes: 186
Antigüedad: 13 años, 9 meses
Puntos: 0
Ok,voy a ponerme a revisar todos los nombres... y a ver si así...soluciono algo.

Gracias!
  #7 (permalink)  
Antiguo 15/07/2006, 05:06
 
Fecha de Ingreso: marzo-2004
Ubicación: Sureste
Mensajes: 186
Antigüedad: 13 años, 9 meses
Puntos: 0
Bueno pues revisando nombres, no he solucionado ná de ná.

La función header() sigue sin tirar bien. Y al intentar imprimir los resultados del case Enviar, (quitando la función redireccionar) con

print_r(@mysql_fetch_array(mysql_query($sql,$conn) ));

no imprime nada en la pantalla pero sí inserta en la base de datos.

Esto es de locos :(
  #8 (permalink)  
Antiguo 15/07/2006, 09:07
 
Fecha de Ingreso: marzo-2004
Ubicación: Sureste
Mensajes: 186
Antigüedad: 13 años, 9 meses
Puntos: 0
Ya lo resolví... era un espacio al final del archivo http.php

Gracias por la ayuda (ha servido para revisar las variables)

Saludos.
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 23:59.