mysql Riferimento - Cosa significa questo errore in PHP?





15 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
php mysql debugging warnings

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




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:




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



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:




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:




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




Avviso: variabile non definita

Succede quando si tenta di utilizzare una variabile che non è stata precedentemente definita.

Un tipico esempio potrebbe essere

foreach ($items as $item) {
    // do something with item
    $counter++;
}

Se non hai definito $counter precedenza, il codice sopra attiverà la notifica.

Il modo corretto sarebbe quello di impostare la variabile prima di usarla, anche se è solo una stringa vuota come

$counter = 0;
foreach ($items as $item) {
    // do something with item
    $counter++;
}

Domande correlate:




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:




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?



Avviso: tentativo di ottenere la proprietà di un errore non dell'oggetto

Accade quando si tenta di accedere a una proprietà di un oggetto mentre non vi è alcun oggetto.

Un esempio tipico per un avviso senza oggetto sarebbe

$users = json_decode('[{"name": "hakre"}]');
echo $users->name; # Notice: Trying to get property of non-object

In questo caso, $usersè un array (quindi non un oggetto) e non ha proprietà.

È simile all'accesso a un indice o chiave non esistente di un array (vedere Avviso: Indice non definito ).

Questo esempio è molto semplificato. Molto spesso tale avviso segnala un valore di ritorno non controllato, ad esempio quando una libreria restituisce NULLse un oggetto non esiste o solo un valore non oggetto inatteso (ad esempio in un risultato Xpath, strutture JSON con formato inatteso, XML con formato imprevisto ecc.) ma il codice non verifica la presenza di una tale condizione.

Poiché questi non oggetti vengono spesso elaborati più avanti, spesso si verifica un errore irreversibile in seguito alla chiamata di un metodo oggetto su un non oggetto (vedere: Errore irreversibile: chiamata a una funzione membro ... su un oggetto non ) interruzione script.

Può essere facilmente prevenuto controllando le condizioni di errore e / o che una variabile corrisponda a un'aspettativa. Ecco un avviso simile con un esempio DOMXPath :

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$divText = $result->item(0)->nodeValue; # Notice: Trying to get property of non-object

Il problema è accedere alla nodeValueproprietà (campo) del primo elemento mentre non è stato controllato se esiste o meno nella $resultraccolta. Invece paga per rendere il codice più esplicito assegnando variabili agli oggetti su cui il codice opera:

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$div     = $result->item(0);
$divText = "-/-";
if ($div) {
    $divText = $div->nodeValue;
}
echo $divText;

Errori correlati:

  • Avviso: indice non definito
  • Errore irreversibile: chiamata a una funzione membro ... su un non oggetto



Avviso: offset stringa non valido 'XXX'

Questo accade quando si tenta di accedere a un elemento dell'array con la sintassi della parentesi quadra, ma lo si fa su una stringa e non su un array, quindi l'operazione chiaramente non ha senso .

Esempio:

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

Se pensi che la variabile debba essere una matrice, vedi da dove proviene e risolvi il problema.




Avviso: mysql_connect (): accesso negato per l'utente 'nome' @ 'host'

