php example - Attenzione:mysql_query():3 non è una risorsa MySQL-Link valida




connect mysqli (5)

Ho avuto questo errore strano e non riesco a capire da dove provenga:

Warning: mysql_query(): 3 is not a valid MySQL-Link resource in (...)

Cosa succede con il 3? Non capisco Qualcuno ha avuto questo errore da solo?


Answers

Sembra che potresti avere un errore durante il tentativo di connessione al database e l'handle mysql non è in realtà una connessione valida. Se pubblichi più codice, come il modo in cui ti colleghi al database, sarebbe più utile. Assicurati di controllare anche gli errori.


Ho anche avuto questo problema. Nell'esaminare il mio codice ho trovato un inclusivo di uno script che ha chiuso la connessione, quindi quando php ha provato a chiuderlo di nuovo, abbiamo ricevuto l'errore.

Per risolvere questo, basta controllare se la connessione è aperta prima di provare a chiuderla:

invece di:

mysql_close($con);

Fai questo:

if( gettype($con) == "resource") {
    mysql_close($con);
}

Ho avuto questo errore solo un minuto fa, perché stavo includendo un file di connessione al mio database che aveva una funzione di connessione chiusa in basso. Sbarazzati della tua stretta connessione e stai bene!


PHP utilizza le risorse come variabile speciale per contenere i collegamenti a oggetti esterni, come i file e le connessioni al database. Ad ogni risorsa viene assegnato un ID intero. ( Documentation )

Collegamenti falliti

Se la connessione al database fallisce probabilmente otterrai un errore "La variabile specificata non è una risorsa valida MySQL-Link", come ha detto Dan Breen, poiché la variabile che dovrebbe contenere la risorsa è nullo.

$link = mysql_connect('localsoth','baduser','badpass'); // failed connection
$result = mysql_query("SELECT 1", $link); // throws error

Poiché nel messaggio di errore viene visualizzato un ID risorsa specifico, la connessione al database si è chiusa inaspettatamente per qualche motivo. Il tuo programma ha ancora una variabile con un ID risorsa, ma l'oggetto esterno non esiste più. Ciò potrebbe essere dovuto a una chiamata mysql_close() da qualche parte prima della chiamata a mysql_query o a un errore di database esterno che ha chiuso la connessione.

$link = mysql_connect();
mysql_close($link);
// $link may still contain a resource identifier, but the external object is gone
mysql_query("SELECT 1", $link);

Riusare i collegamenti

Un problema con l'estensione mysql e mysql_connect() è che per impostazione predefinita se si passano gli stessi parametri nelle chiamate successive, verrà riutilizzata la connessione esistente anziché crearne una nuova ( Documentation ). Questo può essere risolto passando true al parametro $new_link .
L'ho incontrato io stesso su un sistema di test in cui i dati di due database distinti in produzione erano combinati su un server di test, e nel test della funzione mysql_xxx() chiamate camminavano l'una sull'altra e rompevano il sistema.

$link1 = mysql_connect('localhost','user','pass'); // resource id 1 is given
$link2 = mysql_connect('localhost','user','pass'); // resource id 1 is given again
mysql_close($link2); // the connection at resource id 1 is closed
mysql_query("SELECT 1", $link1); // will fail, since the connection was closed

Usando $new_link :

$link1 = mysql_connect('localhost','user','pass'); // resource id 1 is given
$link2 = mysql_connect('localhost','user','pass', true); // resource id 2 is given
mysql_close($link2); // the connection at resource id 2 is closed
mysql_query("SELECT 1", $link1); // the connection at resource id 1 is still open

Modificare:
Per inciso, consiglierei di usare l'estensione MySQLi o PDO , se possibile. L'estensione MySQL sta diventando piuttosto vecchia, e non può sfruttare alcuna funzione oltre la versione 4.1.3 di MySQL. Guarda http://www.php.net/manual/en/mysqli.overview.php per alcuni dettagli sulle differenze tra le tre interfacce.


Null Coalesce Operator php

L'operatore null coalescing (??) è stato aggiunto a PHP7 per il caso comune di dover usare un ternario in congiunzione con isset (). Restituisce il suo primo operando se esiste e non è NULL altrimenti restituisce il suo secondo operando, come nell'esempio seguente:

$username = $_GET['user'] ?? 'nobody';
// This is equivalent to:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody'; 




php mysql