Riferimento - Cosa significa questo errore in PHP?



14 Answers

Errore irreversibile: chiamata a una funzione membro ... su un non oggetto

Succede con il codice simile a xyz->method() dove xyz non è un oggetto e quindi quel method non può essere chiamato.

Questo è un errore fatale che fermerà lo script (avviso di compatibilità in avanti: diventerà un errore catchable a partire da PHP 7).

Molto spesso questo è un segno che il codice non ha verificato le condizioni di errore. Convalidare che un oggetto è in realtà un oggetto prima di chiamare i suoi metodi.

Un typical esempio potrebbe essere

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

Nell'esempio sopra, la query non può essere preparata e prepare() assegnerà false a $statement . Cercando di chiamare il metodo execute() verrà quindi generato l'errore irreversibile perché false è un "non oggetto" poiché il valore è un valore booleano.

Scopri perché la tua funzione ha restituito un valore booleano invece di un oggetto. Ad esempio, controlla l'oggetto $pdo per l'ultimo errore che si è verificato. I dettagli su come eseguire il debug di questo dipenderanno da come vengono gestiti gli errori per la particolare funzione / oggetto / classe in questione.

Se anche il ->prepare fallisce, l'oggetto handle del database $pdo non viene passato nell'ambito corrente . Trova dove è stato definito. Quindi passalo come parametro, memorizzalo come proprietà o condividilo tramite l'ambito globale.

Un altro problema potrebbe essere la creazione condizionale di un oggetto e quindi il tentativo di chiamare un metodo esterno a quel blocco condizionale. Per esempio

if ($someCondition) {
    $myObj = new MyObj();
}
// ...
$myObj->someMethod();

Tentando di eseguire il metodo al di fuori del blocco condizionale, il tuo oggetto potrebbe non essere definito.

Domande correlate:

  • Chiama una funzione membro su un non oggetto
  • Elenca tutto il PHP "Errore irreversibile: chiamata a una funzione membro ... su un oggetto non soggetto" Domande su StackOverflow
Question

Cos'è questo?

Si tratta di una serie di risposte su avvisi, errori e avvisi che potresti incontrare durante la programmazione di PHP e che non hanno idea di come risolvere. Questo è anche un wiki della comunità, quindi tutti sono invitati a partecipare all'aggiunta e al mantenimento di questa lista.

Perchè è questo?

Domande come "Intestazioni già inviate" o "Chiamata di un membro di un non oggetto" vengono visualizzate di frequente su . La causa principale di queste domande è sempre la stessa. Di conseguenza, le risposte a tali domande in genere le ripetono e mostrano all'OP la riga da modificare nel caso specifico. Queste risposte non aggiungono alcun valore al sito perché si applicano solo al codice particolare dell'OP. Altri utenti che hanno lo stesso errore non possono facilmente leggere la soluzione perché sono troppo localizzati. È triste, perché una volta che hai capito la causa principale, correggere l'errore è banale. Quindi, questa lista cerca di spiegare la soluzione in un modo generale di applicare.

Cosa dovrei fare qui?

Se la tua domanda è stata contrassegnata come un duplicato di questo, ti preghiamo di trovare il tuo messaggio di errore qui sotto e applicare la correzione al tuo codice. Le risposte di solito contengono ulteriori collegamenti per indagare nel caso in cui non dovrebbe essere chiaro dalla sola risposta generale.

Se si desidera contribuire, si prega di aggiungere il messaggio di errore "preferito", avviso o avviso, uno per risposta, una breve descrizione che cosa significa (anche se è solo evidenziando termini per la loro pagina manuale), una possibile soluzione o approccio di debug e un elenco di domande e risposte esistenti di valore. Inoltre, sentiti libero di migliorare qualsiasi risposta esistente.

La lista

Vedi anche




MySQL: hai un errore nella sintassi SQL; controlla il manuale che corrisponde alla tua versione del server MySQL per la sintassi corretta da usare vicino ... alla linea ...

Questo errore è spesso causato dal fatto di aver dimenticato di eseguire correttamente il passaggio dei dati a una query MySQL.

Un esempio di cosa non fare (la "cattiva idea"):

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

