Pregunta Referencia - ¿Qué significa este error en PHP?


¿Que es esto?

Esta es una serie de respuestas sobre advertencias, errores y avisos que puede encontrar al programar PHP y no tiene ni idea de cómo solucionarlo. Esta es también una Wiki de la comunidad, por lo que todos están invitados a participar para agregar y mantener esta lista.

¿Por qué es esto?

Preguntas como "Encabezados ya enviados" o "Llamar a un miembro de un no objeto" aparece con frecuencia en Stack Overflow. La causa raíz de esas preguntas es siempre la misma. Entonces, las respuestas a esas preguntas generalmente las repiten y luego muestran el OP que línea debe cambiar en su caso particular. Estas respuestas no agregan ningún valor al sitio porque solo se aplican al código particular del OP. Otros usuarios que tienen el mismo error no pueden leer fácilmente la solución porque están demasiado localizados. Eso es triste, porque una vez que entendiste la causa raíz, arreglar el error es trivial. Por lo tanto, esta lista intenta explicar la solución de forma general para aplicarla.

¿Qué debería hacer aquí?

Si su pregunta ha sido marcada como un duplicado de esto, encuentre su mensaje de error a continuación y aplique la corrección a su código. Las respuestas generalmente contienen enlaces adicionales para investigar en caso de que no esté claro solamente por la respuesta general.

Si desea contribuir, agregue su mensaje de error "favorito", advertencia o aviso, uno por respuesta, una breve descripción de lo que significa (incluso si solo resalta los términos de su página de manual), una posible solución o enfoque de depuración y una lista de preguntas y respuestas existentes que son de valor. Además, siéntete libre de mejorar cualquier respuesta existente.

La lista

Ver también


907


origen


Respuestas:


Advertencia: no se puede modificar la información del encabezado: los encabezados ya enviados

Ocurre cuando su secuencia de comandos intenta enviar un encabezado HTTP al cliente, pero ya había salida antes, lo que resultó en que los encabezados ya se envían al cliente.

Esto es un E_WARNING y no detendrá el guión.

Un ejemplo típico sería un archivo de plantilla como este:

<html>
    <?php session_start(); ?>
    <head><title>My Page</title>
</html>
...

los session_start() función intentará enviar encabezados con la cookie de sesión al cliente. Pero PHP ya envió encabezados cuando escribió el <html> elemento a la secuencia de salida. Tendría que mover el session_start() a la cima.

Puedes resolver esto pasando por las líneas antes de el código que activa la advertencia y comprueba dónde se genera. Mueva cualquier código de envío de encabezado antes de ese código.

Un resultado que a menudo se pasa por alto son las nuevas líneas después del cierre de PHP ?>. Se considera una práctica estándar omitir ?> cuando es lo último en el archivo. Del mismo modo, otra causa común de esta advertencia es cuando la apertura <?php tiene un espacio vacío, una línea o un carácter invisible antes, lo que provoca que el servidor web envíe los encabezados y el espacio en blanco / nueva línea cuando PHP comienza a analizar no podrá enviar ningún encabezado.

Si su archivo tiene más de una <?php ... ?> bloque de código en él, no debe tener ningún espacio entre ellos. (Nota: es posible que tenga varios bloques si tuviera un código que se construyó automáticamente)

También asegúrese de que no tenga ninguna marca de orden de bytes en su código, por ejemplo, cuando la codificación del script es UTF-8 con BOM.

Preguntas relacionadas:


225



Error fatal: llamada a una función miembro ... en un objeto no objeto

Ocurre con un código similar a xyz->method() dónde xyz no es un objeto y por lo tanto eso method no se puede llamar.

Este es un error fatal que detendrá la secuencia de comandos (notificación de compatibilidad anticipada: se convertirá en un error detectable que comienza con PHP 7).

En la mayoría de los casos, esto es una señal de que el código no tiene comprobaciones de las condiciones de error. Valide que un objeto es realmente un objeto antes de llamar a sus métodos.

UN típico ejemplo sería

// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);

En el ejemplo anterior, la consulta no puede prepararse y prepare() asignará false a $statement. Intentando llamar al execute() método entonces resultará en el error fatal porque false es un "no objeto" porque el valor es un booleano.

Descifrar por qué su función devolvió un valor booleano en lugar de un objeto. Por ejemplo, verifique $pdo objeto para el último error que ocurrió. Los detalles sobre cómo depurar esto dependerán de cómo se manejan los errores para la función / objeto / clase particular en cuestión.

