mysql query - Riferimento-Cosa significa questo errore in PHP?




insert select (25)

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


Answers

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


Il codice non viene eseguito / vengono visualizzate parti del mio codice PHP

Se non vedi alcun risultato dal tuo codice PHP e / o stai vedendo parti del tuo output di codice sorgente PHP letterale nella pagina web, puoi essere abbastanza sicuro che il tuo PHP non viene effettivamente eseguito. Se utilizzi View Source nel tuo browser, probabilmente stai vedendo l'intero file di codice sorgente PHP così com'è. Poiché il codice PHP è incorporato nei <?php ?>tag, il browser proverà a interpretarli come tag HTML e il risultato potrebbe sembrare un po 'confuso.

Per eseguire effettivamente gli script PHP, è necessario:

  • un server web che esegue il tuo script
  • per impostare l'estensione del file su .php, altrimenti il ​​web server non lo interpreterà come tale *
  • per accedere al tuo file .php tramite il server web

* A meno che non lo riconfiguri, tutto può essere configurato.

Quest'ultimo è particolarmente importante. Semplicemente facendo doppio clic sul file probabilmente lo aprirai nel tuo browser usando un indirizzo come:

file://C:/path/to/my/file.php

Ciò ignora completamente qualsiasi server Web che è possibile eseguire e il file non viene interpretato. Devi visitare l'URL del file sul tuo server web, probabilmente qualcosa come:

http://localhost/my/file.php

Potresti anche voler controllare se stai usando tag aperti brevi <?invece di <?phpe la tua configurazione di PHP ha disattivato i tag aperti.

Vedi anche che il codice PHP non viene eseguito, invece mostra codice sulla pagina


Non si vede nulla La pagina è vuota e bianca.

Conosciuto anche come White Page Of Death o White Screen Of Death . Ciò si verifica quando la segnalazione degli errori viene disattivata e si verifica un errore irreversibile (spesso errore di sintassi).

Se hai attivato la registrazione degli errori, troverai il messaggio di errore concreto nel tuo log degli errori. Questo di solito si trova in un file chiamato "php_errors.log", in una posizione centrale (ad es. /var/log/apache2 in molti ambienti Linux) o nella directory dello script stesso (a volte usato in un ambiente di hosting condiviso).

A volte potrebbe essere più semplice abilitare temporaneamente la visualizzazione degli errori. La pagina bianca mostrerà quindi il messaggio di errore. Fai attenzione perché questi errori sono visibili a tutti coloro che visitano il sito.

Questo può essere fatto facilmente aggiungendo all'inizio dello script il seguente codice PHP:

ini_set('display_errors', 1); error_reporting(~0);

Il codice attiva la visualizzazione degli errori e imposta la segnalazione al livello più alto.

Poiché ini_set() viene eseguito in fase di runtime, non ha effetti sugli errori di analisi / sintassi. Questi errori appariranno nel registro. Se si desidera visualizzarli anche nell'output (ad esempio in un browser), è necessario impostare la direttiva display_startup_errors su true . Fai ciò nel php.ini o in un .htaccess o in qualsiasi altro metodo che influisce sulla configurazione prima del runtime .

È possibile utilizzare gli stessi metodi per impostare le direttive log_errors e error_log per scegliere la propria posizione del file di registro.

Guardando nel registro o utilizzando il display, otterrete un messaggio di errore molto migliore e la linea di codice in cui il vostro script si ferma.

Domande correlate:

Errori correlati:


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

Errore irreversibile: chiamata alla funzione non definita XXX

Accade quando si tenta di chiamare una funzione che non è ancora stata definita. Le cause comuni includono estensioni mancanti e includono, dichiarazione di funzione condizionale, funzione nella dichiarazione di funzione o errori di battitura semplici.

Esempio 1 - Dichiarazione di funzione condizionale

$someCondition = false;
if ($someCondition === true) {
    function fn() {
        return 1;
    }
}
echo fn(); // triggers error

In questo caso, fn() non verrà mai dichiarato perché $someCondition non è true.