Questo codice potrebbe essere incluso in una pagina con un modulo da inviare, con un URL come http://example.com/edit.php?id=10 (per modificare il post n ° 10)

Cosa succederà se il testo inviato contiene virgolette singole? $query finirà con:

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

E quando questa query viene inviata a MySQL, si lamenterà che la sintassi è sbagliata, perché c'è una citazione singola extra nel mezzo.

Per evitare tali errori, DEVI sempre sfuggire i dati prima dell'uso in una query.

Anche l'escaping dei dati prima dell'uso in una query SQL è molto importante perché, in caso contrario, lo script sarà aperto alle iniezioni SQL. Un'iniezione SQL può causare alterazione, perdita o modifica di un record, una tabella o un intero database. Questo è un problema di sicurezza molto serio!

Documentazione:




Avviso: indice non definito

Succede quando si tenta di accedere a un array da una chiave che non esiste nell'array.

Un tipico esempio Undefined Index avviso Undefined Index sarebbe ( demo )

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

Entrambi gli spinach e 1 non esistono nell'array, causando l'attivazione di E_WARNING .

La soluzione è assicurarsi che l'indice o l'offset esista prima di accedere a tale indice. Ciò potrebbe significare che devi correggere un bug nel tuo programma per assicurarti che quegli indici esistano quando te li aspetti. Oppure può significare che devi testare se gli indici esistono 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';
}

Se hai il codice come:

<?php echo $_POST['message']; ?>
<form method="post" action="">
    <input type="text" name="message">
    ...

quindi $_POST['message'] non verrà impostato quando questa pagina viene caricata per la prima volta e verrà visualizzato l'errore sopra riportato. Solo quando il modulo viene inviato e questo codice viene eseguito una seconda volta, l'indice dell'array esiste. In genere, verifichi ciò con:

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

Domande correlate:




Avviso: [funzione] : impossibile aprire lo stream: [motivo]

Succede quando chiamate un file di solito da include , require o fopen e PHP non riesce a trovare il file o non ha abbastanza autorizzazioni per caricare il file.

Questo può accadere per una serie di motivi:

  • il percorso del file è sbagliato
  • il percorso del file è relativo
  • includere il percorso è sbagliato
  • le autorizzazioni sono troppo restrittive
  • SELinux è in vigore
  • e molti altri ...

Un errore comune è non usare un percorso assoluto. Questo può essere facilmente risolto utilizzando un percorso completo o costanti magiche come __DIR__ o dirname(__FILE__) :

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

o:

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

L'utilizzo del percorso corretto è un passo nella risoluzione di questi problemi, che può anche essere correlato a file non esistenti, diritti del filesystem che impediscono l'accesso o restrizioni open basedir da parte di PHP stesso.

Il modo migliore per risolvere rapidamente questo problema è seguire l'elenco di controllo per la risoluzione dei problemi di seguito.

Domande correlate:

Errori correlati:




Errore irreversibile: utilizzo di $ this quando non nel contesto dell'oggetto

$this è una variabile speciale in PHP che non può essere assegnata. Se si accede in un contesto in cui non esiste, viene indicato questo errore fatale.

Questo errore può verificarsi:

  1. Se un metodo non statico è chiamato staticamente. Esempio:

    class Foo {
       protected $var;
       public function __construct($var) {
           $this->var = $var;
       }
    
       public static function bar () {
           // ^^^^^^
           echo $this->var;
           //   ^^^^^
       }
    }
    
    Foo::bar();
    

    Come risolvere: rivedere il codice, $this può essere utilizzato solo nel contesto dell'oggetto e non deve mai essere utilizzato in un metodo statico. Inoltre, un metodo statico non dovrebbe accedere alla proprietà non statica. Utilizza self::$static_property per accedere alla proprietà statica.

  2. Se il codice da un metodo di classe è stato copiato in una funzione normale o solo l'ambito globale e mantenendo $this variabile speciale.
    Come risolvere il problema: rivedere il codice e sostituire $this con una variabile di sostituzione diversa.

Domande correlate:

  1. Chiama il metodo non statico come statico: PHP Errore irreversibile: Usare $ questo quando non nel contesto dell'oggetto
  2. Copia sul codice: errore irreversibile: utilizzo di $ this quando non nel contesto dell'oggetto
  3. Tutto "Usando $ questo quando non nel contesto dell'oggetto" Domande su