Questo avviso compare quando ci si connette a un server MySQL / MariaDB con credenziali non valide o mancanti (nome utente / password). Quindi questo in genere non è un problema di codice, ma un problema di configurazione del server.

  • Vedere la pagina di manuale su mysql_connect("localhost", "user", "pw")per esempi.

  • Verifica di aver effettivamente usato un $usernamee $password.

    • È raro che tu acceda senza usare la password, il che è ciò che è accaduto quando l'avviso: detto (using password: NO).
    • Solitamente il test server locale di solito consente di connettersi con nome utente root, nessuna password e il testnome del database.

    • È possibile verificare se sono veramente corretti utilizzando il client della riga di comando:
      mysql --user="username" --password="password" testdb

    • Username e password sono case-sensitive e whitespace non è ignorato. Se la password contiene caratteri meta come $, sfuggirli o inserire la password tra virgolette singole .

    • La maggior parte dei provider di hosting condiviso predica account mysql in relazione all'account utente unix (a volte solo prefissi o suffissi numerici extra). Vedi i documenti per un modello o documentazione, e CPanel o qualsiasi altra interfaccia per impostare una password.

    • Vedi il manuale MySQL su Aggiunta di account utente usando la riga di comando. Se connesso come utente amministratore , puoi inviare una query come:
      CREATE USER 'username'@'localhost' IDENTIFIED BY 'newpassword';

    • Oppure usa Adminer o WorkBench o qualsiasi altro strumento grafico per creare, controllare o correggere i dettagli dell'account.

    • Se non riesci a correggere le tue credenziali, chiedere a internet "please help" non avrà alcun effetto. Solo tu e il tuo provider di hosting avete le autorizzazioni e l'accesso sufficiente per diagnosticare e sistemare le cose.

  • Verifica di poter raggiungere il server del database, utilizzando il nome host fornito dal tuo provider:
    ping dbserver.hoster.example.net

    • Controlla questo da una console SSH direttamente sul tuo server web. I test dal tuo client di sviluppo locale al tuo server di hosting condiviso sono raramente significativi.

    • Spesso si desidera solo il nome del server "localhost", che normalmente utilizza un socket con nome locale quando disponibile. Altre volte puoi provare "127.0.0.1"come fallback.

    • Se il tuo server MySQL / MariaDB ascolta su una porta diversa, allora usa "servername:3306".

    • Se fallisce, allora c'è forse un problema con il firewall. (Off-topic, non una domanda di programmazione. Nessuna supposizione remota possibile).

  • Quando usi costanti come ad esempio DB_USERo DB_PASSWORD, controlla che siano effettivamente defined .

    • Se ottieni un "Warning: Access defined for 'DB_USER'@'host'"e un "Notice: use of undefined constant 'DB_PASS'", allora questo è il tuo problema.

    • Verifica che il tuo esempio xy/db-config.phpsia effettivamente incluso e whatelse.

  • Verifica la corretta impostazione delle GRANTautorizzazioni .

    • Non è sufficiente avere un username+ passwordpaio.

    • Ogni account MySQL / MariaDB può avere un set di permessi allegato.

    • Quelli possono limitare a quali database è consentito connettersi, da quale client / server la connessione può provenire e quali query sono consentite.

    • L'avviso "Accesso negato" può quindi mostrare le mysql_querychiamate, se non si dispone delle autorizzazioni SELECTda una tabella specifica o INSERT/ UPDATE, e più comunemente DELETEnulla.

    • È possibile adattare le autorizzazioni dell'account quando connesso per client della riga di comando utilizzando l' account amministratore con una query come:
      GRANT ALL ON yourdb.* TO 'username'@'localhost';

  • Se prima compare l'avviso, Warning: mysql_query(): Access denied for user ''@'localhost'allora potresti avere una coppia account / password php.ini preconfigurata .

    • Controlla quello mysql.default_user=e mysql.default_password=hai valori significativi.

    • Spesso questa è una configurazione del fornitore. Quindi contatta il loro supporto per i disallineamenti.

  • Trova la documentazione del tuo provider di hosting condiviso:

  • Si noti che potrebbe anche essersi esaurito il pool di connessione disponibile . Avrai accesso agli avvisi negati per troppe connessioni simultanee. (È necessario esaminare la configurazione: si tratta di un problema di configurazione del server non pertinente, non di una domanda di programmazione).

  • La versione del client libmysql potrebbe non essere compatibile con il server del database. Normalmente i server MySQL e MariaDB possono essere raggiunti con PHP compilato nel driver. Se si dispone di una configurazione personalizzata o di una versione di PHP obsoleta e di un server di database molto più recente o di una versione obsoleta, la mancata corrispondenza della versione potrebbe impedire le connessioni. (No, devi investigare da solo. Nessuno può indovinare il tuo setup).

Più riferimenti:

Btw, probabilmente non vuoi mysql_*più usare le funzioni . I nuovi arrivati ​​spesso migrano a mysqli , che tuttavia è altrettanto noioso. Leggete invece su DOP e dichiarazioni preparate .
$db = new PDO("mysql:host=localhost;dbname=testdb", "username", "password");




Avviso: divisione per zero

Il messaggio di avvertenza "Divisione per zero" è una delle domande più frequenti tra i nuovi sviluppatori PHP. Questo errore non causerà un'eccezione, pertanto alcuni sviluppatori sopprimeranno l'avviso occasionalmente aggiungendo l'operatore di soppressione degli errori @ prima dell'espressione. Per esempio:

$value = @(2 / 0);

Ma, come per ogni avvertimento, l'approccio migliore sarebbe quello di rintracciare la causa dell'avvertimento e risolverlo. La causa dell'avvertimento arriverà da qualsiasi istanza in cui si tenta di dividere per 0, una variabile uguale a 0 o una variabile che non è stata assegnata (poiché NULL == 0) perché il risultato sarà 'indefinito'.

Per correggere questo avviso, è necessario riscrivere l'espressione per verificare che il valore non sia 0, se lo è, fare qualcos'altro. Se il valore è zero, non devi dividere o cambiare il valore in 1 e quindi dividere in modo che la divisione risulti l'equivalente di averlo diviso solo per la variabile aggiuntiva.

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
}

Domande correlate:




Errore irreversibile: [TraitA] e [TraitB] definiscono la stessa proprietà ([$ x]) nella composizione di [ClassC]

Si verifica quando una classe tenta di utilizzare usepiù tratti , in cui due o più di questi tratti hanno definito una proprietà con lo stesso nome e con la proprietà con valori iniziali diversi.

Esempio:

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

Problematico: sebbene sia possibile risolvere conflitti tra metodi concorrenti , non esiste attualmente alcuna sintassi che possa risolvere un conflitto tra due proprietà concorrenti. L'unica soluzione in questo momento è il refactor ; cioè, evitare un conflitto tra i nomi di proprietà che produce un errore fatale.

Domande correlate:




Related