【问题标题】:Warning: mysql_query(): 3 is not a valid MySQL-Link resource警告:mysql_query(): 3 不是有效的 MySQL-Link 资源
【发布时间】:2012-09-27 21:44:13
【问题描述】:

我收到了这个奇怪的错误,我不知道它是从哪里来的:

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

3 怎么了?我不明白。有没有人自己遇到过这个错误?

【问题讨论】:

  • 在旧应用程序上“修复”此类问题后,我认为显示一些代码不会有帮助。由于 PHP mysql 库“工作”的方式,很难发现问题。尤其是意大利面!

标签: php mysql


【解决方案1】:

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_query 之前某处的mysql_close() 调用,或者是关闭连接的外部数据库错误。

$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 了解这三个接口的区别的一些细节。

【讨论】:

  • 啊哈!我网站上的大多数页面都包含多个包含 MySQL 连接文件的文件,因此如您的帖子中所述出现了冲突。我通过将 MySQL 连接放在页眉中并将连接关闭语句放在页脚中来解决它。
  • 感谢提及$new_link 参数。我有一个守护进程正在运行,它在子进程之间使用共享 mysql 连接(这会破坏东西),所以我需要断开我的连接并在每个子进程中重新建立它,而不是在子进程之间共享连接。原来它仍在重用已被破坏的连接 ID,所以我收到了 not a valid MySQL-Link resource 错误。
  • @gapple 正如你提到的 mysql_close() 是我的问题,因为它在 query 之上。不知道我花了很多时间在谷歌上搜索原因,而你的帖子救了我。非常感谢朋友
【解决方案2】:

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

要解决这个问题,只需在尝试关闭连接之前检查连接是否打开:

代替:

mysql_close($con);

这样做:

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

【讨论】:

    【解决方案3】:

    一分钟前我遇到了这个错误,这是因为我包含了一个我的数据库连接文件,该文件在底部有一个关闭连接功能。摆脱你的密切联系,你会没事的!

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2013-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-02
        • 1970-01-01
        • 1970-01-01
        • 2011-09-22
        相关资源
        最近更新 更多