Подтвердить что ты не робот

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

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

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

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

4b9b3361

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

Ответ 2

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

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

вместо:

mysql_close($con);

Сделайте это:

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

Ответ 3

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

Ответ 4

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