class DB{
private $host; //服务区地址
private $user; //登录账号
private $pass; //登录密码
private $name; //数据库名称
private $font; //数据库字符集
private $conn; //数据库连接源
private $result; //结果集
private $rowRst; //查询单条记录
private $rowArray=array(); //查询多条记录
private $rowAff; //增改删的记录条数

public  function __construct($host,$user,$pass,$name,$font){
$this->host=$host;
$this->user=$user;
$this->pass=$pass;
$this->name=$name;
$this->font=$font;
$this->init_conn();
}

//连接数据库
private function init_conn(){
if(!$this->conn=mysql_connect($this->host,$this->user,$this->pass)){
exit('数据库连接错误');
}
if(!mysql_select_db($this->name,$this->conn)){
exit('数据库选择错误');
}
if(!mysql_query('SET NAMES '.$this->font)){
exit('字符集错误');
}
}

//执行sql语句
public  function _query($sql){
if(!$this->result=mysql_query($sql,$this->conn)){
exit('sql执行失败');
}
return $this->result;
}

//查询单挑数据
public function _fetch_array($sql){
$this->_query($sql);
$this->rowRst=mysql_fetch_array($this->result,MYSQL_ASSOC);
return $this->rowRst;
}

//查询多条数据
public function _fetch_array_list($sql){
$this->_query($sql);
while (!!$rows=mysql_fetch_array($this->result,MYSQL_ASSOC)){
$this->rowArray[]=$rows;
}
return $this->rowArray;
}

//增改删的影响记录条数
public function _affected_rows(){
$this->rowAff=mysql_affected_rows();
return $this->rowAff;
}

//取得上一步INSERT操作的ID号
public function _insert_id(){
return mysql_insert_id();
}

//释放结果集
public function _free_result(){
$this->rowAff='';
$this->rowArray='';
$this->rowRst='';
mysql_free_result($this->result);
}

//关闭数据库
public function _close_conn(){
$this->_free_result();
mysql_close($this->conn);
}
}
当我用_close_conn这个方法是,网页面显示mysql_free_result():supplied argument is not a valid mysql result resource
如何解决这个问题

解决方案 »

  1.   

    在mysql_free_result($this->result); 之前你先看一下  $this->result 变成什么了。是不是你原先打开的资源
      

  2.   

    while (!!$rows=mysql_fetch_array($this->result,MYSQL_ASSOC)){这是什么? !!这个用法什么作用?
      

  3.   

    mysql_free_result($this->result);  里面的$this->result不是一个有效的结果资源集。你先判断一下试试。if($this->result)  mysql_free_result($this->result); 
      

  4.   

     我在_free_result里加了
    if($this->result){
     mysql_free_result($this->result);
    } else{
     echo '没有结果集了';
    }
    但它还是显示
    mysql_free_result():supplied argument is not a valid mysql result resource
      

  5.   

    if(is_resource($this->result))
    {
         mysql_free_result($this->result);
         $this->result = NULL;
    }
      

  6.   

    用来查询多条数据的,产生一个二维数组,然后用foreach语句来显示多条查询记录。
      

  7.   

    不理解 你为啥写个while(!!) public function _close_conn(){
        var_dump($this->result);// 打印下类型 是不是还是结果集
        $this->_free_result();
        mysql_close($this->conn);
    }
      

  8.   

    还有就是 
    mysql_free_result() 仅需要在考虑到返回很大的结果集时会占用多少内存时调用。在脚本结束后所有关联的内存都会被自动释放。
      

  9.   

    你这样写是对了,但我前面用了_query,_fetch_array,应该产生了结果的,但为什么结果集没有了。是什么原因?
      

  10.   

    你的意思是因为自动释放了,所以this->result不是结果集了,才出的错。
      

  11.   

    恩 你先看看有木有释放掉。我怀疑你while已经用完了。
     public function _close_conn(){
      var_dump($this->result);// 打印下类型 是不是还是结果集
      $this->_free_result();
      mysql_close($this->conn);
    }你先打印一下
      

  12.   

    打印了,显示的事bool(true),那结果集跑那去了,自动释放了吗。
      

  13.   

    while (!!$rows=mysql_fetch_array($this->result,MYSQL_ASSOC)){
    LZ我以前写查询跟你不一样
    我都是 while($row = mysql_fetch_array($this->result,MYSQL_ASSOC)){}
    我不知道你的为啥会出警告。
    因为
    mysql_fetch_array 是一行一行的吧结果集的数据放在数组里然后赋值$row
    当遇到最后一行之后 $row就是空了 while就会停止。不知道你写的!! 是什么原因。
      

  14.   

    不是结果集就是释放完了。你可以测试, while循环的时候不要全部循环完,可以循环几次就跳出,你再去看看是否还是结果集。
      

  15.   

    你的 $this->result 是这样赋值的
    $this->result=mysql_query($sql,$this->conn)mysql_query 只在执行 select 语句时返回的是资源,其他的都是逻辑值所以 mysql_free_result($this->result);
    要写作
    if(is_resource($this->result)) mysql_free_result($this->result);
      

  16.   

    可能是编写软件的原因,我用UE编写的话也不会产生警告,但我用zend studio就会,我查了一下,WHILE里放的应该是布尔值,但$row = mysql_fetch_array并不是布尔值,所以用!!转化为布尔,但有的编写软件可能不理会这个问题吧。
      

  17.   

    哦 这个我还没遇到过。不出问题就行。
    我觉得你还是没有必要 mysql_free_result($this->result);
    除非你是很大很大的结果集。
    反正我在项目中木有用的。
      

  18.   

    经过两位的帮助我终于明白了,我在程序里先是用了查询语句,这时$this->result是结果集,后来我有用了insert语句,这是返回的$this->result的事布尔值,它把前面的$this->result覆盖了,所以我最后释放结果集会出问题,谢谢两位的帮助。
      

  19.   

    只能给你提个建议:将关闭连接语句放在析构函数里面吧。而且 mysql_free_result($this->result); 你在确认一下有无必要,否则你这样程序要多加个判断的。