Предупреждение: mysql_query (): 3 не является допустимым ресурсом MySQL-Link

Я получил эту странную ошибку, и я не могу понять, откуда она взялась:

Warning: mysql_query(): 3 is not a valid MySQL-Link resource in (...)

Что случилось с 3? Я не понимаю. Кто-нибудь испытал эту ошибку?

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() функции 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 подробную информацию о различиях между тремя интерфейсами.

У меня также была эта проблема. Изучая мой код, я обнаружил, что у меня есть сценарий, который закрыл соединение, поэтому, когда php попытался закрыть его, мы получили ошибку.

Чтобы решить эту проблему, просто проверьте, открыто ли соединение, прежде чем пытаться закрыть его:

вместо:

 mysql_close($con); 

Сделай это:

 if( gettype($con) == "resource") { mysql_close($con); } 

У меня была эта ошибка всего минуту назад, это потому, что я включал файл подключения к базе данных, у которого была плохая функция соединения внизу. Избавьтесь от вашей близкой связи, и все будет в порядке!

Похоже, что вы можете получить сообщение об ошибке при попытке подключиться к базе данных, а дескриптор mysql на самом деле не является действительным соединением. Если вы разместите больше кода, например, как вы подключаетесь к базе данных, это будет более полезно. Убедитесь, что вы также проверяете ошибки.