Fatal error: [TraitA] and [TraitB] define the same property ([$x]) in the composition of [ClassC]

Occurs when a class attempts to use multiple Traits , where two or more of those Traits have defined a property by the same name, and with the property having differing initial values.

Esempio:

<?php
trait TraitA
{
    public $x = 'a';
}
trait TraitB
{
    public $x = 'b';
}
class ClassC
{
    use TraitA, TraitB;
}

Problematic: While it's possible to resolve conflicts between competing methods , there is currently no syntax that would resolve a conflict between two competing properties. The only solution at this time is to refactor ; ie, avoid a conflict between property names that produces a fatal error.

Related Questions:




Warning: mysql_connect(): Access denied for user 'name'@'host'

This warning shows up when you connect to a MySQL/MariaDB server with invalid or missing credentials (username/password). So this is typically not a code problem, but a server configuration issue.

  • See the manual page on mysql_connect("localhost", "user", "pw") for examples.

  • Check that you actually used a $username and $password .

    • It's uncommon that you gain access using no password - which is what happened when the Warning: said (using password: NO) .
    • Only the local test server usually allows to connect with username root , no password, and the test database name.

    • You can test if they're really correct using the command line client:
      mysql --user="username" --password="password" testdb

    • Username and password are case-sensitive and whitespace is not ignored. If your password contains meta characters like $ , escape them, or put the password in single quotes .

    • Most shared hosting providers predeclare mysql accounts in relation to the unix user account (sometimes just prefixes or extra numeric suffixes). See the docs for a pattern or documentation, and CPanel or whatever interface for setting a password.

    • See the MySQL manual on Adding user accounts using the command line. When connected as admin user you can issue a query like:
      CREATE USER 'username'@'localhost' IDENTIFIED BY 'newpassword';

    • Or use Adminer or WorkBench or any other graphical tool to create, check or correct account details.

    • If you can't fix your credentials, then asking the internet to "please help" will have no effect. Only you and your hosting provider have permissions and sufficient access to diagnose and fix things.

  • Verify that you could reach the database server, using the host name given by your provider:
    ping dbserver.hoster.example.net

    • Check this from a SSH console directly on your webserver. Testing from your local development client to your shared hosting server is rarely meaningful.

    • Often you just want the server name to be "localhost" , which normally utilizes a local named socket when available. Othertimes you can try "127.0.0.1" as fallback.

    • Should your MySQL/MariaDB server listen on a different port, then use "servername:3306" .

    • If that fails, then there's a perhaps a firewall issue. (Off-topic, not a programming question. No remote guess-helping possible.)

  • When using constants like eg DB_USER or DB_PASSWORD , check that they're actually defined .

    • If you get a "Warning: Access defined for 'DB_USER'@'host'" and a "Notice: use of undefined constant 'DB_PASS'" , then that's your problem.

    • Verify that your eg xy/db-config.php was actually included and whatelse.

  • Check for correctly set GRANT permissions .

    • It's not sufficient to have a username + password pair.

    • Each MySQL/MariaDB account can have an attached set of permissions.

    • Those can restrict which databases you are allowed to connect to, from which client/server the connection may originate from, and which queries are permitted.

    • The "Access denied" warning thus may as well show up for mysql_query calls, if you don't have permissions to SELECT from a specific table, or INSERT / UPDATE , and more commonly DELETE anything.

    • You can adapt account permissions when connected per command line client using the admin account with a query like:
      GRANT ALL ON yourdb.* TO 'username'@'localhost';

  • If the warning shows up first with Warning: mysql_query(): Access denied for user ''@'localhost' then you may have a php.ini-preconfigured account/password pair .

    • Check that mysql.default_user= and mysql.default_password= have meaningful values.

    • Oftentimes this is a provider-configuration. So contact their support for mismatches.

  • Find the documentation of your shared hosting provider:

  • Note that you may also have depleted the available connection pool . You'll get access denied warnings for too many concurrent connections. (You have to investigate the setup. That's an off-topic server configuration issue, not a programming question.)

  • Your libmysql client version may not be compatible with the database server. Normally MySQL and MariaDB servers can be reached with PHPs compiled in driver. If you have a custom setup, or an outdated PHP version, and a much newer database server, or significantly outdated one - then the version mismatch may prevent connections. (No, you have to investigate yourself. Nobody can guess your setup).

