【问题标题】:mysql_close(): supplied argument is not a valid MySQL-Link resourcemysql_close():提供的参数不是有效的 MySQL-Link 资源
【发布时间】:2011-01-14 22:50:15
【问题描述】:

我正在尝试使用自定义会话处理程序将会话数据存储在 MySQL 数据库中。但是,我不断收到以下警告:

mysql_close(): supplied argument is not a valid MySQL-Link resource

这是我正在使用的代码,我从 here 获得的:

function _open(){

    global $_sess_db;
    $_sess_db = mysql_connect("localhost", "root", "******");
    if ($_sess_db) {
        return mysql_select_db('style', $_sess_db);
    }
    return false;
}

function _close(){
    global $_sess_db;
    return mysql_close($_sess_db); //error happens here
}

错误信息的全文最终指向最终的“return mysql_close($_sess_db);”线。我可以确认 mysql_connect 信息确实有效,并且我也定义了其余的会话处理函数。

如果有帮助,我会在页面加载后立即收到这些错误,而无需实际调用任何会话处理程序函数,也无需打开任何当前会话。


【问题讨论】:

    标签: php mysql


    【解决方案1】:

    问题是你的变量范围。如果变量不是首先在函数之外定义的,那么 global 关键字什么也不做。另一种方法是使用超级全局 $GLOBALS['_sess_db'],或者首先在任何函数之外定义 $_sess_db。

    【讨论】:

    • 最重要的是,如果您不使用多个数据库,则可能不需要指定要关闭的数据库连接,因为如果没有传递参数,它会自动关闭最后打开的连接。
    • 另外,非持久数据库连接会在脚本结束时自动关闭,因此根据您的项目,甚至可能不需要关闭数据库连接。
    • 是的,变量范围是问题所在。我不再收到该错误。但是,在开始会话后,我尝试执行 $_SESSION['uid'] = 4。但我根本没有看到这反映在数据库中。由于我已经定义了一个 session_write 函数,该自定义函数应该被用于 $_SESSION['uid'] = ... 对吗?在这种情况下,问题出在我的自定义处理函数中吗?
    • 我的意思是我什至不明白。为什么要将会话变量放入数据库?会话变量会自动为该用户请求的下一页保存,并将在会话期间保持保存。如果您想将某些内容放入数据库,只需将其放入数据库中即可,而无需涉及会话。你想完成什么?
    • 我的理解是,将会话会话变量保存在数据库中是最安全的方法;否则,您必须将变量保存在用户计算机上的文件中,无论是 cookie 还是其他类型的文件。而这反过来又使数据更容易受到攻击。显然,我需要(并计划)阅读更多关于 PHP 安全性的内容,但我认为这是最好的方法。如果您有任何阅读建议,我将不胜感激:)
    【解决方案2】:

    尝试在 _open() 和 _close() 中添加一些调试打印输出,看看它们是否在您不期望的时候被调用。

    【讨论】:

    • 我想我不确定他们什么时候应该被调用。每次页面加载时不应该自动调用它们吗?这就是正在发生的事情。换句话说,我没有调用 session_start(),并且不存在之前的会话。
    • 另外,我没有在 php.ini 文件中将会话设置为自动启动。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    相关资源
    最近更新 更多