class Mysql {
    private $link;
    private $dbcharset = "utf8";
    private $tablepre = "hsh_";    
    function __construct($dbhost,$dbuser,$dbpass,$dbname,$dbchar,$tablepre){
        $this->doConnect($dbhost,$dbuser,$dbpass,$dbname);
        $this->dbcharset =  $dbchar;
        $this->tablepre = $tablepre;
    }    
    private function doConnect($dbhost,$dbuser,$dbpass,$dbname){
        $this->link = @mysql_connect($dbhost,$dbuser,$dbpass) or halt("Can\'t Connect MySQL Server (".$dbhost.")!");
        $this->doSelect($dbname);
    }    
    private function doSelect($dbname){
        mysql_select_db($dbname,$this->link) or halt("Can\'t select MySQL database ($dbname)!");
        $this->doCharset();
    }    
    private function doCharset(){
        mysql_query("SET NAMES ".$this->dbcharset."");
    }    
    public function doQuery($sql,$type=""){
        if($this->tablepre !== "ews_"){
            $sql = str_replace("ews_",$this->tablepre,$sql);
        }
        return mysql_query($sql,$this->link);
    }
        //释放当前类所占用的内存并关闭当前数据连接
    function __destruct(){
        @mysql_free_result();
        @mysql_close($this->link);
    }
}
这个是自己写的自用的mysql类,在windows系统中运行一切正常,可是当放到freebsd系统中的时候,每次很快就会自动销毁资源集,每次查询出来的结果,不是空数组就是没有类型的资源而当我将 @mysql_close($this->link);这句注销后,发现资源就正常了。。读出的结果集也正常了。。求助:我将mysql_close放到析构函数中是不是不对?

解决方案 »

  1.   

    mysql_close一般没有必要使用,因为在脚本结束的时候会自动的断开
    除非你使用永久性mysql_pconnect打开数据库。
      

  2.   

    呵呵,感谢楼上朋友,不过我还有点疑问,既然这个和数据库有关,那怎么不同的windows和freebsd系统却不同呢?
      

  3.   

    不太清楚freebsd上的机制,可能和web server有关系,windows和freebsd的web server都是apache吗?
      

  4.   

    mysql_free_result的参数应该是必须的
      

  5.   

    不要使用mysql_connect进行连接MYSQL了,太老了,使用PDO吧,以后基本全是PDO了。
    如果练习的话就不说什么了。
    还有,做个getInstances方法做个单模,通用性好,以后换JAVA语言也用得上。
      

  6.   

    你是不是一个页面实例化两次以上Mysql了
    注意一个问题
            $this->link = @mysql_connect($dbhost,$dbuser,$dbpass) or halt("Can\'t Connect MySQL Server (".$dbhost.")!");
    这句,mysql_connect的第4个参数,补上一个true试下。
      

  7.   


    PDO用着感觉不如自己写的mysql类简单明了。主要是他自身的很多方法太固定了。可能是我了解不多吧
      

  8.   


    你的方法我试试看,但是任谁不可能在同一个页面实例化2次mysql的啊。实例化后直接赋值,以后直接调用变量要比再实例化一次更合理很简单呀
      

  9.   

    要看你的code.另: $this->dbcharset =  $dbchar; 这句应该放在connect前面,
    否则你那句mysql_query("SET NAMES ".$this->dbcharset."");永远都用的缺省值
      

  10.   


    $this->dbcharset =  $dbchar;
            $this->tablepre = $tablepre;
    这两句都应该往前放了,本地的改了,发帖的时候复制的是另外一贴的,不管怎样,谢谢提醒。
      

  11.   

    应该说是 BUG 
    查看你的php版本,并检查其后的版本中是否有对这一bug的修正
    重新编译较新的、小版本号为偶数的php
    不建议使用最新版本的php,因为总是要出一点毛病
      

  12.   


    用的是php5.2.6,和本地windows系统下的php是一样的。。
    本地没问题的。
      

  13.   

    你的mysql_fetch_array从哪里写的阿?不在数据库类里?如果放在外面就可能出错了阿。
      

  14.   

    mysql_connect的第四个参数省略时,返回的是上一次连接的资源号,如果你关闭一个实例时,可能会关闭所有连接
      

  15.   


    mysql_fecth_array是在我新写的一个方法里写的,我把方法贴出来:public function getOne($sql,$result_type=MYSQL_ASSOC){
    $result = $this->doQuery($sql);
    $row=mysql_fetch_array($this->doQuery($sql),$result_type);
    return $row;
    }
      

  16.   


    我在全站的唯一入口处:@require_once(CLS_DIR."./mysql.class.php");$db = new Mysql($dbhost,$dbuser,$dbpass,$dbname,$dbcharset,$tablepre);//获取系统参数$sql = "SELECT * FROM `hsh_setting`";
    $cfg = $db->getOne($sql);
    getone方法见楼上然后我在页面中随时都直接使用变量$db去调用方法。
      

  17.   

    唯一入口怎么理解?
    每个页面都new Mysql 还是自始至终只new一次Mysql?
      

  18.   


    靠php自己断开确实是很可靠的,可是问题是咱们自己写在析构函数里,从逻辑上来说,我觉得自己写上更合理。
      

  19.   

    每个页面在需要用到db的时候 都new Mysql一次  应该不会有问题的
      

  20.   

    在windows系统中运行一切正常,可是当放到freebsd系统中出问题你们说是代码问题还是环境问题!?请使用 freebsd + php5.2.6 的朋友测试一下楼主的代码
      

  21.   

    先回答25楼:就是每个模块都是通过index.php这个文件的不同参数来调用的,再回答27楼:在初始化这个index.php这个文件的时候,先实例化mysql,然后赋值给$db,后面的代码直接用$db来调用该类里的方法。
      

  22.   

    只要不涉及文件名的代码,在任何一个环境中调试通过就可认为没有问题了freebsd 是时分多路操作系统,在切换用户进程时出点毛病是正常的