redirigir - redireccionar php no funciona
La redirección del encabezado de PHP no funciona (12)
Alternativamente, para no pensar en una nueva línea o espacio en algún lugar del archivo, puede almacenar el resultado. Básicamente, llamas a ob_start()
al principio del archivo y ob_end_flush()
al final. Puede encontrar más detalles en la descripción de la función php.net ob-start .
Editar: si utiliza el almacenamiento en búfer, puede generar HTML antes y después de la función de encabezado (): el almacenamiento en memoria intermedia ignorará la salida y devolverá solo el encabezado de redirección.
Esta pregunta ya tiene una respuesta aquí:
- Cómo reparar el error "Encabezados ya enviados" en PHP 11 respuestas
include(''header.php'');
$name = $_POST[''name''];
$score = $_POST[''score''];
$dept = $_POST[''dept''];
$MyDB->prep("INSERT INTO demo (`id`,`name`,`score`,`dept`, `date`) VALUES ('''',''$name'',''$score'',''$dept'',''$date'')");
// Bind a value to our :id hook
// Produces: SELECT * FROM demo_table WHERE id = ''23''
$MyDB->bind('':date'', $date);
// Run the query
$MyDB->run();
header(''Location:index.php'');
exit;
El código anterior me sigue dando un problema con el redireccionamiento. El error es el siguiente:
Advertencia: No se puede modificar la información del encabezado: los encabezados ya enviados por (salida iniciada en /Applications/MAMP/htdocs/testygubbins/OO/test/header.php:15) en / Applications / MAMP / htdocs / testygubbins / OO / test / form. php en la línea 16.
Estoy totalmente desconcertado por esto. ¿Alguien sabe lo que debería hacer para que funcione?
EDITAR
código header.php:
<?php
include(''class.user.php'');
include(''class.Connection.php'');
$date = date(''Y-m-j'');
?>
<html>
<head>
<link rel=StyleSheet href="css/style.css" type="text/css" media=screen>
<title>Test</title>
</head>
<body>
<div id="page">
Es posible que tenga algún "texto sin formato" en algún lugar de los archivos php que se interpreta como resultado del script. Puede ser incluso una nueva línea antes o después del especificador de etiqueta de script php (menos de + signo de interrogación + "php").
Además, si mal no recuerdo, según la especificación http, el encabezado "Ubicación" solo acepta URL completos, no ubicaciones relativas. Tenga eso en mente también.
Mire cuidadosamente sus inclusiones, ¿quizás tiene una línea en blanco después de un cierre?>?
Esto causará que se envíe un espacio en blanco literal como salida, lo que le impedirá realizar llamadas de encabezado posteriores.
Tenga en cuenta que es legal dejar el cierre?> Fuera del archivo de inclusión, que es una expresión útil para evitar este problema.
(EDITAR: mirando su encabezado, debe evitar hacer cualquier salida de HTML si desea generar encabezados, o usar el almacenamiento en búfer de salida para capturarlo).
Finalmente, como señala la página del manual de PHP para el encabezado , realmente debería usar URL completas para redirigir:
Nota: HTTP / 1.1 requiere un URI absoluto como argumento para la ubicación: incluyendo el esquema, el nombre de host y la ruta absoluta, pero algunos clientes aceptan URI relativos. Por lo general, puede usar $ _SERVER [''HTTP_HOST''], $ _SERVER [''PHP_SELF''] y dirname () para crear un URI absoluto a partir de uno relativo:
Mire la línea /Applications/MAMP/htdocs/testygubbins/OO/test/header.php 15.
En esa posición, produce algo de salida. Arreglalo. :)
No incluya header.php. No deberías generar HTML cuando vas a redirigir.
Haga un nuevo archivo, ej. "pre.php". Pon esto en esto:
<?php
include(''class.user.php'');
include(''class.Connection.php'');
?>
Luego, en header.php, inclúyalo, en lugar de incluir los otros dos archivos. En form.php, incluye pre.php en lugar de header.php.
Si entiendo correctamente, algo ya ha enviado desde header.php (tal vez un poco de HTML) por lo que los encabezados se han establecido. Es posible que necesite volver a verificar su archivo header.php para ver si hay alguna parte que pueda generar HTML o espacios antes de su primer
EDITAR: ahora estoy seguro de que es causado por header.php ya que tiene esos resultados HTML. Puede solucionar esto eliminando el "include (''header.php'');" alinee y copie el siguiente código en su archivo.
include(''class.user.php'');
include(''class.Connection.php'');
$date = date(''Y-m-j'');
Su inclusión produce salida, por lo que es imposible enviar un encabezado http más tarde. Dos opciones:
- Mueva la salida a algún lugar después de incluir.
- Use el buffer de salida , es decir, al comienzo de su script, ponga ob_start (), y al final, ponga ob_flush (). Esto permite a PHP esperar primero a que se recopile toda la salida, determinar en qué orden representarla y generarla.
Te recomendaría que aprendas la segunda opción, ya que te hace mucho más flexible.
Pruebe la redirección con JavaScript:
<script type="text/javascript">
window.location.href=''index.php'';
</script>
Prueba esto :
**ob_start();**
include(''header.php'');
$name = $_POST[''name''];
$score = $_POST[''score''];
$dept = $_POST[''dept''];
$MyDB->prep("INSERT INTO demo (`id`,`name`,`score`,`dept`, `date`) VALUES ('''',''$name'',''$score'',''$dept'',''$date'')");
// Bind a value to our :id hook
// Produces: SELECT * FROM demo_table WHERE id = ''23''
$MyDB->bind('':date'', $date);
// Run the query
$MyDB->run();
header(''Location:index.php'');
**ob_end_flush();**
exit;
También vea su codificación de texto del archivo php . El mío era UTF-8
con BOM
e impedía que el script funcionara. Pero ahora funciona sin problemas después de quitar la BOM
...
también intente include_once () en vez de include () que también puede funcionar
PROBLEMAS COMUNES:
1) no debería haber ningún resultado (es decir, echo..
o códigos HTML) antes del header(.......);
mando.
2) Después del header(...);
debes usar exit;
3) elimine cualquier espacio en blanco (o nueva línea ) antes de las etiquetas <?php
y after ?>
.
4) Verifique que el archivo php (y también otros archivos .php
, que include
d) - deben tener UTF8 sin codificación BOM (y no solo UTF-8 ). Debido a que el UTF8 predeterminado agrega caracteres invisibles en el inicio del archivo (llamado " BOM "), ¡entonces deberías evitar eso !!!!!!!!!!!
5) siempre use la referencia 301 o 302:
header("location: http://example.com", true, 301 ); exit;
6) Active el informe de errores. Y di el error.
7) Si ninguno de los anteriores ayuda, use la redirección JAVSCRIPT (sin embargo, método fuertemente no recomendado), puede ser la última oportunidad en casos personalizados ...:
echo "<script type=''text/javascript''>window.top.location=''http://website.com/'';</script>"; exit;