Si incluso el ->prepare está fallando entonces su $pdo objeto de manejo de base no pasó al alcance actual. Encuentra dónde se definió. Luego, páselo como parámetro, almacénelo como propiedad o compártalo en el alcance global.

Otro problema puede ser la creación condicional de un objeto y luego intentar llamar a un método fuera de ese bloque condicional. Por ejemplo

if ($someCondition) {
    $myObj = new MyObj();
}
// ...
$myObj->someMethod();

Al intentar ejecutar el método fuera del bloque condicional, es posible que su objeto no esté definido.

Preguntas relacionadas:


156



Nada se ve La página está vacía y blanca.

También conocido como el Página blanca de la muerte o Pantalla blanca de la muerte. Esto ocurre cuando se desactiva el informe de errores y se produce un error fatal (a menudo un error de sintaxis).

Si tiene habilitado el registro de errores, encontrará el mensaje de error concreto en su registro de errores. Esto generalmente estará en un archivo llamado "php_errors.log", ya sea en una ubicación central (p. /var/log/apache2 en muchos entornos Linux) o en el directorio del script en sí (a veces se usa en un entorno de alojamiento compartido).

A veces puede ser más sencillo habilitar temporalmente la visualización de errores. La página blanca mostrará el mensaje de error. Tenga cuidado porque estos errores son visibles para todos los que visitan el sitio web.

Esto se puede hacer fácilmente agregando en la parte superior del script el siguiente código PHP:

ini_set('display_errors', 1); error_reporting(~0);

El código activará la visualización de errores y establecerá los informes al más alto nivel.

Desde el ini_set() se ejecuta en tiempo de ejecución no tiene efectos en los errores de sintaxis y análisis. Esos errores aparecerán en el registro. Si desea mostrarlos en la salida también (por ejemplo, en un navegador), debe configurar el display_startup_errors directiva a true. Haz esto en el php.ini o en una .htaccess o por cualquier otro método que afecte la configuración antes de tiempo de ejecución.

Puede usar los mismos métodos para configurar el log_errors y registro de errores directivas para elegir su propia ubicación de archivo de registro.

Si busca en el registro o utiliza la pantalla, obtendrá un mensaje de error mucho mejor y la línea de código donde se detiene el script.

Preguntas relacionadas:

Errores relacionados:


100



Aviso: índice indefinido

Ocurre cuando intenta acceder a una matriz mediante una clave que no existe en la matriz.

Un ejemplo típico para un Undefined Index aviso sería (manifestación)

$data = array('foo' => '42', 'bar');
echo $data['spinach'];
echo $data[1];

Ambos spinach y 1 no existen en la matriz, causando E_NOTICE para ser activado

La solución es asegurarse de que el índice o el desplazamiento exista antes de acceder a ese índice. Esto puede significar que necesita corregir un error en su programa para asegurarse de que esos índices existan cuando usted lo espera. O puede significar que necesita probar si los índices existen usando array_key_exists o isset:

$data = array('foo' => '42', 'bar');
if (array_key_exists('spinach', $data)) {
    echo $data['spinach'];
}
else {
    echo 'No key spinach in array';
}

Si tiene código como:

<?php echo $_POST['message']; ?>
<form method="post" action="">
    <input type="text" name="message">
    ...

entonces $_POST['message'] no se establecerá cuando esta página se cargue por primera vez y obtendrá el error anterior. Solo cuando se envíe el formulario y este código se ejecute por segunda vez, existirá el índice de matriz. Por lo general, comprueba esto con:

if ($_POST)  ..  // if the $_POST array is not empty
// or
if ($_SERVER['REQUEST_METHOD'] == 'POST') ..  // page was requested with POST

Preguntas relacionadas:


89



Advertencia: mysql_fetch_array () espera que el parámetro 1 sea resource, boolean given

Primero y ante todo:

Por favor, no uses mysql_* funciones en nuevo código. Ya no se mantienen y están oficialmente desaprobados. Ver el caja roja? Aprender acerca declaraciones preparadas en su lugar, y uso DOP o MySQLi - Este artículo te ayudará a decidir cuál. Si elige PDO, aquí hay un buen tutorial.


Esto sucede cuando intentas obtener datos del resultado de mysql_query pero la consulta falló.

Esta es una advertencia y no detendrá el script, pero hará que su programa sea incorrecto.

Debe verificar el resultado devuelto por mysql_query por

$res = mysql_query($sql);
if (!$res) {
   die(mysql_error());
}
// after checking, do the fetch

Preguntas relacionadas:

Errores relacionados:

Otro mysql* funciones que también esperan un recurso de resultado mysql como parámetro producirán el mismo error por la misma razón.


