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




strip_tags() (20)

¿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

Ver también

https://code.i-harness.com


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:


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:

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: 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:


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:


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:


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:

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_VARIABLEcosa 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_VARIABLEtoken en la lista del intérprete.

Buena lectura: Lista de Tokens Parser

Así que asegúrate de habilitar al menos E_PARSEen 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);

Reporte de errores PHP

También es una buena idea usar un IDE que le permita saber errores de análisis mientras escribe. Puedes usar:

  1. NetBeans (buena paz de la belleza, software libre) (el mejor en mi opinión)
  2. PhpStorm (a tío Gordon le encanta esto: P, plan pagado, contiene software propietario y gratuito)
  3. Eclipse (La bella y la bestia, software libre)

Preguntas relacionadas:

  • Referencia: PHP Parse / Syntax Errors; y como solucionarlos?

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:

  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 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. Use self::$static_property para acceder a la propiedad estática.

  2. Si el código de un método de clase se ha copiado en una función normal o 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:

  1. Llame al método no estático como estático: PHP Error fatal: usando $ esto cuando no está en el contexto del objeto
  2. Copia sobre el código: Error grave: usando $ esto cuando no está en el contexto del objeto
  3. Todas las preguntas de "Usar $ esto cuando no está en el contexto de un objeto" 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:


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:

Errores relacionados:


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 $usernamey $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 el testnombre 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.

  • 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_USERo DB_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.phpfue realmente incluido y qué más.

  • Compruebe si los GRANTpermisos 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_queryllamadas, si no tiene permisos SELECTde una tabla específica, y 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 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=y mysql.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:

  • 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:

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: 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, $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 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 NULLsi 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 nodeValuepropiedad (campo) del primer elemento mientras no se ha verificado si existe o no en la $resultcolecció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, <?phpy 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 fatal: [TraitA] y [TraitB] definen la misma propiedad ([$ x]) en la composición de [ClassC]

Ocurre cuando una clase intenta usemú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 , 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_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)).

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 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á resource(x) of type (stream)o false:

$fp = fopen(...);

Si no verifica si la fopenoperación fue exitosa o fallida y, por lo tanto, si $fpes un recurso válido falsey pasa $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 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:





warnings