Mysql
 sql >> Database >  >> RDS >> Mysql

Avviso:mysql_query():3 non è una risorsa MySQL-Link valida

PHP utilizza le risorse come una variabile speciale per contenere collegamenti a oggetti esterni, come file e connessioni di database. A ciascuna risorsa viene assegnato un ID intero. (Documentazione )

Connessioni fallite

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

$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, è probabile che la connessione al database si sia chiusa in modo imprevisto per qualche motivo. Il tuo programma ha ancora una variabile con un ID risorsa, ma l'oggetto esterno non esiste più. Questo può essere dovuto a un mysql_close() chiama da qualche parte prima della chiamata a mysql_query o un errore del 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);

Riutilizzo delle connessioni

Un problema con l'estensione mysql e mysql_connect() è che per impostazione predefinita se si passano gli stessi parametri in chiamate successive, riutilizzerà la connessione esistente anziché crearne una nuova (Documentazione ). Questo può essere risolto passando true al $new_link parametro.
L'ho riscontrato io stesso su un sistema di test in cui i dati di due database separati in produzione sono stati combinati su un server di test e durante il test di mysql_xxx() le chiamate di funzione si sono incrociate e hanno rotto 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

Modifica:
Per inciso, consiglierei di utilizzare MySQLi estensione o DOP invece, se possibile. L'estensione MySQL sta diventando piuttosto vecchia e non può sfruttare nessuna funzionalità precedente alla 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.