Я получил эту странную ошибку, и я не могу понять, откуда она взялась:
Warning: mysql_query(): 3 is not a valid MySQL-Link resource in (...)
Что с 3? Я не понимаю. Кто-нибудь испытал эту ошибку самостоятельно?
Я получил эту странную ошибку, и я не могу понять, откуда она взялась:
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()
проходили друг над другом и разбивали систему.
$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 для получения подробной информации о различиях между тремя интерфейсами.
У меня также была эта проблема. Изучая мой код, я обнаружил, что я включил script, который закрыл соединение, поэтому, когда php попытался закрыть его снова, мы получили ошибку.
Чтобы решить эту проблему, просто проверьте, открыто ли соединение, прежде чем пытаться ее закрыть:
вместо:
mysql_close($con);
Сделайте это:
if( gettype($con) == "resource") {
mysql_close($con);
}
У меня была эта ошибка всего минуту назад, потому что я включал файл подключения к базе данных, у которого была плохая функция соединения внизу. Избавьтесь от вашей близкой связи, и все будет в порядке!
Похоже, вы можете получить сообщение об ошибке при попытке подключиться к базе данных, а дескриптор mysql на самом деле не является действительным соединением. Если вы разместите больше кода, например, как вы подключаетесь к базе данных, это будет более полезно. Убедитесь, что вы также проверяете ошибки.