Esempio 2 - Funzione nella dichiarazione di funzione

function createFn() 
{
    function fn() {
        return 1;
    }
}
echo fn(); // triggers error

In questo caso, fn verrà dichiarato solo quando viene richiamato createFn() . Si noti che le successive chiamate a createFn() attiveranno un errore sulla Redeclaration di una funzione esistente.

Si può anche vedere questo per una funzione integrata di PHP. Prova a cercare la funzione nel manuale ufficiale e controlla quale "estensione" (modulo PHP) a cui appartiene, e quali versioni di PHP lo supportano.

In caso di un'estensione mancante, installa l'estensione e attivala in php.ini. Fai riferimento alle Istruzioni di installazione nel manuale PHP per l'estensione in cui la tua funzione appare. Potresti anche essere in grado di abilitare o installare l'estensione usando il tuo gestore di pacchetti (ad esempio apt in Debian o Ubuntu, yum in Red Hat o CentOS), o pannello di controllo in un ambiente di hosting condiviso.

Se la funzione è stata introdotta in una versione più recente di PHP da quello che stai utilizzando, potresti trovare collegamenti a implementazioni alternative nel manuale o nella sua sezione commenti. Se è stato rimosso da PHP, cerca informazioni sul perché, poiché potrebbe non essere più necessario.

In caso di mancanze include, assicurarsi di includere il file che dichiara la funzione prima di chiamare la funzione.

In caso di errori di battitura, correggere l'errore di battitura.

Domande correlate:

  • https://.com/search?q=Fatal+error%3A+Call+to+undefined+function

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:


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:


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, imprevisto '['

Questo errore si presenta in due variatori:

Variazione 1

$arr = [1, 2, 3];

Questa sintassi di inizializzatore di array è stata introdotta solo in PHP 5.4; prima genererebbe un errore di parser. Se possibile, aggiorna la tua installazione o usa la vecchia sintassi:

$arr = array(1, 2, 3);

Vedi anche questo esempio dal manuale.

Variazione 2

$suffix = explode(',', 'foo,bar')[1];

Anche i risultati della funzione di dereferenziazione delle mire sono stati introdotti in PHP 5.4. Se non è possibile eseguire l'upgrade, è necessario utilizzare una variabile (temporanea):

$parts = explode(',', 'foo,bar');
$suffix = $parts[1];

Vedi anche questo esempio dal manuale.


Avviso: matrice per la conversione delle stringhe

Questo succede semplicemente se si tenta di trattare un array come una stringa:

$arr = array('foo', 'bar');

echo $arr;  // Notice: Array to string conversion
$str = 'Something, ' . $arr;  // Notice: Array to string conversion

Un array non può essere semplicemente echo"d" o concatenato con una stringa, perché il risultato non è ben definito. PHP utilizzerà la stringa "Array" al posto dell'array e attiverà l'avviso per segnalare che probabilmente non è ciò che era previsto e che dovresti controllare il tuo codice qui. Probabilmente vorresti qualcosa come questo:

echo $arr[0];  // displays foo
$str = 'Something ' . join(', ', $arr); //displays Something, foo, bar

Oppure fai un loop dell'array:

foreach($arr as $key => $value) {
    echo "array $key = $value";
    // displays first: array 0 = foo
    // displays next:  array 1 = bar
}

Se questo avviso appare da qualche parte che non ti aspetti, significa una variabile che pensavi essere una stringa in realtà una matrice. Ciò significa che hai un bug nel codice che rende questa variabile una matrice invece della stringa che ti aspetti.


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


Avviso: uso della costante non definita XXX - presupposto 'XXX'

oppure, in PHP 7.2 o versioni successive:

Attenzione: uso della costante non definita XXX - presupposto 'XXX' (questo genererà un errore in una versione futura di PHP)

Questo avviso si verifica quando un codice viene utilizzato nel codice e sembra essere una costante, ma una costante con quel nome non è definita.

Una delle cause più comuni di questo avviso è la mancata citazione di una stringa utilizzata come chiave di un array associativo.

Per esempio:

// Wrong
echo $array[key];

// Right
echo $array['key'];

Un'altra causa comune è il segno $ (dollaro) mancante davanti al nome di una variabile:

// Wrong
echo varName;

// Right
echo $varName;

O forse hai sbagliato l'ortografia di qualche altra costante o parola chiave:

// Wrong
$foo = fasle;

// Right
$foo = false;

Può anche essere un segno che manca un'estensione o una libreria PHP necessaria quando si tenta di accedere a una costante definita da tale libreria.

Domande correlate:


Standard rigorosi: il metodo non statico [<class> :: <method>] non dovrebbe essere chiamato staticamente

Si verifica quando provi a chiamare un metodo non statico su una classe come statico e hai anche il E_STRICTflag nelle error_reporting()impostazioni.

Esempio :

class HTML {
   public function br() {
      echo '<br>';
   }
}

HTML::br() o $html::br()

Si può effettivamente evitare questo errore non aggiungendo E_STRICTa error_reporting(), ad esempio,

error_reporting(E_ALL & ~E_STRICT);

dato che per PHP 5.4.0 e versioni successive, E_STRICTè incluso in E_ALL[ ref ]. Ma questo non è auspicabile. La soluzione è definire la funzione statica prevista come effettiva static:

public static function br() {
  echo '<br>';
}

o chiamare la funzione convenzionalmente:

$html = new HTML();
$html->br();

Domande correlate :


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:


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?

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

Errore di analisi: errore di sintassi, T_PAAMAYIM_NEKUDOTAYIM inatteso

L'operatore di risoluzione scope è anche chiamato "Paamayim Nekudotayim" dall'ebraico פעמיים נקודתיים. che significa "doppio punto" o "doppio punto due volte".

Questo errore si verifica in genere se si inserisce inavvertitamente :: nel proprio codice.

Domande correlate:

Documentazione:


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

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:


Attenzione: mysql_fetch_array () si aspetta che il parametro 1 sia risorsa, dato booleano

Innanzitutto:

Per favore, non usare le funzioni mysql_* nel nuovo codice . Non sono più mantenuti e sono ufficialmente deprecati . Vedi la scatola rossa ? Scopri invece le istruzioni preparate e usa PDO o MySQLi : questo articolo ti aiuterà a decidere quale. Se scegli PDO, ecco un buon tutorial .

Questo accade quando si tenta di recuperare i dati dal risultato di mysql_query ma la query non è riuscita.

Questo è un avvertimento e non fermerà la sceneggiatura, ma renderà il tuo programma sbagliato.

Devi controllare il risultato restituito da mysql_query di

$res = mysql_query($sql);
if (!$res) {
   die(mysql_error());
}
// after checking, do the fetch

Domande correlate:

Errori correlati:

Altre funzioni di mysql* che prevedono anche una risorsa risultato mysql come parametro genereranno lo stesso errore per lo stesso motivo.


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 tanti 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: impossibile utilizzare il valore restituito dalla funzione nel contesto di scrittura

Questo di solito accade quando si usa una funzione direttamente con empty .

Esempio:

if (empty(is_null(null))) {
  echo 'empty';
}

Questo perché empty è un costrutto linguistico e non una funzione, non può essere chiamato con un'espressione come argomento nelle versioni di PHP precedenti alla 5.5. Prima di PHP 5.5, l'argomento per empty() deve essere una variabile , ma un'espressione arbitraria (come un valore di ritorno di una funzione) è consentita in PHP 5.5+.

empty , nonostante il suo nome, in realtà non controlla se una variabile è "vuota". Invece, controlla se una variabile non esiste o == false . Le espressioni (come is_null(null) nell'esempio) saranno sempre considerate come esistenti, quindi qui empty controlla solo se è uguale a false. Puoi sostituire empty() qui con ! Ad esempio, if (!is_null(null)) o esplicitamente confrontato con false, ad es. if (is_null(null) == false) .

Domande correlate:


Inoltre, per un elemento denominato:

unset($array["elementName"]);







php mysql debugging warnings