sql >> Databasteknik >  >> RDS >> Mysql

Varning:mysql_query():3 är inte en giltig MySQL-länkresurs

PHP använder resurser som en speciell variabel för att hålla länkar till externa objekt, såsom filer och databasanslutningar. Varje resurs ges ett heltals-id. (Dokumentation )

Misslyckade anslutningar

Om databasanslutningen misslyckas kommer du sannolikt att få felet "Specificerad variabel är inte en giltig MySQL-Link-resurs", som Dan Breen nämnde, eftersom variabeln som ska innehålla resursen är null.

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

Eftersom du får ett specifikt resurs-ID i felmeddelandet stängdes troligen databasanslutningen oväntat av någon anledning. Ditt program har fortfarande en variabel med ett resurs-ID, men det externa objektet finns inte längre. Detta kan bero på en mysql_close() ring någonstans före anropet till mysql_query , eller ett externt databasfel som stängde anslutningen.

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

Återanvända anslutningar

Ett problem med mysql-tillägget och mysql_connect() är att om du skickar samma parametrar i på varandra följande anrop, kommer den som standard att återanvända den befintliga anslutningen istället för att skapa en ny (Dokumentation ). Detta kan åtgärdas genom att skicka true till $new_link parameter.
Jag stötte på detta själv i ett testsystem där data från två separata databaser i produktion kombinerades på en testserver, och vid testning av mysql_xxx() funktionsanrop gick över varandra och bröt systemet.

$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

Använder $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

Edit:
Som en åtskillnad skulle jag rekommendera att du använder MySQLi tillägg eller PDO istället, om möjligt. MySQL-tillägget börjar bli ganska gammalt och kan inte dra nytta av några funktioner efter MySQL version 4.1.3. Titta på http://www.php.net/manual/en/mysqli .overview.php för några detaljer om skillnaderna mellan de tre gränssnitten.



  1. Hur använder jag ROW_NUMBER()?

  2. Bring Your Own Cloud (BYOC) vs. Dedicated Hosting på ScaleGrid

  3. Hur man pausar exekveringen av ett uttalande i PostgreSQL

  4. Hur man ser vilken Postgres-version som körs