¿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
- No se ve nada La página está vacía y blanca. (también conocido como White Page / Screen Of Death )
- El código no se ejecuta / lo que parece que se generan partes de mi código PHP
- Advertencia: no se puede modificar la información del encabezado: los encabezados ya se enviaron
- Advertencia: mysql_fetch_array () espera que el parámetro 1 sea un recurso, booleano dado aka
Advertencia: mysql_fetch_array (): el argumento suministrado no es un recurso de resultado MySQL válido aka
Advertencia: mysqli_num_rows () espera que el parámetro 1 sea mysqli_result, boolean dado (o variaciones similares) - Advertencia: [función] espera que el parámetro 1 sea recurso, dado booleano
- Advertencia: [función] : no se pudo abrir la transmisión: [razón]
- Advertencia: restricción de open_basedir vigente
- Advertencia: división por cero
- Advertencia: desplazamiento de cadena ilegal 'XXX'
- Advertencia: count (): el parámetro debe ser una matriz o un objeto que implemente Contable
- Error de análisis: error de sintaxis, inesperado '['
- Error de análisis: error de sintaxis, T_XXX inesperado
- Error de análisis: error de sintaxis, T_ENCAPSED_AND_WHITESPACE inesperado
- Error de análisis: error de sintaxis, inesperado T_PAAMAYIM_NEKUDOTAYIM
- Error de análisis: error de sintaxis, inesperado 'require_once' (T_REQUIRE_ONCE), función esperada (T_FUNCTION)
- Error de análisis: error de sintaxis, T_VARIABLE inesperado
- Error grave: se agotó el tamaño de memoria permitido de XXX bytes (se intentó asignar XXX bytes)
- Error fatal: llamada a una función miembro ... en un objeto no nulo o nulo
- Error grave: llamada a la función indefinida XXX
- Error grave: no se puede volver a declarar XXX
- Error grave: no se puede usar el valor de retorno de la función en el contexto de escritura
- Error fatal: la declaración de AAA :: BBB () debe ser compatible con la de CCC :: BBB () '
- Error fatal: usar $ this cuando no está en el contexto del objeto
- Error grave: el objeto de la clase de cierre no se pudo convertir a cadena
- Error fatal: constante de clase indefinida
- Aviso: conversión de matriz a cadena
- Aviso: Intentando obtener la propiedad del error no objeto
- Aviso: variable o propiedad indefinida
- Aviso: Índice indefinido
- Aviso: Desplazamiento indefinido XXX [Referencia]
- Aviso: desplazamiento de cadena sin inicializar: XXX
- Aviso: uso de la constante indefinida XXX - se supone 'XXX'
- 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 ...
- Normas estrictas: el método no estático [<clase> :: <método>] no debe llamarse estáticamente
- Advertencia: la función espera que el parámetro X sea booleano / cadena / entero
- HTTP Error 500 - Error interno del servidor
- En desuso: la sintaxis de acceso de matriz y desplazamiento de cadena con llaves está en desuso
Ver también:
Respuestas:
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:
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 moverlosession_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 encabezadoSi 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:
fuente
<?php ?>
y entonces sería "más de un bloque"<?php ?> <?php ?>
?Error fatal: llamada a una función miembro ... en un objeto no
Sucede con un código similar a
xyz->method()
dondexyz
no es un objeto y, por lo tantomethod
, 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
En el ejemplo anterior, la consulta no se puede preparar y
prepare()
se asignaráfalse
a$statement
. Intentar llamar alexecute()
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
->prepare
está fallando, entonces su$pdo
objeto 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
Al intentar ejecutar el método fuera del bloque condicional, su objeto puede no estar definido.
Preguntas relacionadas:
fuente
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:
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 ladisplay_startup_errors
directivatrue
. Haga esto enphp.ini
o en.htaccess
o 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:
fuente
error_reporting(~0);
¿por qué no-1
? Eso es lo que se~0
evalúa y es mucho menos críptico.~0
es 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 binario1111'1111'1111'1111
(para 32 bits).1111'1111'1111'1111
es realmente 16 bits, pero espero que entiendas lo que quiero decir.E_STRICT
no está incluido enE_ALL
. php.net/manual/en/errorfunc.constants.php y desplácese hacia abajo hastaE_STRICT
.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 Index
aviso sería ( demo )Ambos
spinach
y1
no existen en la matriz, lo que haceE_NOTICE
que 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_exists
oisset
:Si tienes un código como:
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:Preguntas relacionadas:
fuente
if(!empty($_POST['message'])){ //do stuff }
Advertencia: mysql_fetch_array () espera que el parámetro 1 sea recurso, dado booleano
Primero y ante todo:
Esto sucede cuando intenta obtener datos del resultado de
mysql_query
pero 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_query
porPreguntas 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.fuente
mysql_query
no es lo suficientemente malo, agregaror die
encima es agregar insulto a la lesión.$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 demysql_query
quemysql_fetch_array()
los espectáculos de notificación.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?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).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:
Si un método no estático se llama estáticamente. Ejemplo:
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. Useself::$static_property
para acceder a la propiedad estática.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
$this
variable especial.Cómo solucionarlo: revise el código y reemplácelo
$this
con una variable de sustitución diferente.Preguntas relacionadas:
fuente
$closure = function() { self::method(); }
.$this
usted puede activar el "error fatal a medida": usar $ this cuando no está en el contexto del objeto " :$closure = function() { $this->method(); };
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
En este caso,
fn()
nunca se declarará porque$someCondition
no es cierto.Ejemplo 2 - Función en la declaración de función
En este caso,
fn
solo se declarará una vez quecreateFn()
se llame. Tenga en cuenta que las llamadas posteriores acreateFn()
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,
apt
en Debian o Ubuntu,yum
en Red Hat o CentOS), o un panel de control en un entorno de alojamiento compartidoSi 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:
fuente
Error de análisis: error de sintaxis, T_XXX inesperado
Sucede cuando tienes
T_XXX
token 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:
fuente
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:
Esto se debe a que
empty
es 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 argumentoempty()
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 (comois_null(null)
en el ejemplo) siempre se considerarán existentes, por lo que aquíempty
solo se comprueba si es igual a falso. Puede reemplazarempty()
aquí con!
, por ejemploif (!is_null(null))
, o comparar explícitamente con falso, por ejemploif (is_null(null) == false)
.Preguntas relacionadas:
fuente
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"):
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?
$query
terminará con: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:
mysql_real_escape_string()
mysqli_real_escape_string()
fuente
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.ini
archivo o medianteini_set('memory_limit', '128 M');
el script (que sobrescribirá el valor definido enphp.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_usage
función es tu amiga.Preguntas relacionadas:
fuente
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
: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:La variable de matriz compleja completa y la (s) clave (s) se pueden incluir
{}
, en cuyo caso se deben citar para evitar unE_NOTICE
. La documentación de PHP recomienda esta sintaxis para variables complejas.Por supuesto, la alternativa a cualquiera de los anteriores es concatenar la variable de matriz en lugar de interpolarla:
Para referencia, consulte la sección sobre Análisis de variables en la página del manual de cadenas PHP
fuente
Advertencia: [función] : no se pudo abrir la transmisión: [razón]
Ocurre cuando se llama a un archivo por lo general
include
,require
ofopen
PHP y no se pudo encontrar el archivo o que no basta tener el permiso para cargar el archivo.Esto puede suceder por varias razones:
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__
odirname(__FILE__)
:o:
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:
fuente
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:
fuente
a()::b;
o$a=::;
.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:
Otra causa común es la falta de un
$
signo (dólar) delante de un nombre de variable:O tal vez ha escrito mal alguna otra constante o palabra clave:
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:
fuente
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
require
oinclude
dónde debería estar usandorequire_once
oinclude_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
index.php
La segunda llamada a
do_stuff()
producirá el error anterior. Al cambiarrequire
arequire_once
, podemos estar seguros de que el archivo que contiene la definición deMyClass
solo se cargará una vez y se evitará el error.fuente
Aviso: variable indefinida
Ocurre cuando intentas usar una variable que no estaba definida previamente.
Un ejemplo típico sería
Si no definió
$counter
antes, 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
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
counter
propiedad no se ha establecido.Preguntas relacionadas:
fuente
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:
Lo que estoy intentando
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
. EsaT_VARIABLE
cosa se llama atoken
. 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 unT_VARIABLE
token en la lista del intérprete.Buena lectura: Lista de tokens de analizador
Así que asegúrese de habilitar al menos
E_PARSE
en suphp.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:
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:
Preguntas relacionadas:
fuente
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
El ejemplo anterior generará ( demostración en línea ):
Y, tan pronto como el script termine de
D
hacerse eco , obtendrá el error, porque dentro delfor()
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 contar0
y hace ecoD
para cuando llegue4
, arrojará un error de compensación.Errores similares:
fuente
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
En este caso,
$users
es 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
NULL
si 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 :
El problema es acceder a la
nodeValue
propiedad (campo) del primer elemento mientras no se ha verificado si existe o no en la$result
colecció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:Errores relacionados:
fuente
json_decode
Ahora devuelve una instancia destdclass
forma predeterminada, por lo que el código de ejemplo sería en realidad el trabajo.json_decode
ahora devuelve una instancia destdclass
forma predeterminada" ? No puedo encontrar eso en el registro de cambios.assoc
parámetro se establece en falso. Este parámetro decide si la función devuelve unastdclass
matriz asociativa en lugar de una matriz asociativa.json_decode('[{"name": "hakre"}]', true)
devolverá una matriz, de lo contrario unstdclass
objetoAdvertencia: 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:
fuente
Error de análisis: error de sintaxis, inesperado '['
Este error viene en dos variantes:
Variación 1
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:
Vea también este ejemplo del manual.
Variante 2
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):
Vea también este ejemplo del manual.
fuente
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 :
La extensión cURL define otros dos tipos de recursos :
Cuando
var_dump
ed, los valores se ven así: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
false
lugar se devolvió . Por ejemplo, lafopen
función tiene esta descripción:Entonces, en este código,
$fp
será unresource(x) of type (stream)
ofalse
:Si no verifica si la
fopen
operación tuvo éxito o falló y, por lo tanto, si$fp
es un recurso válido ofalse
pasa$fp
a otra función que espera un recurso, puede obtener el error anterior:Siempre debe verificar por error el valor de retorno de las funciones que intentan asignar un recurso y pueden fallar :
Errores relacionados:
fuente
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:
Si cree que la variable debería ser una matriz, vea de dónde proviene y solucione el problema allí.
fuente
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:
* 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:
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:
También es posible que desee verificar si está utilizando etiquetas abiertas cortas en
<?
lugar de<?php
y 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
fuente
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
$username
y$password
.(using password: NO)
.Solo el servidor de prueba local generalmente permite conectarse con nombre de usuario
root
, sin contraseña y eltest
nombre 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_USER
oDB_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.php
fue realmente incluido y whatelse.Verifique los
GRANT
permisos 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_query
llamadas, si no tiene permisosSELECT
de una tabla específica, oINSERT
/UPDATE
, y más comúnmenteDELETE
cualquier 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=
ymysql.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:
por ejemplo , HostGator , GoDaddy , 1 y 1 , DigitalOcean , BlueHost , DreamHost , MediaTemple , ixWebhosting , lunarhosting o simplemente google yours´.
De lo contrario, consulte a su proveedor de alojamiento web a través de sus canales de soporte.
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:
fuente
Aviso: conversión de matriz a cadena
Esto simplemente sucede si intenta tratar una matriz como una cadena:
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:O repita la matriz:
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.
fuente
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:
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.
Preguntas relacionadas:
fuente
$var1
hace == 0, puede configurarlo$var3
en$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
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_STRICT
indicador en suerror_reporting()
configuración.Ejemplo:
HTML::br()
o$html::br()
En realidad se puede evitar este error al no añadir
E_STRICT
aerror_reporting()
, por ejemplo,ya que para PHP 5.4.0 y superior,
E_STRICT
se incluye enE_ALL
[ ref ]. Pero eso no es aconsejable. La solución es definir su función estática prevista como realstatic
:o llame a la función convencionalmente:
Preguntas relacionadas :
fuente
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:Esto ha quedado en desuso desde PHP 7.4.0 y genera una advertencia:
Debe usar corchetes
[]
para acceder a las compensaciones de cadena y los elementos de la matriz:El RFC para este cambio se vincula a un script PHP que intenta arreglar esto mecánicamente.
fuente