More references:

Btw, you probably don't want to use mysql_* functions anymore . Newcomers often migrate to mysqli , which however is just as tedious. Instead read up on PDO and prepared statements .
$db = new PDO("mysql:host=localhost;dbname=testdb", "username", "password");




Errore di analisi: errore di sintassi, T_VARIABLE imprevisto

Scenario possibile

Non riesco a trovare dove il mio codice è andato storto. Ecco il mio errore completo:

Errore di analisi: errore di sintassi, T_VARIABLE inaspettato sulla riga x

Quello che sto provando

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

Risposta

Errore di analisi: un problema con la sintassi del tuo programma, come lasciare un punto e virgola alla fine di una dichiarazione o, come nel caso precedente, manca il . operatore. L'interprete interrompe l'esecuzione del programma quando incontra un errore di analisi.

In parole semplici questo è un errore di sintassi, nel senso che c'è qualcosa nel codice che lo impedisce di essere analizzato correttamente e quindi in esecuzione.

Quello che dovresti fare è controllare attentamente le linee intorno a dove si trova l'errore per eventuali errori semplici.

Quel messaggio di errore significa che nella riga x del file, l'interprete PHP si aspettava di vedere una parentesi aperta, ma invece ha incontrato qualcosa chiamato T_VARIABLE . Quella cosa T_VARIABLE è chiamata token . È il modo in cui interpreta PHP di esprimere diverse parti fondamentali dei programmi. Quando l'interprete legge in un programma, traduce ciò che hai scritto in una lista di token. Ovunque tu inserisca una variabile nel tuo programma, c'è un token T_VARIABLE nella lista dell'interprete.

Buona lettura: Elenco dei token Parser

Quindi assicurati di abilitare almeno E_PARSE nel tuo php.ini . Gli errori di analisi non dovrebbero esistere negli script di produzione.

Ho sempre raccomandato di aggiungere la seguente dichiarazione, durante la codifica:

error_reporting(E_ALL);

Segnalazione errori PHP

Inoltre, è consigliabile utilizzare un IDE che consenta di analizzare gli errori di analisi durante la digitazione. Puoi usare:

  1. NetBeans (bella pace della bellezza, software libero) (il migliore a mio parere)
  2. PhpStorm (lo zio Gordon ama questo: P, piano a pagamento, contiene software proprietario e gratuito)
  3. Eclipse (bellezza e la bestia, software libero)

Domande correlate:

  • Riferimento: errori Parse / Syntax PHP; e come risolverli?



Attenzione: [funzione] si aspetta che il parametro 1 sia risorsa, dato booleano

(Una variazione più generale di Warning: mysql_fetch_array () si aspetta che il parametro 1 sia risorsa, dato booleano )

Le risorse sono un type in PHP (come stringhe, interi o oggetti). Una risorsa è un blob opaco senza alcun valore intrinsecamente significativo. Una risorsa è specifica e definita da un determinato insieme di funzioni o estensioni PHP. Ad esempio, l'estensione Mysql definisce due tipi di risorse :

Ci sono due tipi di risorse usate nel modulo MySQL. The first one is the link identifier for a database connection, the second a resource which holds the result of a query.

The cURL extension defines another two resource types :

... a cURL handle and a cURL multi handle.

When var_dump ed, the values look like this:

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

resource(1) of type (curl)

That's all most resources are, a numeric identifier ( (1) ) of a certain type ( (curl) ).

You carry these resources around and pass them to different functions for which such a resource means something. Typically these functions allocate certain data in the background and a resource is just a reference which they use to keep track of this data internally.

The " ... expects parameter 1 to be resource, boolean given " error is typically the result of an unchecked operation that was supposed to create a resource, but returned false instead. For instance, the fopen function has this description:

Return Values

Returns a file pointer resource on success, or FALSE on error.

So in this code, $fp will either be a resource(x) of type (stream) or false :

