Tengo problemas para almacenar y recuperar mensajes de error después de una redirección. Como resultado, solo obtengo 'Array' o 'Array ([0] => No se agregaron archivos)'.
A continuación describo lo que estoy haciendo exactamente:

Estoy trabajando en un script php que carga archivos con la ayuda de un formulario de envío. Sin embargo, dado que pueden ocurrir varios errores durante el proceso de carga, los he almacenado en una matriz llamada $ errors. Un ejemplo de cómo agregué los mensajes de error a la matriz:

$errors[] = "The error message is placed here";

Una vez que el proceso de carga tiene éxito (o falla, en el caso de errores), la página se vuelve a cargar para borrar el formulario, entre otras cosas. Esto (creo) también es necesario para mostrar un error con php cuando un usuario envía un formulario en blanco (pero tal vez haya otra forma de hacerlo, pero no lo sé). Para informar al usuario sobre los errores que pueden haber aparecido durante el proceso de carga, quiero almacenar esta matriz $ errors en una variable de sesión, #_SESSION ['errors']. Espero que esto ayude a traer los errores a la página actualizada.

De todos modos, este es el script (aproximado) que tengo, que muestra dónde se encuentra el redireccionamiento.

if(isset($_POST['submit'])){
    [upload script]
}else{
    $errors[] = "No files were added.";
    $_SESSION[ 'errors' ] = $errors;
    header( 'Location:' . $_SERVER[ 'PHP_SELF' ] );
    exit();
}

Por supuesto que puse session_start (); debajo de mi etiqueta de apertura php (solo error_reporting (E_ALL) e ini_set ('display_errors', '1') están arriba de session_start (), nada más).

Probé si se envió la matriz, al incluir el siguiente código directamente debajo de session_start ():

if(isset($_SESSION[ 'errors' ])){
    $errors[] = $_SESSION[ 'errors' ];
    unset( $_SESSION[ 'errors' ] );
    print_r($errors);
}

Descubrí que se necesitaba desarmar; de lo contrario, los mismos errores se guardarían en $ _sessions ['errors'] una y otra vez después de actualizar. El print_r ($ errores) dio el siguiente resultado:

Array ( [0] => Array ( [0] => No files were added. ) )

Así que supongo que la matriz $ errors sobrevivió a la redirección, ¿verdad?

Entonces, pasemos a la visualización de los errores reales. Coloqué el código $ errors = $ _SESSION ['errors'] en el lugar donde quiero mostrar mis errores (en la etiqueta de mi cuerpo, debajo del menú). Aquí está el código:

if(isset($_SESSION[ 'errors' ])){
    $errors[] = $_SESSION[ 'errors' ];
    unset( $_SESSION[ 'errors' ] );

}
if(isset($errors)){
    echo "<div id=\"errorLog\" class=\"errorLogCl\" onClick=\"this.parentNode.style.display = 'none';\">";
    foreach ( $errors as $e ) {
        echo $e;
    }
    echo "</div>";
}

Sin embargo, esto solo da 'Array' como valor. Probé otras opciones, como print_r o:

foreach ($errors as $key => $errorvalue){
    echo($errorvalue);
}

Pero todavía obtengo solo 'Array' o 'Array ([0] => No se agregaron archivos.)' Como resultado.

¿Qué estoy haciendo mal y cómo almaceno y recupero correctamente los mensajes de error que estoy guardando en la matriz $ errors y $ _SESSIONS ['errors']? ¿O hay una mejor manera de enviar (múltiples) mensajes de error a través de una redirección?

2
Lisa 30 jul. 2017 a las 23:54

2 respuestas

La mejor respuesta

Como print_r le muestra, $ error es una matriz de matrices que contiene los mensajes. O tiene que cambiar (no inserte el error en otra matriz):

$_SESSION[ 'errors' ][] = $errors;

Para:

$_SESSION[ 'errors' ] = $errors;

O arregle su bucle for desde (iterar sobre la (s) matriz (s) interna (s)):

foreach ($errors as $key => $errorvalue){
  echo($errorvalue);
}

Para:

foreach ($errors as $key => $errorvalue){
  if(is_array($errorvalue)) {
    foreach ($errorvalue as $em) {
      echo $em;
    }
  }
}

EDITAR De hecho, ahora estoy un poco confundido. Estas tres líneas significarían que necesita 3 bucles para cada uno:

$errors[] = "No files were added.";
$_SESSION[ 'errors' ][] = $errors;
$errors[] = $_SESSION[ 'errors' ];

Pero la declaración print_r apunta a 2 para cada uno:

print_r($errors)
Array ( [0] => Array ( [0] => No files were added. ) )

La primera parte encaja muy bien con su solución. Quitó un par de corchetes [], y usó dos foreach, y creo que su código funcionará si quita [] de la tercera línea que copié. Pero no puedo explicar la salida print_r. ¿Estás seguro si no fue de print_r ($ e)?

3
jh1711 30 jul. 2017 a las 21:55

Necesitas algún tipo de foreach:

foreach ($_SESSION['errors'] as $result)  
    echo($result)

Deberia trabajar. La razón es que $ _SESSION es una matriz de matrices.

Piense en ello así:
Le dice a PHP que haga una lista de elementos llamados $ errores. Luego le dice a PHP que ponga esta lista en una lista de listas. La razón por la que no funcionó es que está intentando mostrar la lista en sí, y no los elementos uno por uno.

0
Ray Wu 30 jul. 2017 a las 21:05