php - remove - strip_tags wordpress
Referencia-¿Qué significa este error en PHP? (30)
Advertencia: [función] : no se pudo abrir la transmisión: [motivo]
Ocurre cuando se llama a un archivo por lo general mediante include
, require
o fopen
y PHP no pudo encontrar el archivo o no tiene suficiente permiso para cargarlo.
Esto puede suceder por una variedad de razones:
- la ruta del archivo es incorrecta
- la ruta del archivo es relativa
- incluir camino es incorrecto
- 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 usando 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'';
Asegurar que se use 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 la apertura de 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:
¿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 solucionarlo. Este también es un wiki de la comunidad, por lo que todos están invitados a participar en la adición y el mantenimiento de esta lista.
¿Por qué es esto?
Preguntas frecuentes como "Encabezados ya enviados" o "Llamar a un miembro de un no objeto" aparecen con frecuencia en Desbordamiento de pila. La causa raíz de esas preguntas es siempre la misma. Así que 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 entendiste la causa raíz, arreglar el error es trivial. Por lo tanto, esta lista intenta explicar la solución de manera general para aplicar.
¿Qué debo hacer aquí?
Si su pregunta ha sido marcada como un duplicado de esto, busque el mensaje de error a continuación y aplique la corrección a su código. Las respuestas generalmente contienen más enlaces para investigar en caso de que no quede claro solo con la respuesta general.
Si desea contribuir, agregue su mensaje de error, advertencia o aviso "favorito", 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 enviados
- Advertencia: mysql_fetch_array () espera que el parámetro 1 sea un recurso, booleano dado aka
Advertencia: mysql_fetch_array (): el argumento proporcionado no es un recurso de resultado de MySQL válido, también conocido como
Advertencia: mysqli_num_rows () espera que el parámetro 1 sea mysqli_result, booleano dado (o variaciones similares) - Advertencia: [función] espera que el parámetro 1 sea un recurso, dado booleano
- Advertencia: [función] : no se pudo abrir la transmisión: [motivo]
- Advertencia: restricción open_basedir vigente
- Advertencia: División por cero.
- Advertencia: cadena ilegal desplazada ''XXX''
- 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, T_PAAMAYIM_NEKUDOTAYIM inesperado
- Error de análisis: error de sintaxis, ''require_once'' inesperado (T_REQUIRE_ONCE), función que espera (T_FUNCTION)
- Error de análisis: error de sintaxis, T_VARIABLE inesperado
- Error grave: el tamaño de memoria permitido de XXX bytes se agotó (se intentó asignar XXX bytes)
- Error grave: llamar a una función miembro ... en un no-objeto
- Error fatal: Llamada a la función no definida XXX
- Error fatal: no se puede volver a declarar XXX
- Error grave: no se puede utilizar 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: usando $ esto cuando no está en el contexto del objeto
- Aviso: Conversión de matriz a cadena
- Aviso: Intentando obtener propiedad de error no-objeto
- Aviso: Variable indefinida
- Aviso: Índice no definido
- Aviso: Desplazamiento no definido XXX [Referencia]
- Aviso: Desplazamiento de cadena sin inicializar: XXX
- Aviso: Uso de una constante no definida XXX - asumida ''XXX''
- MySQL: Tiene un error en su sintaxis SQL; consulte el manual que corresponde a la versión de su servidor MySQL para conocer 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
Ver también
Advertencia: mysql_fetch_array () espera que el parámetro 1 sea un recurso, dado booleano
Primero y ante todo:
Por favor, no use las funciones
mysql_*
en el nuevo código . Ya no se mantienen y están oficialmente en desuso . ¿Ves la caja roja ? En su lugar, aprenda sobre declaraciones preparadas y use PDO o MySQLi ; este artículo lo ayudará a decidir cuál. Si elige DOP, aquí hay un buen tutorial .
Esto sucede cuando intenta obtener datos del resultado de mysql_query
pero la consulta falló.
Esto es una advertencia y no detendrá la secuencia de comandos, pero hará que su programa sea incorrecto.
Debe comprobar el resultado devuelto por mysql_query
por
$res = mysql_query($sql);
if (!$res) {
die(mysql_error());
}
// after checking, do the fetch
Preguntas relacionadas:
- mysql_fetch_array () espera que el parámetro 1 sea un recurso, booleano dado en select
- Todo "mysql_fetch_array () espera que el parámetro 1 sea un recurso, booleano dado" Preguntas sobre
Errores relacionados:
Otras funciones mysql*
que también esperan un recurso de resultado de mysql como parámetro producirán el mismo error por la misma razón.
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 hubo salida antes, lo que dio lugar a que los encabezados ya se enviaran al cliente.
Este 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 función session_start()
intentará enviar encabezados con la cookie de sesión al cliente. Pero PHP ya envió encabezados cuando escribió el elemento <html>
en el flujo de salida. Tendrías que mover el session_start()
a la parte superior.
Puede resolver esto pasando por las líneas antes del código que activa la Advertencia y verifique dónde sale. Mueva cualquier encabezado enviando código 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 de ella, lo que hace que el servidor web envíe los encabezados y el espacio en blanco / nueva línea, por lo tanto, cuando PHP comience a analizar, no podrá para enviar cualquier encabezado.
Si su archivo tiene más de un bloque de código <?php ... ?>
, No debe haber espacios entre ellos. (Nota: es posible que tenga varios bloques si tuviera un código que se construyó automáticamente)
Asegúrese también de que no tenga ninguna marca de orden de bytes en su código, por ejemplo, cuando la codificación del script sea UTF-8 con BOM.
Preguntas relacionadas:
- Encabezados ya enviados por PHP
- Todas las preguntas de PHP "Encabezados ya enviados" en
- Byte Order Mark
- ¿Qué funciones PHP crean salida?
Advertencia: restricción open_basedir vigente
Esta advertencia puede aparecer con varias funciones relacionadas con el acceso a archivos y directorios. Se 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 archivos.
La solución normalmente es cambiar la configuración de PHP , la configuración relacionada se llama open_basedir
.
A veces se usan los nombres de archivos o directorios incorrectos, la solución es usar los correctos.
Preguntas relacionadas:
- Restricción de open_basedir vigente. El archivo (/) no está dentro de las rutas permitidas:
- Todas las PHP "Advertencia: restricción open_basedir en efecto" Querstions en
Aviso: Índice no definido
Ocurre cuando intenta acceder a una matriz mediante una clave que no existe en la matriz.
Un ejemplo típico para un aviso de Undefined Index
sería ( demo )
$data = array(''foo'' => ''42'', ''bar'');
echo $data[''spinach''];
echo $data[1];
Tanto la spinach
como la 1
no existen en la matriz, lo que provoca que se E_WARNING un E_WARNING .
La solución es asegurarse de que el índice o la compensación 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 espera que lo hagan. 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 tienes código como:
<?php echo $_POST[''message'']; ?>
<form method="post" action="">
<input type="text" name="message">
...
entonces $_POST[''message'']
no se configurará 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:
- Referencia: "Aviso: Variable no definida" y "Aviso: Índice no definido"
- Todas las preguntas de PHP "Aviso: Índice no definido" sobre
- http://php.net/arrays
Aviso: Desplazamiento de la cadena sin inicializar: *
Como su nombre lo indica, este tipo de error ocurre, cuando lo más probable es que intente iterar, o encuentre un valor de la matriz con una clave que no existe.
Considera que estás tratando de mostrar cada letra 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 hacer eco D
, aparecerá el error, porque dentro del bucle for()
, le ha dicho a PHP que le muestre el carácter de la primera a la quinta cadena de ''ABCD''
, que existe, pero desde el bucle comienza a contar desde 0
y se hace eco de D
cuando llega a 4
, generará un error de compensación.
Errores similares:
- Desplazamiento de cadena ilegal ''opción 1''
Aviso: Uso de una constante no definida XXX - asumida ''XXX''
o, en PHP 7.2 o posterior:
Advertencia: Uso de una constante no definida XXX - asumida como ''XXX'' (esto generará un error en una versión futura de PHP)
Este aviso se produce cuando se utiliza un token en el código y parece ser una constante, pero no se define una constante con ese nombre.
Una de las causas más comunes de este aviso es no 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 que falte un signo de $
(dólar) delante de un nombre de variable:
// Wrong
echo varName;
// Right
echo $varName;
O quizás haya escrito incorrectamente 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:
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ó $counter
anteriormente, 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++;
}
Preguntas relacionadas:
- Todas las preguntas de PHP "Aviso: Variable no definida" en
- PHP: "Aviso: Variable no definida", "Aviso: Índice no definido" y "Aviso: Desplazamiento indefinido"
- Referencia: ¿Qué es el alcance de la variable, a qué variables se puede acceder desde dónde y cuáles son los errores de "variable no definida"?
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 entre comillas para la interpolación dentro de una cadena de comillas dobles, cuando la construcción de la variable compleja completa no está incluida en {}
.
El caso de error:
Esto dará como resultado Unexpected T_ENCAPSED_AND_WHITESPACE
:
echo "This is a double-quoted string with a quoted array key in $array[''key'']";
//---------------------------------------------------------------------^^^^^
Posibles arreglos:
En una cadena de doble comilla, PHP permitirá que las cadenas de clave de matriz se utilicen sin comillas , y no emitirá un E_NOTICE
. Así que 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 {}
, en cuyo caso deben citarse para evitar una 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, vea la sección sobre Análisis de Variables en la página de manual de Cadenas PHP
Error de análisis: error de sintaxis, T_PAAMAYIM_NEKUDOTAYIM inesperado
El operador de resolución de alcance también se llama "Paamayim Nekudotayim" del hebreo פעמיים נקודתיים. que significa "doble colon" o "doble punto dos veces".
Este error generalmente ocurre si inadvertidamente pone ::
en su código.
Preguntas relacionadas:
- Referencia: PHP Parse / Syntax Errors; y como solucionarlos?
- ¿Qué significan dos puntos en PHP?
- ¿Cuál es la diferencia entre :: (doble colon) y -> (flecha) en PHP?
- Inesperado T_PAAMAYIM_NEKUDOTAYIM, esperando T_NS_Separator
Documentación:
Error de análisis: error de sintaxis, T_VARIABLE inesperado
Posible escenario
Parece que no puedo encontrar donde mi código ha ido mal. Aquí está mi error completo:
Error de análisis: error de sintaxis, T_VARIABLE inesperado en la línea x
Lo que estoy tratando
$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, faltar el .
operador. El intérprete deja de ejecutar su programa cuando encuentra un error de análisis.
En palabras simples, esto 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 revisar cuidadosamente las líneas alrededor de donde se encuentra el error para 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 cambio, encontró algo llamado T_VARIABLE
. Esa T_VARIABLE
cosa se llama a token
. Es la forma en que el intérprete de 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 ponga una variable en su programa, hay un T_VARIABLE
token en la lista del intérprete.
Buena lectura: Lista de Tokens Parser
Así que asegúrate de habilitar al menos E_PARSE
en tu 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);
También es una buena idea usar un IDE que le permita saber errores de análisis mientras escribe. Puedes usar:
- NetBeans (buena paz de la belleza, software libre) (el mejor en mi opinión)
- PhpStorm (a tío Gordon le encanta esto: P, plan pagado, contiene software propietario y gratuito)
- Eclipse (La bella y la bestia, software libre)
Preguntas relacionadas:
- Referencia: PHP Parse / Syntax Errors; y como solucionarlos?
Error de análisis: error de sintaxis, T_XXX inesperado
T_XXX
cuando tiene el token T_XXX
en un lugar inesperado, paréntesis desequilibrados (superfluos), uso de etiqueta corta sin activarlo en php.ini, y muchos más.
Preguntas relacionadas:
- Referencia: PHP Parse / Syntax Errors; y como solucionarlos?
- Error de análisis: error de sintaxis, inesperado ''{''
- Error de análisis: error de sintaxis, final inesperado del archivo en mi código PHP
- Error de análisis: error de sintaxis, inesperado ''<'' en - ¿Reparar?
- Error de análisis: error de sintaxis, inesperado ''?''
Para más ayuda ver:
- http://phpcodechecker.com/ - Lo que proporciona algunas explicaciones más útiles sobre sus problemas de sintaxis.
Error fatal: Llamada a 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 incluyen, 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 se declarará porque $someCondition
no es verdadero.
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 se declarará una vez que se createFn()
. 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 incorporada de PHP. Intente buscar la función en el manual oficial y verifique a qué "extensión" (módulo PHP) pertenece y a qué versiones de PHP lo admite.
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 conocer la extensión en la que aparece su función. También puede habilitar o instalar la extensión usando su administrador de paquetes (por ejemplo, apt
en Debian o Ubuntu, yum
en Red Hat o CentOS), o una Panel de control en un entorno de alojamiento compartido.
Si la función se introdujo en una versión más reciente de PHP a partir de lo que está usando, 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 falte la inclusión, asegúrese de incluir el archivo que declara la función antes de llamar a la función.
En caso de errores tipográficos, corregir el error tipográfico.
Preguntas relacionadas:
- https://.com/search?q=Fatal+error%3A+Call+to+undefined+function
Error fatal: usando $ esto 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:
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 el contexto del 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 simplemente en el ámbito global y manteniendo
$this
variable especial.
Cómo solucionarlo: revise el código y reemplace$this
con una variable de sustitución diferente.
Preguntas relacionadas:
- Llame al método no estático como estático: PHP Error fatal: usando $ esto cuando no está en el contexto del objeto
- Copia sobre el código: Error grave: usando $ esto cuando no está en el contexto del objeto
- Todas las preguntas de "Usar $ esto cuando no está en el contexto de un objeto" en
Error grave: el tamaño de memoria permitido de XXX bytes se agotó (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 archivo php.ini
o usando ini_set(''memory_limit'', ''128 M'');
en 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 se engulle toda la memoria disponible y desactive 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, puede usar mucha memoria. Cambie su código para que, en cambio, lea el archivo línea por línea o recupere los registros de la base de datos uno por uno sin almacenarlos en la memoria. Esto requiere un poco de conciencia conceptual de lo que sucede detrás de la escena y cuando los datos se almacenan en la memoria en lugar de en otros lugares.
Si se produjo este error cuando la secuencia de comandos no estaba realizando un trabajo con mucha memoria, debe verificar el código para ver si hay una pérdida de memoria. La función memory_get_usage
es tu amiga.
Preguntas relacionadas:
- Todas las preguntas sobre "Error fatal: tamaño de memoria permitido de XXX bytes agotados" en
Error grave: llamar a una función miembro ... en un no-objeto
xyz->method()
con un código similar a xyz->method()
donde xyz
no es un objeto y, por lo tanto method
no se puede llamar a ese method
.
Este es un error fatal que detendrá la secuencia de comandos (aviso de compatibilidad hacia adelante: se convertirá en un error detectable a partir de PHP 7).
En la mayoría de los casos, esto es una señal de que al código le faltan comprobaciones de condiciones de error. Valide que un objeto sea realmente un objeto antes de llamar a sus métodos.
Un ejemplo typical 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()
asignará false
a la $statement
. Intentar llamar al método execute()
resultará en un Error Fatal porque false
es un "objeto" porque el valor es un valor booleano.
Averigua por qué tu función devolvió un valor booleano en lugar de un objeto. Por ejemplo, verifique el objeto $pdo
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 en particular.
Si incluso el ->prepare
está fallando, entonces su objeto de identificador de base de datos $pdo
no se pasó al alcance actual . Encuentra donde se definió. Luego páselo como parámetro, almacénelo como propiedad o compártalo a través del ámbito global.
Otro problema puede ser crear condicionalmente un objeto y luego tratar de 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:
- Llamada a una función miembro en un no-objeto
- Lista de todas las preguntas de PHP "Error fatal: Llamada a una función miembro ... en un no-objeto" Preguntas sobre
Error grave: no se puede utilizar el valor de retorno de la función en el contexto de escritura
Esto suele suceder cuando se utiliza una función directamente con empty
.
Ejemplo:
if (empty(is_null(null))) {
echo ''empty'';
}
Esto se debe a que el empty
es una construcción de lenguaje y no una función, no se puede llamar con una expresión como su argumento en las versiones de PHP anteriores a 5.5. Antes de PHP 5.5, el argumento de empty()
debe ser una variable , pero se admite una expresión arbitraria (como el valor de retorno de una función) en PHP 5.5+.
empty
, a pesar de su nombre, no verifica realmente si una variable está "vacía". En su lugar, comprueba si una variable no existe, o == false
. Las expresiones (como is_null(null)
en el ejemplo) siempre se considerarán como existentes, por lo que aquí empty
solo se verifica si es igual a falso. Usted podría reemplazar el empty()
aquí con !
, por ejemplo, if (!is_null(null))
, o se compara explícitamente con false, por ejemplo, if (is_null(null) == false)
.
Preguntas relacionadas:
Error grave: no se puede volver a declarar la clase [nombre de la clase]
Error grave: no se puede volver a declarar [nombre de la función]
Esto significa que está usando el mismo nombre de función / clase dos veces y necesita cambiar el nombre de uno de ellos, o porque ha usado require
o include
donde debería usar require_once
o 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:
clase.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 require
to require_once
, podemos estar seguros de que el archivo que contiene la definición de MyClass
solo se cargará una vez y se evitará el error.
MySQL: Tiene un error en su sintaxis SQL; consulte el manual que corresponde a la versión de su servidor MySQL para conocer 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 de 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é pasará si el texto enviado contiene comillas simples? $query
terminará 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 siempre escapar de los datos antes de utilizarlos en una consulta.
Escapar de los datos antes de usarlos en una consulta SQL también es muy importante porque si no lo hace, su script estará abierto a las inyecciones de SQL. Una inyección de SQL puede causar la 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:
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 se desactiva el informe de errores y se produce un error grave (a menudo un error de sintaxis)
Si tiene habilitado el registro de errores, encontrará el mensaje de error concreto en su registro de errores. Por lo general, estará en un archivo llamado "php_errors.log", ya sea en una ubicación central (por ejemplo, /var/log/apache2
en muchos entornos Linux) o en el directorio del script (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 en blanco 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 en el nivel más alto.
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 también desea mostrarlos en la salida (por ejemplo, en un navegador), debe establecer la directiva display_startup_errors
en true
. Haga esto en el php.ini
o en un .htaccess
o mediante 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 de archivo de registro.
Al mirar el registro o usar la pantalla, recibirá un mensaje de error mucho mejor y la línea de código donde se detiene el script.
Preguntas relacionadas:
- Pantalla blanca de la muerte de PHP
- Pantalla blanca de la muerte!
- PHP no muestra mensajes de error
- PHP emitiendo 500 en errores, ¿dónde está esto documentado?
- ¿Cómo obtener mensajes de error útiles en PHP?
- Todas las preguntas de PHP "Página blanca de la muerte" en
Errores relacionados:
- Error de análisis: error de sintaxis, T_XXX inesperado
- Error grave: llamar a una función miembro ... en un no-objeto
- El código no se ejecuta / lo que parece que se generan partes de mi código PHP
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 suprimirán ocasionalmente la advertencia al agregar el operador de supresión de errores @ 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 provendrá de cualquier instancia en la que intente dividir entre 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 volver a escribir su expresión para verificar que el valor no sea 0; si lo es, haga otra cosa. Si el valor es cero, no debe dividir, o cambiar el valor a 1 y luego dividir de manera 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:
Advertencia: cadena ilegal desplazada ''XXX''
Esto sucede cuando intenta acceder a un elemento de matriz con la sintaxis de corchete, 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 viene y solucione el problema allí.
Advertencia: mysql_connect (): Acceso denegado para el usuario ''nombre'' @ ''host''
Esta advertencia aparece cuando se conecta a un servidor MySQL / MariaDB con credenciales invá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.
Vea la página del manual en
mysql_connect("localhost", "user", "pw")
para ejemplos.Comprueba que realmente usaste un
$username
y$password
.- Es poco común que acceda sin usar una contraseña, que es lo que sucedió cuando la Advertencia: dijo
(using password: NO)
. Solo el servidor de prueba local generalmente permite conectarse con el 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 comandos:
mysql --user="username" --password="password" testdb
El nombre de usuario y la contraseña distinguen entre mayúsculas y minúsculas y el espacio en blanco no se ignora. Si su contraseña contiene caracteres meta
$
, escúchelos o ponga la contraseña entre comillas simples .La mayoría de los proveedores de alojamiento compartido predeclaran cuentas de mysql en relación con la cuenta de usuario de Unix (a veces solo prefijos o sufijos numéricos adicionales). Consulte la documentación para un patrón o documentación, y CPanel o cualquier interfaz para establecer una contraseña.
Consulte el manual de MySQL sobre Adición de cuentas de usuario mediante la línea de comandos. Cuando se conecta 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 los detalles de la cuenta.
Si no puede corregir sus credenciales, entonces 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.
- Es poco común que acceda sin usar una contraseña, que es lo que sucedió cuando la Advertencia: dijo
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 son significativas.
A menudo, solo desea que el nombre del servidor sea
"localhost"
, que normalmente utiliza un socket con nombre local cuando está disponible. Otras veces puedes intentarlo"127.0.0.1"
como reserva.Si su servidor MySQL / MariaDB escucha en un puerto diferente, utilice
"servername:3306"
.Si eso falla, entonces hay un problema de cortafuegos. (Fuera de tema, no es una pregunta de programación. No es posible la ayuda remota para conjeturas).
Al usar constantes como, por ejemplo ,
DB_USER
oDB_PASSWORD
, compruebe que realmente están defined .Si obtienes una
"Warning: Access defined for ''DB_USER''@''host''"
y una"Notice: use of undefined constant ''DB_PASS''"
, entonces ese es tu problema.Verifique que su eg
xy/db-config.php
fue realmente incluido y qué más.
Compruebe si los
GRANT
permisos establecidos correctamente .No es suficiente tener un par
username
+password
Cada cuenta MySQL / MariaDB puede tener un conjunto de permisos adjuntos.
Esos pueden restringir a qué bases de datos se le permite conectarse, desde qué cliente / servidor se puede originar la conexión, y qué consultas están permitidas.
Por lo tanto, la advertencia de "Acceso denegado" también puede aparecer para las
mysql_query
llamadas, si no tiene permisosSELECT
de una tabla específica, yINSERT
/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 usando la cuenta de administrador con una consulta como:
GRANT ALL ON yourdb.* TO ''username''@''localhost'';
Si la advertencia aparece primero,
Warning: mysql_query(): Access denied for user ''''@''localhost''
entonces puede que tenga un par de cuenta / contraseña preconfigurado con php.ini .Verifique eso
mysql.default_user=
ymysql.default_password=
tenga valores significativos.A menudo esto es una configuración de proveedor. Así que póngase en contacto con su apoyo para los desajustes.
Encuentre la documentación de su proveedor de alojamiento compartido:
por ejemplo , HostGator , GoDaddy , 1and1 , DigitalOcean , BlueHost , DreamHost , MediaTemple , ixWebhosting , lunarhosting , o simplemente google tuyo.
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 conjunto de conexiones disponible . Obtendrá acceso a las advertencias denegadas para demasiadas conexiones simultáneas. (Tiene que investigar la configuración. Eso es un problema de configuración del servidor fuera de tema, no una pregunta de programación).
Es posible que la versión del cliente libmysql no sea compatible con el servidor de la base de datos. Normalmente, los servidores MySQL y MariaDB se pueden alcanzar 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, la discrepancia de la versión puede impedir las conexiones. (No, tienes que investigarte tú mismo. Nadie puede adivinar tu configuración).
Más referencias:
- Serverfault: acceso a mysql denegado para ''root'' @ ''nombre de la computadora''
- Advertencia: mysql_connect (): Acceso denegado
- Advertencia: mysql_select_db () Acceso denegado para el usuario '''' @ ''localhost'' (usando la contraseña: NO)
- Acceso denegado para el usuario ''root'' @ ''localhost'' con PHPMyAdmin
Por cierto, probablemente ya no quieras usar
mysql_*
funciones . Los recién llegados suelen migrar a mysqli , que sin embargo es igual de tedioso. En su lugar, lea sobre la DOP y las declaraciones preparadas .
$db = new PDO("mysql:host=localhost;dbname=testdb", "username", "password");
Aviso: Conversión de matriz a cadena
Esto simplemente sucede si intentas 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 fue lo que se pretendía y que debería revisar 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 bucle 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 un lugar que no espera, significa que una variable que pensó que es una cadena es en realidad una matriz. Eso significa que tienes un error en tu código que hace de esta variable una matriz en lugar de la cadena que esperas.
Aviso: Intentando obtener propiedad de error no-objeto
Ocurre cuando intenta 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, $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 no definido ).
Este ejemplo es mucho más simplificado. En la mayoría de los casos, un aviso de este tipo señala un valor de retorno no verificado, por ejemplo, cuando una biblioteca devuelve NULL
si un objeto no existe o simplemente un valor inesperado sin objeto (por ejemplo, en un resultado Xpath, estructuras JSON con formato inesperado, XML con formato inesperado, etc.) pero el código no comprueba tal condición.
Como esos no-objetos a menudo se procesan más adelante, a menudo se produce un error fatal al llamar a un método de objeto en un no-objeto (ver: Error grave : llamar a una función miembro ... en un no-objeto ) detener el guión.
Se puede prevenir 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 nodeValue
propiedad (campo) del primer elemento mientras no se ha verificado si existe o no en la $result
colección. En su lugar, 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 ($div) {
$divText = $div->nodeValue;
}
echo $divText;
Errores relacionados:
- Aviso: Índice no definido
- Error grave: llamar a una función miembro ... en un no-objeto
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 View Source en su navegador, probablemente esté viendo el archivo de código fuente de PHP completo 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
- para establecer la extensión de archivo en .php, de lo contrario el servidor web no lo interpretará como tal *
- para acceder a su archivo .php a través del servidor web
* A menos que lo reconfigures, todo se puede configurar.
Este último es particularmente importante. Es probable que con solo hacer doble clic en el archivo, se abra en su navegador usando una dirección como:
file://C:/path/to/my/file.php
Esto es omitir completamente cualquier servidor web que pueda estar ejecutando y el archivo no se interpreta. Debe visitar la URL del archivo en su servidor web, probablemente algo como:
http://localhost/my/file.php
También es posible que desee comprobar si está utilizando etiquetas abiertas cortas en <?
lugar de, <?php
y su configuración de PHP ha desactivado las etiquetas abiertas cortas.
También vea que el código PHP no se está ejecutando, en lugar de eso, el código se muestra en la página
Error de análisis: error de sintaxis, inesperado ''[''
Este error viene en dos variables:
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 a eso. Si es posible, actualice su instalación o use la sintaxis antigua:
$arr = array(1, 2, 3);
Véase también este ejemplo del manual.
Variación 2
$suffix = explode('','', ''foo,bar'')[1];
Los resultados de la función de desreferenciación de matrices también se introdujeron en PHP 5.4. Si no es posible actualizar, necesita usar una variable (temporal):
$parts = explode('','', ''foo,bar'');
$suffix = $parts[1];
Véase también este ejemplo del manual.
Error fatal: [TraitA] y [TraitB] definen la misma propiedad ([$ x]) en la composición de [ClassC]
Ocurre cuando una clase intenta use
múltiples Rasgos , donde dos o más de esos Rasgos han definido una propiedad con el mismo nombre, y la propiedad tiene valores iniciales diferentes.
Ejemplo:
<?php
trait TraitA
{
public $x = ''a'';
}
trait TraitB
{
public $x = ''b'';
}
class ClassC
{
use TraitA, TraitB;
}
Problemática: si bien es posible resolver conflictos entre métodos que compiten entre sí , actualmente no hay una sintaxis que resuelva un conflicto entre dos propiedades en competencia. La única solución en este momento es refactor ; es decir, evitar un conflicto entre nombres de propiedades que produce un error fatal.
Preguntas relacionadas:
Advertencia: [función] espera que el parámetro 1 sea un recurso, dado booleano
(Una variación más general de Advertencia: mysql_fetch_array () espera que el parámetro 1 sea un recurso, dado booleano )
Los recursos son un type en PHP (como cadenas, enteros u objetos). Un recurso es un blob opaco sin un valor intrínsecamente 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 es 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_dump
ed, 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)
).
Llevas estos recursos y los pasas a diferentes funciones para las que 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 de estos datos internamente.
El error " ... espera que el parámetro 1 sea un recurso, booleano dado " suele ser el resultado de una operación no verificada que se suponía que debía crear un recurso, pero que se devolvió false
. Por ejemplo, la fopen
función tiene esta descripción:
Valores de retorno
Devuelve un recurso de puntero de archivo en caso de éxito o
FALSE
error.
Entonces en este código, $fp
será resource(x) of type (stream)
o false
:
$fp = fopen(...);
Si no verifica si la fopen
operación fue exitosa o fallida y, por lo tanto, si $fp
es un recurso válido false
y pasa $fp
a 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 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:
Normas estrictas: el método no estático [<clase> :: <método>] no debe llamarse estáticamente
Ocurre cuando intentas llamar a un método no estático en una clase ya que era estático, y también tienes la E_STRICT
bandera en tu 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_STRICT
a 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 llamar a la función convencionalmente:
$html = new HTML();
$html->br();
Preguntas relacionadas :