$fp = fopen(...);

If you do not check whether the fopen operation succeed or failed and hence whether $fp is a valid resource or false and pass $fp to another function which expects a resource, you may get the above error:

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

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

You always need to error check the return value of functions which are trying to allocate a resource and may fail :

$fp = fopen(...);

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

$data = fread($fp, 1024);

Related Errors:




Warning: Illegal string offset 'XXX'

This happens when you try to access an array element with the square bracket syntax, but you're doing this on a string, and not on an array, so the operation clearly doesn't make sense .

Esempio:

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

If you think the variable should be an array, see where it comes from and fix the problem there.




Errore irreversibile: impossibile ridichiarare la classe [nome della classe]

Errore irreversibile: impossibile redeclare [nome funzione]

Ciò significa che stai usando lo stesso nome di funzione / classe due volte e devi rinominarne uno, o perché hai usato require o include dove dovresti usare require_once o include_once .

Quando una classe o una funzione è dichiarata in PHP, è immutabile e non può più essere dichiarata con un nuovo valore.

Considera il seguente codice:

class.php

<?php

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

index.php

<?php

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

do_stuff();
do_stuff();

La seconda chiamata a do_stuff() produrrà l'errore sopra. Cambiando require a require_once , possiamo essere certi che il file che contiene la definizione di MyClass verrà caricato una sola volta e l'errore verrà evitato.




Errore di analisi: errore di sintassi, T_ENCAPSED_AND_WHITESPACE imprevisto

Questo errore si verifica più spesso quando si tenta di fare riferimento a un valore di matrice con una chiave quotata per l'interpolazione all'interno di una stringa con doppia quotatura, quando l'intero costrutto di variabile complessa non è racchiuso tra {} .

Il caso di errore:

Ciò si tradurrà in Unexpected T_ENCAPSED_AND_WHITESPACE :

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

Possibili correzioni:

In una stringa con doppi apici , PHP consente di utilizzare stringhe di chiavi dell'array non quotate e non emette un E_NOTICE . Quindi quanto sopra potrebbe essere scritto come:

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

L'intera variabile dell'array e le chiavi possono essere racchiuse tra {} , nel qual caso devono essere citate per evitare un E_NOTICE . La documentazione di PHP raccomanda questa sintassi per variabili complesse.

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']}";

Ovviamente, l'alternativa a uno dei precedenti è concatenare la variabile dell'array invece che interpolarla:

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

Per riferimento, consultare la sezione sull'analisi delle variabili nella pagina di manuale Stringhe PHP




Errore di analisi: errore di sintassi, T_XXX imprevisto

Succede quando si dispone di token T_XXX in posizioni impreviste, parentesi non superflue (superflue), uso di tag brevi senza attivarli in php.ini e molti altri.

Domande correlate:

Per ulteriore aiuto vedi:




Warning: Division by zero

The warning message 'Division by zero' is one of the most commonly asked questions among new PHP developers. This error will not cause an exception, therefore, some developers will occasionally suppress the warning by adding the error suppression operator @ before the expression. Per esempio:

$value = @(2 / 0);

But, like with any warning, the best approach would be to track down the cause of the warning and resolve it. The cause of the warning is going to come from any instance where you attempt to divide by 0, a variable equal to 0, or a variable which has not been assigned (because NULL == 0) because the result will be 'undefined'.

To correct this warning, you should rewrite your expression to check that the value is not 0, if it is, do something else. If the value is zero you should not divide, or change the value to 1 and then divide so the division results in the equivalent of having divided only by the additional variable.

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
}

Related Questions:




Attenzione: restrizione in open_basedir in vigore

Questo avviso può apparire con varie funzioni correlate al file e all'accesso alla directory. Segnala un problema di configurazione.

Quando appare, significa che l'accesso è stato proibito ad alcuni file.

L'avviso di per sé non rompe nulla, ma molto spesso uno script non funziona correttamente se viene impedito l'accesso ai file.

Normalmente la correzione cambia la configurazione di PHP , l'impostazione correlata si chiama open_basedir .

A volte vengono utilizzati i nomi errati di file o directory, la correzione è quindi quella di utilizzare quelli giusti.

Domande correlate:




Related