sql >> Databáze >  >> RDS >> Mysql

Upozornění:mysql_query():3 není platný prostředek MySQL-Link

PHP používá prostředky jako speciální proměnnou k uchování odkazů na externí objekty, jako jsou soubory a databázová připojení. Každému prostředku je přiděleno celé číslo. (Dokumentace )

Selhání připojení

Pokud se připojení k databázi nezdaří, pravděpodobně se zobrazí chyba „Specifikovaná proměnná není platným zdrojem MySQL-Link“, jak zmínil Dan Breen, protože proměnná, která má zdroj uchovávat, je nulová.

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

Protože se v chybové zprávě zobrazuje konkrétní ID prostředku, připojení k databázi se pravděpodobně z nějakého důvodu neočekávaně uzavřelo. Váš program má stále proměnnou s ID prostředku, ale externí objekt již neexistuje. To může být způsobeno mysql_close() zavolejte někde před voláním mysql_query nebo chyba externí databáze, která ukončila připojení.

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

Opětovné použití připojení

Problém s rozšířením mysql a mysql_connect() je, že ve výchozím nastavení, pokud předáte stejné parametry v po sobě jdoucích voláních, bude znovu používat stávající připojení, nikoli vytvořit nové (Dokumentace ). To lze opravit předáním true na $new_link
Sám jsem se s tím setkal na testovacím systému, kde byla data ze dvou samostatných databází ve výrobě kombinována na jeden testovací server a při testování mysql_xxx() volání funkcí přecházela jedna přes druhou a rozbila systém.

$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

Pomocí $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:
Jakmile bych doporučil použít MySQLi rozšíření nebo CHOP místo toho, pokud je to možné. Rozšíření MySQL je dost staré a nemůže využívat žádné funkce starší verze MySQL 4.1.3. Podívejte se na http://www.php.net/manual/en/mysqli .overview.php pro některé podrobnosti o rozdílech mezi těmito třemi rozhraními.



  1. Co je to sakra DTU?

  2. Problémy s porovnáním MySQL s pohyblivou řádovou čárkou

  3. Jak mohu převést SQL Server 2008 DateTimeOffset na DateTime

  4. JSON_QUERY() vs JSON_VALUE() v SQL Server:Jaký je rozdíl?