75



Error fatal: usar $ this cuando no está en el contexto del objeto

$this es una variable especial en PHP que no se puede asignar. Si se accede a él en un contexto donde no existe, se da este error fatal.

Este error puede ocurrir:

  1. Si un método no estático se llama estáticamente. Ejemplo:

    class Foo {
       protected $var;
       public function __construct($var) {
           $this->var = $var;
       }
    
       public static function bar () {
           // ^^^^^^
           echo $this->var;
           //   ^^^^^
       }
    }
    
    Foo::bar();
    

    Como arreglar: revisa tu código nuevamente, $this solo se puede usar en contexto de objeto, y nunca se debe usar en un método estático. Además, un método estático no debe acceder a la propiedad no estática. Utilizar self::$static_property para acceder a la propiedad estática.

  2. Si el código de un método de clase se ha copiado en una función normal o solo en el ámbito global y manteniendo el $thisvariable especial.
    Como arreglar: Revisa el código y reemplaza $this con una variable de sustitución diferente.

Preguntas relacionadas:

  1. Llame al método no estático como estático: Error fatal de PHP: usar $ this cuando no está en el contexto del objeto
  2. Copia el código: Error fatal: usar $ this cuando no está en el contexto del objeto
  3. Todo "Usar $ this cuando no está en el contexto del objeto" Preguntas sobre Stackoverflow

69



Error fatal: llamada a la función no definida XXX

Ocurre cuando intentas llamar a una función que aún no está definida. Las causas comunes incluyen extensiones faltantes e incluye, declaración de función condicional, función en declaración de función o errores tipográficos simples.

Ejemplo 1 - Declaración de función condicional

$someCondition = false;
if ($someCondition === true) {
    function fn() {
        return 1;
    }
}
echo fn(); // triggers error

En este caso, fn() nunca será declarado porque $someCondition no es verdad.

Ejemplo 2 - Función en la declaración de función

function createFn() 
{
    function fn() {
        return 1;
    }
}
echo fn(); // triggers error

En este caso, fn solo será declarado una vez createFn() se llama. Tenga en cuenta que las llamadas posteriores a createFn() activará un error sobre la redeclaración de una función existente.

También puede ver esto para una función incorporada de PHP. Intenta buscar la función en el manual oficial, y compruebe a qué "extensión" (módulo PHP) pertenece, y qué versiones de PHP lo soportan.

En caso de que falte una extensión, instale esa extensión y habilítela en php.ini. Consulte las Instrucciones de instalación en el Manual de PHP para ver la extensión en la que aparece su función. También puede habilitar o instalar la extensión con su administrador de paquetes (p. apt en Debian o Ubuntu, yum en Red Hat o CentOS), o un panel de control en un entorno de alojamiento compartido.

Si la función se introdujo en una versión más nueva de PHP a partir de lo que está utilizando, puede encontrar enlaces a implementaciones alternativas en el manual o en su sección de comentarios. Si se eliminó de PHP, busque información sobre por qué, ya que puede que ya no sea necesario.

En caso de que falte incluir, asegúrese de incluir el archivo que declara la función antes de llamar a la función.

En caso de errores tipográficos, corrige el error tipográfico.

Preguntas relacionadas:


66



Error de análisis: error de sintaxis, inesperado T_XXX

Sucede cuando tienes T_XXX simbólico en lugares inesperados, paréntesis desequilibrados (superfluos), uso de etiquetas cortas sin activarlo en php.ini, y muchas más.

Preguntas relacionadas:

Para más ayuda, ver:


65



Error fatal: no se puede usar el valor de retorno de la función en el contexto de escritura

Esto generalmente ocurre cuando se usa una función directamente con empty.

Ejemplo:

if (empty(is_null(null))) {
  echo 'empty';
}

Esto es porque empty es una construcción de lenguaje y no una función, no se puede invocar con una expresión como argumento en versiones de PHP anteriores a 5.5. Antes de PHP 5.5, el argumento para empty()debe ser un variable, pero se permite una expresión arbitraria (como el valor de retorno de una función) en PHP 5.5+.

empty, a pesar de su nombre, en realidad no verifica si una variable está "vacía". En cambio, verifica si una variable no existe, o == false. Expresiones (como is_null(null) en el ejemplo) siempre se considerará que existe, así que aquí empty solo está comprobando si es igual a falso. Usted podría reemplazar empty() adjunto !, p.ej. if (!is_null(null)), o se compara explícitamente con falso, p. if (is_null(null) == false).

Preguntas relacionadas:


60