检查MySQL连接(面向对象PHP)

3

我的代码中有些部分需要检查是否已经建立了mysql连接。下面的代码使用了if(self::$connection),但是self::connection似乎总是返回"Resource id #6"而不是布尔值——我做错了什么?

class mysql_lib{
    static $connection;     

    static function connect($user = FALSE){     
        if(!$user){
            $user = 'mr_update';
        }
        $password = 'some_password';
        self::$connection = mysql_connect('localhost', $user, $password, TRUE);
        mysql_select_db('codlife_headfirst2');      
    }

    static function disconnect(){
        mysql_close(self::$connection);
    }

    static function mres($str){
        if(!self::$connection){
            self::connect('mres');
            $str = mysql_real_escape_string($str);
            mysql_close(self::$connection); 
        }
        else{
            $str = mysql_real_escape_string($str);
        }
        return $str;
    }
...

感谢!


我的解决方案:在断开连接时将$connection重新设置为false...

static function disconnect(){
    mysql_close(self::$connection);
    self::$connection = FALSE;
}
3个回答

3
只需使用 mysql_ping() 方法。
此方法用于检查与服务器的连接是否正常。如果连接已断开,则会尝试自动重新连接。这个函数可以被空闲了很长时间的脚本使用,以检查服务器是否已关闭连接并在必要时重新连接。
如果与 MySQL 服务器的连接正常工作,则返回 TRUE,否则返回 FALSE。
static function isActive() {
   return mysql_ping($connection);//returns boolean
}

同一个问题,我写或访问$connection的方式肯定有问题。 - Haroldo
请注意,自动重新连接将不带任何参数进行,因此在 OP 的情况下,如果它成功连接,它将无法连接到正确的数据库。 - Scott Saunders
问题肯定与“资源ID#6”有关吧? - Haroldo

0

mysql_connect会返回一个资源,所以这是正确的。不要让这个抛出你。看起来一切都应该正常工作。还有其他问题吗?

更多信息:

mysql_connect()在成功时返回MySQL链接标识符,失败时返回FALSE。因此,如果没有进行连接尝试,则$connection变量将为null(评估为false)。如果连接尝试失败,则它将为false。如果成功建立连接,则$connection将是一个“MySQL链接标识符”,它将被评估为true。如果您尝试回显或打印“MySQL链接标识符”,它将打印类似于“Resource ID#6”的内容。这就是它应该做的。


我对面向对象编程还比较新,所以我想也许我在存储/引用$connection的方式上犯了错误? - Haroldo
我的if(!self::$connection)总是返回true,因为资源ID#6 - 你确定$connection不应该是布尔值吗? - Haroldo
发现问题了,请查看我的修改后的查询。 - Haroldo
很好的发现!不过,PHP脚本的生命周期通常非常短,因此在脚本结束之前没有太多理由断开连接。而且PHP会在脚本结束时自动断开连接。在请求之间,没有任何PHP代码(包括静态内容)会保持活动状态(在正常脚本中)。这对于解决这个问题没有影响,但在编码和学习面向对象编程时可能需要记住这一点。 - Scott Saunders
谢谢Scott,断开连接的原因是出于安全考虑——不同的用户具有不同的权限。例如,脚本可能会触发if($logged_id),然后可能需要升级到具有DELETE权限的连接...这听起来合理吗? - Haroldo
显示剩余3条评论

0

我找到了解决方案,请参见上面更新的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接