mysql remove - Referencia-¿Qué significa este error en PHP?




html tags (25)

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:

¿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


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:


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.


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:


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_STRICTbandera 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_STRICTa error_reporting(), por ejemplo,

error_reporting(E_ALL & ~E_STRICT);

ya que para PHP 5.4.0 y superior, E_STRICTse 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 :


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

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


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:


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

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:


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:

Para más ayuda ver:


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


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


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'

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

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:


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

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:


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:


stClass es una clase vacía creada por php en sí, y debe ser utilizada solo por php, ya que no es solo una clase "vacía", php usa stdClass para convertir matrices al estilo de un objeto si necesita usar stdClass, le recomiendo dos mejores opciones : 1- usa matrices (mucho más rápido que las clases) 2- crea tu propia clase vacía y úsala

//example 1
$data=array('k1'=>'v1' , 'k2'=>'v2',....);

//example 2
//creating an empty class is faster than instances an stdClass
class data={}
$data=new data();
$data->k1='v1';
$data->k2='v2';

¿Qué hace que alguien piense en usar el estilo de objeto en lugar del estilo de matriz?





php mysql debugging warnings