PHP използва ресурси като специална променлива за поддържане на връзки към външни обекти, като файлове и връзки към базата данни. На всеки ресурс се дава целочислен идентификатор. (Документация )
Неуспешни връзки
Ако връзката с базата данни не успее, вероятно ще получите грешка „Посочената променлива не е валиден ресурс на MySQL-Link“, както спомена Дан Брийн, тъй като променливата, която трябва да държи ресурса, е нула.
$link = mysql_connect('localsoth','baduser','badpass'); // failed connection
$result = mysql_query("SELECT 1", $link); // throws error
Тъй като получавате конкретен идентификатор на ресурс в съобщението за грешка, връзката с базата данни вероятно е затворена неочаквано по някаква причина. Вашата програма все още има променлива с идентификатор на ресурса, но външният обект вече не съществува. Това може се дължи на mysql_close()
обадете се някъде преди извикването на mysql_query
, или грешка във външна база данни, която затвори връзката.
$link = mysql_connect();
mysql_close($link);
// $link may still contain a resource identifier, but the external object is gone
mysql_query("SELECT 1", $link);
Повторно използване на връзки
Проблем с разширението mysql и mysql_connect()
е, че по подразбиране, ако подадете същите параметри в последователни повиквания, тя ще използва повторно съществуващата връзка, вместо да създава нова (Документация
). Това може да се поправи чрез подаване на true
към $new_link
параметър.
Лично аз се сблъсках с това в тестова система, където данните от две отделни бази данни в производството бяха комбинирани на един тестов сървър и при тестване на mysql_xxx()
извикванията на функции преминаха един през друг и счупиха системата.
$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
Използване на $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
Редактиране:
Като настрана бих препоръчал използването на MySQLi разширение или PDO
вместо това, ако е възможно. Разширението MySQL става доста остаряло и не може да се възползва от функции след MySQL версия 4.1.3. Вижте http://www.php.net/manual/en/mysqli .overview.php
за някои подробности относно разликите между трите интерфейса.