Referencia: ¿qué significa este error en PHP?

1137

¿Que es esto?

Esta es una serie de respuestas sobre advertencias, errores y avisos que puede encontrar al programar PHP y no tiene idea de cómo solucionarlos. Esta es también una Wiki comunitaria, por lo que todos están invitados a participar agregando y manteniendo esta lista.

¿Por qué es esto?

Preguntas como "Encabezados ya enviados" o "Llamar a un miembro de un no objeto" aparecen con frecuencia en Stack Overflow. La causa raíz de esas preguntas es siempre la misma. Por lo tanto, las respuestas a esas preguntas generalmente las repiten y luego muestran al OP qué línea 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 entendió la causa raíz, corregir el error es trivial. Por lo tanto, esta lista intenta explicar la solución de una manera general para aplicar.

¿Qué debo hacer aquí?

Si su pregunta ha sido marcada como un duplicado de esta, encuentre su mensaje de error a continuación y aplique la solución a su código. Las respuestas generalmente contienen más enlaces para investigar en caso de que no quede claro solo en 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 está resaltando los términos en 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éntase libre de mejorar cualquier respuesta existente.

La lista

Ver también:

miken32
fuente
77
Además, para sacar la discusión de los comentarios, vaya a esta meta pregunta
Earlz,

Respuestas:

275

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

Ocurre cuando su secuencia de comandos intenta enviar un encabezado HTTP al cliente pero ya se emitió antes, lo que resultó en que los encabezados ya se enviaran al cliente.

Esto es un E_WARNING y no detendrá el script.

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

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

La 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 en la secuencia de salida. Tendrías que moverlo session_start()a la parte superior.

Puede resolver esto yendo a través de las líneas antes del código que activa la Advertencia y verifique dónde sale. Mueva cualquier código de envío de encabezado antes de ese código.

Una salida 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 delante, lo que hace que el servidor web envíe los encabezados y el espacio en blanco / nueva línea, por lo que cuando PHP comience a analizar no podrá enviar cualquier encabezado

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

También asegúrese de no tener Marcas de orden de bytes en su código, por ejemplo, cuando la codificación de la secuencia de comandos es UTF-8 con BOM.

Preguntas relacionadas:

Gordon
fuente
2
Si está utilizando WordPress, verifique los archivos de temas. Cuando actualicé un sitio a una nueva versión de WordPress, no pude actualizar el tema porque no se ha actualizado en varios años. Este problema surgió. Resultó que el archivo functions.php tenía más de un <? ?> bloque con espacios en el medio.
Roy Leban
2
@RoyLeban "Si su archivo tiene más de un bloque ..." No estoy seguro de lo que esto significa. ¿Qué es un "bloque"? ¿Sería un bloque <?php ?>y entonces sería "más de un bloque" <?php ?> <?php ?>?
Andrew Fox
2
Si es posible, active la función 'buffering de salida' en el archivo de configuración PHP.ini.Se usa para resolver este problema. Envía el archivo html se guarda en el buffer de salida y se envía al cliente solo después de que el script se detiene, por lo que si dos los encabezados se emiten en una ubicación diferente, luego el encabezado anterior se reemplazará por el encabezado nuevo.
Nidhin David
191

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

Sucede con un código similar a xyz->method()donde xyzno es un objeto y, por lo tanto method, no se puede invocar.

Este es un error fatal que detendrá el script (aviso de compatibilidad directa: se convertirá en un error detectable a partir de PHP 7).

Muy a menudo, esto es una señal de que el código no tiene comprobaciones de condiciones de error. Valide que un objeto sea realmente un objeto antes de llamar a sus métodos.

Un ejemplo típico sería

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

En el ejemplo anterior, la consulta no se puede preparar y prepare()se asignará falsea $statement. Intentar llamar al execute()método dará como resultado el Error fatal porquefalse es un "no objeto" porque el valor es un valor booleano.

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

Si incluso el ->prepareestá fallando, entonces su $pdoobjeto de manejo de la base de datos no pasó al alcance actual . Encuentra dónde se definió. Luego páselo como parámetro, guárdelo como propiedad o compártelo a través del alcance global.

Otro problema puede ser crear un objeto condicionalmente 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, su objeto puede no estar definido.

Preguntas relacionadas:

hakre
fuente
115

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

