Ответ 1
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
Edit:
В стороне, я бы рекомендовал использовать расширение MySQLi или PDO вместо этого, если это возможно. Расширение MySQL становится довольно старым и не может использовать какие-либо функции после версии MySQL версии 4.1.3. Посмотрите http://www.php.net/manual/en/mysqli.overview.php для получения подробной информации о различиях между тремя интерфейсами.