警告:mysql_query():3不是有效的MySQL-Link资源

时间:2010-05-17 17:51:56

标签: php mysql

我得到了这个奇怪的错误,我无法弄清楚它来自哪里:

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

3有什么用?我不明白。有没有人自己经历过这个错误?

4 个答案:

答案 0 :(得分:31)

PHP使用资源作为特殊变量来保存指向外部对象的链接,例如文件和数据库连接。每个资源都有一个整数id。 (Documentation

连接失败

如果数据库连接失败,你可能会得到一个“指定的变量不是一个有效的MySQL-Link资源”错误,正如Dan Breen所提到的那样,因为应该保存该资源的变量为空。

$link = mysql_connect('localsoth','baduser','badpass'); // failed connection
$result = mysql_query("SELECT 1", $link); // throws error

由于您在错误消息中获得了特定的资源ID,因此数据库连接可能由于某种原因意外关闭。您的程序仍然具有带有资源ID的变量,但外部对象不再存在。这个可能是由于在调用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()的问题是默认情况下,如果在连续调用中传递相同的参数,它将重用现有连接而不是创建新连接(Documentation) 。这可以通过将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

编辑:
另外,如果可能的话,我建议使用MySQLi扩展名或PDO。 MySQL扩展已经很老了,无法利用MySQL 4.1.3之后的任何功能。请查看http://www.php.net/manual/en/mysqli.overview.php以获取有关三个接口之间差异的一些详细信息。

答案 1 :(得分:6)

我也有这个问题。在检查我的代码时,我发现我有一个关闭连接的脚本,所以当php试图再次关闭它时,我们得到了错误。

要解决此问题,请在尝试关闭连接之前检查连接是否已打开:

而不是:

mysql_close($con);

这样做:

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

答案 2 :(得分:4)

我在一分钟之前就遇到了这个错误,那是因为我包含了一个我的数据库连接文件,它在底部有一个紧密的连接功能。摆脱你的亲密关系,你的没事!

答案 3 :(得分:1)

听起来您在尝试连接数据库时可能会收到错误,而mysql句柄实际上并不是有效的连接。如果您发布更多代码,例如您如何连接到数据库,那将更有帮助。确保你也检查错误。