Я получил эту странную ошибку, и я не могу понять, откуда она взялась:
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 на самом деле не является действительным соединением. Если вы разместите больше кода, например, как вы подключаетесь к базе данных, это будет более полезно. Убедитесь, что вы также проверяете ошибки.