También conocida como la Página Blanca de la Muerte o Pantalla Blanca de la Muerte . Esto sucede cuando el informe de errores está desactivado y se produce un error fatal (a menudo 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. Ej./var/log/apache2 en muchos entornos Linux) o en el directorio de la secuencia de comandos en sí (a veces se utiliza 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.

Dado que ini_set()se ejecuta en tiempo de ejecución, no tiene efectos en los errores de análisis / sintaxis. Esos errores aparecerán en el registro. Si desea mostrarlos también en la salida (por ejemplo, en un navegador), debe establecer la display_startup_errorsdirectiva true. Haga esto en php.inio en .htaccesso por cualquier otro método que afecte la configuración antes del tiempo de ejecución .

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

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

Preguntas relacionadas:

Errores relacionados:

finalmente
fuente
3
error_reporting(~0);¿por qué no -1? Eso es lo que se ~0evalúa y es mucho menos críptico.
Fabrício Matté
3
Creo que ambos son igualmente crípticos. ~0es más explícita la OMI: niega el conjunto de bits vacío, es decir, habilita todas las banderas. -1 no significa "no encontrado" como en strpos () en C, sino como un conjunto de bits con todas las banderas establecidas, porque -1 es binario 1111'1111'1111'1111(para 32 bits).
finalmente
2
Vaya, 1111'1111'1111'1111es realmente 16 bits, pero espero que entiendas lo que quiero decir.
nalply
3
@IvanSolntsev, lo siento, no, para las versiones anteriores a 5.4, E_STRICTno está incluido en E_ALL. php.net/manual/en/errorfunc.constants.php y desplácese hacia abajo hasta E_STRICT.
finalmente
102

Aviso: Índice indefinido

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

Un ejemplo típico de un Undefined Indexaviso sería ( demo )

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

Ambos spinachy 1no existen en la matriz, lo que hace E_NOTICEque se active un.

La solución es asegurarse de que el índice o 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 existen cuando lo espera. O puede significar que necesita probar si los índices existen usando array_key_existso isset:

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

Si tienes un 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, verifica esto con:

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

Preguntas relacionadas:

Gordon
fuente
if(!empty($_POST['message'])){ //do stuff }
Tiendo
85

Advertencia: mysql_fetch_array () espera que el parámetro 1 sea recurso, dado booleano

Primero y ante todo:

Por favor, no use mysql_*funciones en código nuevo . Ya no se mantienen y están oficialmente en desuso . ¿Ves el cuadro rojo ? Aprenda sobre las declaraciones preparadas y use PDO o MySQLi ; este artículo le ayudará a decidir cuál. Si elige PDO, aquí hay un buen tutorial .


Esto sucede cuando intenta obtener datos del resultado de mysql_querypero la consulta falla.

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

Debe verificar el resultado devuelto mysql_querypor

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

Preguntas relacionadas:

Errores relacionados:

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

xdazz
fuente
55
Solo una nota. Si mysql_queryno es lo suficientemente malo, agregar or dieencima es agregar insulto a la lesión.
El fantasma de Madara
El problema que encuentro es que $res = mysql_query($query)devuelve 1 si la consulta es exitosa, por lo que se considera verdadera. Por lo tanto, cuando se pasa el resultado de mysql_query que mysql_fetch_array() los espectáculos de notificación.
mboy
@mboy Para SELECT, SHOW, DESCRIBE, EXPLAIN y otras declaraciones que devuelven el conjunto de resultados, mysql_query () devuelve un recurso en caso de éxito o FALSE en caso de error. Para otro tipo de sentencias SQL, INSERT, UPDATE, DELETE, DROP, etc., mysql_query () devuelve TRUE en caso de éxito o FALSE en caso de error.
xdazz
@xdazz Ese es el problema al que me enfrento, Insertar actualización devuelve VERDADERO, así que no puedo deshacerme de este error, mysql_fetch_array() expects parameter 1 to be resource, boolean given in select por favor vea - gist.github.com/romelemperado/93af4cdbd44ebf3a07cbfa0e3fc539d7 ¿ Alguna sugerencia para deshacerse de este error?
mboy
2
@mboy mysql_fetch_array()es para una consulta de selección, para insertar y actualizar, no necesita recuperar el conjunto de resultados (y no hay ningún conjunto de resultados que le permita recuperar).
xdazz
79

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

$thises 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();

    Cómo solucionarlo: revise su código nuevamente,$this solo se puede usar en un 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. Use self::$static_propertypara 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 se mantiene la $thisvariable especial.
    Cómo solucionarlo: revise el código y reemplácelo$this con una variable de sustitución diferente.

Preguntas relacionadas:

  1. Llame al método no estático como estático: PHP Error grave: uso de $ this cuando no está en el contexto del objeto
  2. Copia sobre el código: Error grave: usar $ this cuando no está en el contexto del objeto
  3. Todas las preguntas "Uso de $ this cuando no está en el contexto del objeto" en Stackoverflow
xdazz
fuente
2
También es posible que desee mencionar cómo funciona esto con cierres (incluso en métodos no estáticos) y cómo se "soluciona" en 5.4.
Kendall Hopkins
2
@hakre Estaba hablando de una llamada estática dentro de un Cierre. Al igual $closure = function() { self::method(); }.
Kendall Hopkins
2
@KendallHopkins: Ese es un error diferente: "Error fatal: no se puede acceder a self :: cuando no hay ningún ámbito de clase activo" Sin embargo, con $thisusted puede activar el "error fatal a medida": usar $ this cuando no está en el contexto del objeto " :$closure = function() { $this->method(); };
hakre
75

Error fatal: llamada a la función indefinida 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 una 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 se declarará porque $someConditionno es cierto.

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

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

En este caso, fnsolo se declarará una vez que createFn()se llame. Tenga en cuenta que las llamadas posteriores a createFn()activarán un error sobre la Redeclaración de una función existente.

También puede ver esto para una función integrada de PHP. Intente buscar la función en el manual oficial y verifique a qué "extensión" (módulo PHP) pertenece y qué versiones de PHP lo admiten.

En caso de que falte una extensión, instálela y actívela 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 utilizando su administrador de paquetes (por ejemplo, apten Debian o Ubuntu, yumen 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 de lo que está utilizando, puede encontrar enlaces a implementaciones alternativas en el manual o en su sección de comentarios. Si se ha eliminado de PHP, busque información sobre por qué, ya que puede que ya no sea necesario.

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

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

Preguntas relacionadas:

Gordon
fuente
73

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

Sucede cuando tienes T_XXXtoken en un lugar inesperado, paréntesis desequilibrados (superfluos), uso de etiqueta corta sin activarlo en php.ini y muchos más.

Preguntas relacionadas:

Para más ayuda ver:

LeleDumbo
fuente
70

Error grave: 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 se debe a que emptyes una construcción de lenguaje y no una función, no se puede invocar con una expresión como argumento en las versiones de PHP anteriores a 5.5. Antes de PHP 5.5, el argumento empty()debe ser una variable , pero una expresión arbitraria (como el valor de retorno de una función) está permitida en PHP 5.5+.

empty, a pesar de su nombre, en realidad no comprueba si una variable está "vacía". En cambio, verifica si una variable no existe, o == false. Las expresiones (como is_null(null)en el ejemplo) siempre se considerarán existentes, por lo que aquí emptysolo se comprueba si es igual a falso. Puede reemplazar empty()aquí con !, por ejemplo if (!is_null(null)), o comparar explícitamente con falso, por ejemplo if (is_null(null) == false).

Preguntas relacionadas:

xdazz
fuente
64

MySQL: tiene un error en su sintaxis SQL; consulte el manual que corresponde a la versión de su servidor MySQL para obtener la sintaxis correcta para usar cerca de ... en la línea ...

Este error a menudo se debe a que olvidó escapar correctamente de los datos pasados ​​a una consulta MySQL.

Un ejemplo de lo que no se debe hacer (la "mala idea"):

$query = "UPDATE `posts` SET my_text='{$_POST['text']}' WHERE id={$_GET['id']}";
mysqli_query($db, $query);

Este código podría incluirse en una página con un formulario para enviar, con una URL como http://example.com/edit.php?id=10 (para editar la publicación n ° 10)

¿Qué sucederá si el texto enviado contiene comillas simples? $queryterminará con:

$query = "UPDATE `posts` SET my_text='I'm a PHP newbie' WHERE id=10';

Y cuando esta consulta se envía a MySQL, se quejará de que la sintaxis es incorrecta, porque hay una comilla simple adicional en el medio.

Para evitar tales errores, DEBE escapar siempre de los datos antes de usarlos en una consulta.

Escapar de datos antes de usarlo en una consulta SQL también es muy importante porque si no lo hace, su script estará abierto a inyecciones SQL. Una inyección SQL puede causar alteración, pérdida o modificación de un registro, una tabla o una base de datos completa. ¡Este es un problema de seguridad muy serio!

Documentación:

Jocelyn
fuente
3
Además, si no lo hace, su sitio será pirateado automáticamente por bots
apscience
2
@gladoscc Haga clic en "editar" y modifique la respuesta. Soy consciente de que se puede mejorar.
Jocelyn
2
O use una consulta SQL preparada.
Matej
53

Error grave: se agotó el tamaño de memoria permitido de XXX bytes (se intentó asignar XXX bytes)

No hay suficiente memoria para ejecutar su script. PHP ha alcanzado el límite de memoria y deja de ejecutarlo. Este error es fatal, el script se detiene. El valor del límite de memoria se puede configurar en el php.iniarchivo o mediante ini_set('memory_limit', '128 M');el script (que sobrescribirá el valor definido en php.ini). El propósito del límite de memoria es evitar que un solo script PHP engulle toda la memoria disponible y derribe todo el servidor web.

Lo primero que debe hacer es minimizar la cantidad de memoria que necesita su script. Por ejemplo, si está leyendo un archivo grande en una variable o está recuperando muchos registros de una base de datos y los está almacenando todos en una matriz, eso puede usar mucha memoria. Cambie su código para leer el archivo línea por línea o busque los registros de la base de datos de uno en uno sin almacenarlos todos en la memoria. Esto requiere un poco de conciencia conceptual de lo que está sucediendo detrás de escena y cuándo los datos se almacenan en la memoria en comparación con otros lugares.

Si este error ocurrió cuando su script no estaba haciendo un trabajo intensivo en memoria, debe verificar su código para ver si hay una pérdida de memoria. La memory_get_usagefunción es tu amiga.

Preguntas relacionadas:

xdazz
fuente
53

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

Este error se encuentra con mayor frecuencia cuando se intenta hacer referencia a un valor de matriz con una clave entrecomillada para la interpolación dentro de una cadena entre comillas dobles cuando no se incluye toda la construcción de la variable compleja {}.

El caso de error:

Esto resultará en Unexpected T_ENCAPSED_AND_WHITESPACE:

echo "This is a double-quoted string with a quoted array key in $array['key']";
//---------------------------------------------------------------------^^^^^

Posibles soluciones:

En una cadena con comillas dobles, PHP permitirá que las cadenas de teclas de matriz se usen sin comillas , y no emitirá un E_NOTICE. Entonces, lo anterior podría escribirse como:

echo "This is a double-quoted string with an un-quoted array key in $array[key]";
//------------------------------------------------------------------------^^^^^

La variable de matriz compleja completa y la (s) clave (s) se pueden incluir {}, en cuyo caso se deben citar para evitar un E_NOTICE. La documentación de PHP recomienda esta sintaxis para variables complejas.

echo "This is a double-quoted string with a quoted array key in {$array['key']}";
//--------------------------------------------------------------^^^^^^^^^^^^^^^
// Or a complex array property of an object:
echo "This is a a double-quoted string with a complex {$object->property->array['key']}";

Por supuesto, la alternativa a cualquiera de los anteriores es concatenar la variable de matriz en lugar de interpolarla:

echo "This is a double-quoted string with an array variable". $array['key'] . " concatenated inside.";
//----------------------------------------------------------^^^^^^^^^^^^^^^^^^^^^

Para referencia, consulte la sección sobre Análisis de variables en la página del manual de cadenas PHP

Michael Berkowski
fuente
45

Advertencia: [función] : no se pudo abrir la transmisión: [razón]

Ocurre cuando se llama a un archivo por lo general include, requireo fopenPHP y no se pudo encontrar el archivo o que no basta tener el permiso para cargar el archivo.

Esto puede suceder por varias razones:

  • la ruta del archivo es incorrecta
  • la ruta del archivo es relativa
  • incluir ruta está mal
  • los permisos son demasiado restrictivos
  • SELinux está en vigor
  • y muchos más ...

Un error común es no usar una ruta absoluta. Esto se puede resolver fácilmente utilizando una ruta completa o constantes mágicas como __DIR__o dirname(__FILE__):

include __DIR__ . '/inc/globals.inc.php';

o:

require dirname(__FILE__) . '/inc/globals.inc.php';

Asegurarse de que se utilice la ruta correcta es un paso para solucionar estos problemas, esto también puede estar relacionado con archivos no existentes, derechos del sistema de archivos que impiden el acceso o restricciones basadas en PHP por el propio PHP.

La mejor manera de resolver este problema rápidamente es seguir la lista de verificación de solución de problemas a continuación.

Preguntas relacionadas:

Errores relacionados:

Mahdi
fuente
44

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

El operador de resolución de alcance también se llama "Paamayim Nekudotayim" del hebreo פעמיים נקודתיים. que significa "doble colon".

Este error generalmente ocurre si accidentalmente ingresas ::tu código.

Preguntas relacionadas:

Documentación:

Rich Bradshaw
fuente
La forma más fácil de activar este error es ejecutar a()::b;o $a=::;.
Ismael Miguel
43

Aviso: uso de la constante indefinida XXX - se supone 'XXX'

o, en PHP 7.2 o posterior:

Advertencia: Uso de la constante indefinida XXX: se supone 'XXX' (esto arrojará un error en una versión futura de PHP)

Este aviso ocurre cuando se usa un token en el código y parece ser una constante, pero una constante con ese nombre no está definida.

Una de las causas más comunes de este aviso es una falla al citar una cadena utilizada como una clave de matriz asociativa.

Por ejemplo:

// Wrong
echo $array[key];

// Right
echo $array['key'];

Otra causa común es la falta de un $signo (dólar) delante de un nombre de variable:

// Wrong
echo varName;

// Right
echo $varName;

O tal vez ha escrito mal alguna otra constante o palabra clave:

// Wrong
$foo = fasle;

// Right
$foo = false;

También puede ser una señal de que falta una extensión o biblioteca PHP necesaria cuando intenta acceder a una constante definida por esa biblioteca.

Preguntas relacionadas:

DaveRandom
fuente
2
Yo diría que la causa más común es olvidar $ delante de una variable, no matrices.
Overv
42

Error grave: no se puede volver a declarar la clase [nombre de clase]

Error grave: no se puede volver a declarar [nombre de la función]

Esto significa que está usando la misma función / nombre de clase dos veces y necesita cambiar el nombre de uno de ellos, o es porque lo ha usado requireo includedónde debería estar usando require_onceo include_once.

Cuando una clase o una función se declara en PHP, es inmutable y no se puede declarar más tarde con un nuevo valor.

Considere el siguiente código:

class.php

<?php

class MyClass
{
    public function doSomething()
    {
        // do stuff here
    }
}

index.php

<?php

function do_stuff()
{
   require 'class.php';
   $obj = new MyClass;
   $obj->doSomething();
}

do_stuff();
do_stuff();

La segunda llamada a do_stuff()producirá el error anterior. Al cambiar requirea require_once, podemos estar seguros de que el archivo que contiene la definición de MyClasssolo se cargará una vez y se evitará el error.

DaveRandom
fuente
3
Vale la pena mencionar el uso de carga automática, y los estándares como PSR-4 o incluso el ahora obsoleto PSR-0 prácticamente lo eliminan al evitar que necesites usar require / include (excluye algunos casos extraños).
DanielM
39

Aviso: variable indefinida

Ocurre cuando intentas usar una variable que no estaba definida previamente.

Un ejemplo típico sería

foreach ($items as $item) {
    // do something with item
    $counter++;
}

Si no definió $counterantes, el código anterior activará el aviso.

La forma correcta sería establecer la variable antes de usarla, incluso si es solo una cadena vacía como

$counter = 0;
foreach ($items as $item) {
    // do something with item
    $counter++;
}

Aviso: propiedad indefinida

Este error significa lo mismo, pero se refiere a una propiedad de un objeto. Reutilizando el ejemplo anterior, este código activaría el error porque la counterpropiedad no se ha establecido.

$obj = new stdclass;
$obj->property = 2342;
foreach ($items as $item) {
    // do something with item
    $obj->counter++;
}

Preguntas relacionadas:

aleación
fuente
35

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

Escenario posible

Parece que no puedo encontrar dónde ha fallado mi código. Aquí está mi error completo:

Error de análisis: error de sintaxis, T_VARIABLE inesperado en la línea x

Lo que estoy intentando

$sql = 'SELECT * FROM dealer WHERE id="'$id.'"';

Responder

Error de análisis: un problema con la sintaxis de su programa, como dejar un punto y coma fuera del final de una declaración o, como en el caso anterior, perder el .operador. El intérprete deja de ejecutar su programa cuando encuentra un error de análisis.

En palabras simples, este es un error de sintaxis, lo que significa que hay algo en su código que impide que se analice correctamente y, por lo tanto, se ejecute.

Lo que debe hacer es verificar cuidadosamente en las líneas alrededor del lugar donde se encuentra el error cualquier error simple.

Ese mensaje de error significa que en la línea x del archivo, el intérprete de PHP esperaba ver un paréntesis abierto, pero en su lugar, encontró algo llamado T_VARIABLE. Esa T_VARIABLEcosa se llama a token. Es la forma en que el intérprete PHP expresa diferentes partes fundamentales de los programas. Cuando el intérprete lee en un programa, traduce lo que ha escrito en una lista de tokens. Dondequiera que coloque una variable en su programa, hay un T_VARIABLEtoken en la lista del intérprete.

Buena lectura: Lista de tokens de analizador

Así que asegúrese de habilitar al menos E_PARSEen su php.ini. Los errores de análisis no deberían existir en los scripts de producción.

Siempre recomendé agregar la siguiente declaración, mientras codificaba:

error_reporting(E_ALL);

Informe de errores de PHP

Además, es una buena idea usar un IDE que le permitirá conocer los errores de análisis mientras escribe. Puedes usar:

  1. NetBeans (una bella pieza de belleza, software libre) (lo mejor en mi opinión)
  2. PhpStorm (tío Gordon ama esto: P, plan pagado, contiene software patentado y gratuito)
  3. Eclipse (la bella y la bestia, software libre)

Preguntas relacionadas:

NullPoiиteя
fuente
34

Aviso: desplazamiento de cadena sin inicializar: *

Como su nombre lo indica, este tipo de error ocurre cuando lo más probable es que intente iterar o encontrar un valor de una matriz con una clave no existente.

Te considero, estás tratando de mostrar cada carta de $string

$string = 'ABCD'; 
for ($i=0, $len = strlen($string); $i <= $len; $i++){
    echo "$string[$i] \n"; 
}

El ejemplo anterior generará ( demostración en línea ):

A
B
C
D
Notice: Uninitialized string offset: 4 in XXX on line X

Y, tan pronto como el script termine de Dhacerse eco , obtendrá el error, porque dentro del for()bucle, le ha dicho a PHP que le muestre el carácter de la primera a la quinta cadena 'ABCD', que existe, pero desde que el bucle comienza a contar 0y hace eco Dpara cuando llegue 4, arrojará un error de compensación.

Errores similares:

samayo
fuente
32

Aviso: Intentando obtener la propiedad del error no objeto

Ocurre cuando intentas acceder a una propiedad de un objeto mientras no hay ningún objeto.

Un ejemplo típico para un aviso sin objeto sería

$users = json_decode('[{"name": "hakre"}]');
echo $users->name; # Notice: Trying to get property of non-object

En este caso, $userses una matriz (por lo que no es un objeto) y no tiene ninguna propiedad.

Esto es similar a acceder a un índice o clave no existente de una matriz (ver Aviso: Índice indefinido ).

Este ejemplo está mucho más simplificado. La mayoría de las veces, un aviso de este tipo indica un valor de retorno no verificado, por ejemplo, cuando una biblioteca regresa NULLsi un objeto no existe o simplemente un valor inesperado que no es un objeto (por ejemplo, en un resultado Xpath, estructuras JSON con formato inesperado, XML con formato inesperado, etc.) pero el código no verifica tal condición.

Como esos no objetos a menudo se procesan más adelante, a menudo ocurre un error fatal después de llamar a un método de objeto en un no objeto (ver: Error fatal: Llamar a una función miembro ... en un no objeto ) deteniendo el guión.

Se puede evitar fácilmente comprobando las condiciones de error y / o que una variable coincida con una expectativa. Aquí un aviso con un ejemplo de DOMXPath :

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$divText = $result->item(0)->nodeValue; # Notice: Trying to get property of non-object

El problema es acceder a la nodeValuepropiedad (campo) del primer elemento mientras no se ha verificado si existe o no en la $resultcolección. En cambio, vale la pena hacer que el código sea más explícito asignando variables a los objetos en los que opera el código:

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$div     = $result->item(0);
$divText = "-/-";
if (is_object($div)) {
    $divText = $div->nodeValue;
}
echo $divText;

Errores relacionados:

hakre
fuente
1
json_decodeAhora devuelve una instancia de stdclassforma predeterminada, por lo que el código de ejemplo sería en realidad el trabajo.
Hugo Zink
@HugoZink: Realmente (y siempre lo hizo) devuelve una matriz para ese ejemplo: 3v4l.org/SUDe0 - ¿También puede proporcionar una referencia para su escritura que " json_decodeahora devuelve una instancia de stdclassforma predeterminada" ? No puedo encontrar eso en el registro de cambios.
Hakre
De acuerdo con la página del manual de PHP en json_decode , por defecto, el assocparámetro se establece en falso. Este parámetro decide si la función devuelve una stdclassmatriz asociativa en lugar de una matriz asociativa.
Hugo Zink
json_decode('[{"name": "hakre"}]', true)devolverá una matriz, de lo contrario un stdclassobjeto
zanderwar
29

Advertencia: restricción de open_basedir vigente

Esta advertencia puede aparecer con varias funciones relacionadas con el acceso a archivos y directorios. Advierte sobre un problema de configuración.

Cuando aparece, significa que se ha prohibido el acceso a algunos archivos.

La advertencia en sí no rompe nada, pero la mayoría de las veces un script no funciona correctamente si se impide el acceso a los archivos.

La solución normalmente es cambiar la configuración de PHP , se llama a la configuración relacionada open_basedir.

A veces se usan los nombres de archivo o directorio incorrectos, la solución es usar los correctos.

Preguntas relacionadas:

revs hakre
fuente
1
Esto ocurre con mayor frecuencia en un host compartido, las personas generalmente no se bloquean de los directorios :-)
uınbɐɥs
28

Error de análisis: error de sintaxis, inesperado '['

Este error viene en dos variantes:

Variación 1

$arr = [1, 2, 3];

Esta sintaxis de inicializador de matriz solo se introdujo en PHP 5.4; generará un error de analizador en las versiones anteriores. Si es posible, actualice su instalación o use la sintaxis anterior:

$arr = array(1, 2, 3);

Vea también este ejemplo del manual.

Variante 2

$suffix = explode(',', 'foo,bar')[1];

Los resultados de la función de eliminación de referencias de matriz también se introdujeron en PHP 5.4. Si no es posible actualizar, debe usar una variable (temporal):

$parts = explode(',', 'foo,bar');
$suffix = $parts[1];

Vea también este ejemplo del manual.

Ja͢ck
fuente
23

Advertencia: [función] espera que el parámetro 1 sea recurso, dado booleano

(Una variación más general de Advertencia: mysql_fetch_array () espera que el parámetro 1 sea recurso, dado booleano )

Los recursos son un tipo en PHP (como cadenas, enteros u objetos). Un recurso es una gota opaca sin un valor propio inherentemente significativo. Un recurso es específico y está definido por un determinado conjunto de funciones o extensiones de PHP. Por ejemplo, la extensión Mysql define dos tipos de recursos :

Hay dos tipos de recursos utilizados en el módulo MySQL. El primero es el identificador de enlace para una conexión de base de datos, el segundo un recurso que contiene el resultado de una consulta.

La extensión cURL define otros dos tipos de recursos :

... un mango cURL y un mango múltiple cURL.

Cuando var_dumped, los valores se ven así:

$resource = curl_init();
var_dump($resource);

resource(1) of type (curl)

Eso es todo lo que la mayoría de los recursos son, un identificador numérico ( (1)) de cierto tipo ( (curl)).

Usted transporta estos recursos y los pasa a diferentes funciones para las cuales dicho recurso significa algo. Normalmente, estas funciones asignan ciertos datos en segundo plano y un recurso es solo una referencia que utilizan para realizar un seguimiento interno de estos datos.


El error " ... espera que el parámetro 1 sea un recurso, un valor booleano dado " suele ser el resultado de una operación no verificada que se suponía que creaba un recurso, pero en su falselugar se devolvió . Por ejemplo, la fopenfunción tiene esta descripción:

Valores de retorno

Devuelve un recurso de puntero de archivo en caso de éxito o FALSEerror.

Entonces, en este código, $fpserá un resource(x) of type (stream)o false:

$fp = fopen(...);

Si no verifica si la fopenoperación tuvo éxito o falló y, por lo tanto, si $fpes un recurso válido o falsepasa $fpa otra función que espera un recurso, puede obtener el error anterior:

$fp   = fopen(...);
$data = fread($fp, 1024);

Warning: fread() expects parameter 1 to be resource, boolean given

Siempre debe verificar por error el valor de retorno de las funciones que intentan asignar un recurso y pueden fallar :

$fp = fopen(...);

if (!$fp) {
    trigger_error('Failed to allocate resource');
    exit;
}

$data = fread($fp, 1024);

Errores relacionados:

decepción
fuente
22

Advertencia: desplazamiento de cadena ilegal 'XXX'

Esto sucede cuando intenta acceder a un elemento de matriz con la sintaxis de corchetes, pero lo hace en una cadena y no en una matriz, por lo que la operación claramente no tiene sentido .

Ejemplo:

$var = "test";
echo $var["a_key"];

Si cree que la variable debería ser una matriz, vea de dónde proviene y solucione el problema allí.

Karoly Horvath
fuente
20

El código no se ejecuta / lo que parece que se generan partes de mi código PHP

Si no ve ningún resultado de su código PHP y / o está viendo partes de su salida literal de código fuente PHP en la página web, puede estar bastante seguro de que su PHP no se está ejecutando realmente. Si usa Ver código fuente en su navegador, probablemente esté viendo todo el archivo de código fuente PHP tal como está. Como el código PHP está incrustado en las <?php ?>etiquetas, el navegador intentará interpretarlas como etiquetas HTML y el resultado puede parecer algo confuso.

Para ejecutar realmente sus scripts PHP, necesita:

  • un servidor web que ejecuta tu script
  • configurar la extensión del archivo a .php, de lo contrario el servidor web no lo interpretará como tal *
  • acceder a su archivo .php a través del servidor web

* A menos que lo reconfigure, todo se puede configurar.

Este último es particularmente importante. Simplemente haciendo doble clic en el archivo probablemente lo abrirá en su navegador usando una dirección como:

file://C:/path/to/my/file.php

Esto omite por completo cualquier servidor web que pueda estar ejecutando y el archivo no se está interpretando. Debe visitar la URL del archivo en su servidor web, probablemente algo así como:

http://localhost/my/file.php

También es posible que desee verificar si está utilizando etiquetas abiertas cortas en <?lugar de <?phpy si su configuración de PHP ha desactivado las etiquetas abiertas cortas.

También vea que el código PHP no se está ejecutando, en su lugar, el código se muestra en la página

decepción
fuente
18

Advertencia: mysql_connect (): acceso denegado para el usuario 'nombre' @ 'host'

Esta advertencia aparece cuando se conecta a un servidor MySQL / MariaDB con credenciales no válidas o faltantes (nombre de usuario / contraseña). Por lo general, esto no es un problema de código, sino un problema de configuración del servidor.

  • Consulte la página del manual mysql_connect("localhost", "user", "pw")para ver ejemplos.

  • Comprueba que realmente utilizaste una $usernamey $password.

    • Es raro que obtenga acceso sin contraseña, que es lo que sucedió cuando la Advertencia: dijo (using password: NO).
    • Solo el servidor de prueba local generalmente permite conectarse con nombre de usuario root, sin contraseña y el testnombre de la base de datos.

    • Puede probar si son realmente correctos utilizando el cliente de línea de comando:
      mysql --user="username" --password="password" testdb

    • El nombre de usuario y la contraseña distinguen entre mayúsculas y minúsculas y no se ignora el espacio en blanco . Si su contraseña contiene metacaracteres como $, escape, o ponga la contraseña entre comillas simples .

    • La mayoría de los proveedores de alojamiento compartido predeclaran cuentas mysql en relación con la cuenta de usuario de unix (a veces solo prefijos o sufijos numéricos adicionales). Consulte los documentos para obtener un patrón o documentación, y CPanel o cualquier interfaz para configurar una contraseña.

    • Consulte el manual de MySQL sobre Agregar cuentas de usuario usando la línea de comandos. Cuando está conectado como usuario administrador , puede emitir una consulta como:
      CREATE USER 'username'@'localhost' IDENTIFIED BY 'newpassword';

    • O use Adminer o WorkBench o cualquier otra herramienta gráfica para crear, verificar o corregir detalles de la cuenta.

    • Si no puede corregir sus credenciales, pedirle a Internet que "ayude" no tendrá ningún efecto. Solo usted y su proveedor de alojamiento tienen permisos y acceso suficiente para diagnosticar y solucionar problemas.

  • Verifique que pueda llegar al servidor de la base de datos, utilizando el nombre de host proporcionado por su proveedor:
    ping dbserver.hoster.example.net

    • Verifique esto desde una consola SSH directamente en su servidor web. Las pruebas desde su cliente de desarrollo local a su servidor de alojamiento compartido rara vez tienen sentido.

    • A menudo solo desea que sea el nombre del servidor "localhost", que normalmente utiliza un socket con nombre local cuando está disponible. A veces puedes intentarlo "127.0.0.1"como alternativa.

    • Si su servidor MySQL / MariaDB escucha en un puerto diferente, úselo "servername:3306".

    • Si eso falla, entonces quizás haya un problema con el firewall. (Fuera de tema, no es una pregunta de programación. No es posible adivinar de forma remota).

  • Cuando use constantes como, por ejemplo , DB_USERo DB_PASSWORD, verifique que estén realmente definidos .

    • Si obtienes a "Warning: Access defined for 'DB_USER'@'host'"y a "Notice: use of undefined constant 'DB_PASS'", entonces ese es tu problema.

    • Verifique que su eg xy/db-config.phpfue realmente incluido y whatelse.

  • Verifique los GRANTpermisos establecidos correctamente .

    • No es suficiente tener un par username+ password.

    • Cada cuenta MySQL / MariaDB puede tener un conjunto adjunto de permisos.

    • Estos pueden restringir a qué bases de datos puede conectarse, desde qué cliente / servidor puede originarse la conexión y qué consultas están permitidas.

    • La advertencia de "Acceso denegado" también puede aparecer para mysql_queryllamadas, si no tiene permisos SELECTde una tabla específica, o INSERT/ UPDATE, y más comúnmente DELETEcualquier cosa.

    • Puede adaptar los permisos de la cuenta cuando está conectado por cliente de línea de comandos utilizando la cuenta de administrador con una consulta como:
      GRANT ALL ON yourdb.* TO 'username'@'localhost';

  • Si la advertencia aparece primero con Warning: mysql_query(): Access denied for user ''@'localhost', es posible que tenga un par de contraseña / cuenta preconfigurada php.ini .

    • Verifique eso mysql.default_user=y mysql.default_password=tenga valores significativos.

    • A menudo se trata de una configuración de proveedor. Por lo tanto, póngase en contacto con su servicio de asistencia para detectar desajustes.

  • Encuentre la documentación de su proveedor de alojamiento compartido:

  • Tenga en cuenta que también puede haber agotado el grupo de conexiones disponible . Obtendrá advertencias de acceso denegado para demasiadas conexiones concurrentes. (Debe investigar la configuración. Es un problema de configuración del servidor fuera de tema, no una pregunta de programación).

  • La versión de su cliente libmysql puede no ser compatible con el servidor de la base de datos. Normalmente se puede acceder a los servidores MySQL y MariaDB con PHP compilados en el controlador. Si tiene una configuración personalizada, o una versión de PHP desactualizada, y un servidor de base de datos mucho más nuevo, o uno significativamente desactualizado, entonces la falta de coincidencia de la versión puede evitar conexiones. (No, tienes que investigar tú mismo. Nadie puede adivinar tu configuración).

Más referencias:

Por cierto, probablemente ya no quieras usar mysql_*funciones . Los recién llegados a menudo migran a mysqli , que sin embargo es igual de tedioso. En su lugar, lea sobre DOP y declaraciones preparadas .
$db = new PDO("mysql:host=localhost;dbname=testdb", "username", "password");

mario
fuente
2
mysql permite la conexión automática a través de la configuración php-ini, luego aparece el mismo mensaje de error con el comando diferente prefijado, por ejemplo, "Advertencia: mysql_query (): Acceso denegado para el usuario '' @ 'localhost' (usando la contraseña: NO) en. .. " - solo notando.
Hakre
¡Ja, se olvidó por completo de eso! (Probablemente lo usó por última vez con PHP3 más o menos ...)
Mario
18

Aviso: conversión de matriz a cadena

Esto simplemente sucede si intenta tratar una matriz como una cadena:

$arr = array('foo', 'bar');

echo $arr;  // Notice: Array to string conversion
$str = 'Something, ' . $arr;  // Notice: Array to string conversion

Una matriz no puede simplemente echo'd o concatenarse con una cadena, porque el resultado no está bien definido. PHP usará la cadena "Array" en lugar de la matriz, y activará el aviso para señalar que probablemente no sea lo que se pretendía y que debería verificar su código aquí. Probablemente quieras algo como esto en su lugar:

echo $arr[0];  // displays foo
$str = 'Something ' . join(', ', $arr); //displays Something, foo, bar

O repita la matriz:

foreach($arr as $key => $value) {
    echo "array $key = $value";
    // displays first: array 0 = foo
    // displays next:  array 1 = bar
}

Si este aviso aparece en algún lugar que no espera, significa que una variable que pensó que es una cadena es en realidad una matriz. Eso significa que tiene un error en su código que hace que esta variable sea una matriz en lugar de la cadena que espera.

decepción
fuente
12

Advertencia: división por cero

El mensaje de advertencia 'División por cero' es una de las preguntas más frecuentes entre los nuevos desarrolladores de PHP. Este error no causará una excepción, por lo tanto, algunos desarrolladores ocasionalmente suprimirán la advertencia agregando el operador de supresión de error @ antes de la expresión. Por ejemplo:

$value = @(2 / 0);

Pero, como con cualquier advertencia, el mejor enfoque sería rastrear la causa de la advertencia y resolverla. La causa de la advertencia vendrá de cualquier instancia en la que intente dividir por 0, una variable igual a 0 o una variable que no se haya asignado (porque NULL == 0) porque el resultado será 'indefinido'.

Para corregir esta advertencia, debe reescribir su expresión para verificar que el valor no sea 0, si es así, haga otra cosa. Si el valor es cero, no debe dividir, o debe cambiar el valor a 1 y luego dividir para que la división resulte en el equivalente de haber dividido solo por la variable adicional.

if ( $var1 == 0 ) { // check if var1 equals zero
    $var1 = 1; // var1 equaled zero so change var1 to equal one instead
    $var3 = ($var2 / $var1); // divide var1/var2 ie. 1/1
} else {
    $var3 = ($var2 / $var1); // if var1 does not equal zero, divide
}

Preguntas relacionadas:

davidcondrey
fuente
Establecer en 1 si era 0 detendrá el error, pero ¿es esto realmente mejor que la supresión que dijo que no debería usarse (con lo que estoy de acuerdo)? Sugeriría la mayoría de las veces que es probable que se devuelva algún otro mensaje o valor.
James
Para este ejemplo, si lo $var1hace == 0, puede configurarlo $var3en $var2. Incluso si no está haciendo eso, no se necesita nada más, ya que la asignación es la misma en ambos casos, por lo que no se necesita más y se asigna fuera delif
James
8

Normas estrictas: el método no estático [<clase> :: <método>] no debe llamarse estáticamente

Se produce cuando intenta llamar a un método no estático en una clase, ya que era estático, y también tiene el E_STRICTindicador en su error_reporting()configuración.

Ejemplo:

class HTML {
   public function br() {
      echo '<br>';
   }
}

HTML::br() o $html::br()

En realidad se puede evitar este error al no añadir E_STRICTa error_reporting(), por ejemplo,

error_reporting(E_ALL & ~E_STRICT);

ya que para PHP 5.4.0 y superior, E_STRICT se incluye en E_ALL[ ref ]. Pero eso no es aconsejable. La solución es definir su función estática prevista como real static:

public static function br() {
  echo '<br>';
}

o llame a la función convencionalmente:

$html = new HTML();
$html->br();

Preguntas relacionadas :

davidkonrad
fuente
7

En desuso: la sintaxis de acceso de matriz y desplazamiento de cadena con llaves está en desuso

Se puede acceder a las compensaciones de cadena y los elementos de matriz mediante llaves {}antes de PHP 7.4.0:

$string = 'abc';
echo $string{0};  // a

$array = [1, 2, 3];
echo $array{0};  // 1

Esto ha quedado en desuso desde PHP 7.4.0 y genera una advertencia:

En desuso: la sintaxis de acceso de matriz y desplazamiento de cadena con llaves está en desuso

Debe usar corchetes []para acceder a las compensaciones de cadena y los elementos de la matriz:

$string = 'abc';
echo $string[0];  // a

$array = [1, 2, 3];
echo $array[0];  // 1

El RFC para este cambio se vincula a un script PHP que intenta arreglar esto mecánicamente.

AbraCadaver
fuente