我上次问的执行存储过程错误,帖子如下:
http://topic.csdn.net/u/20091205/10/49a23f64-0a6e-4d56-8487-0a8387514a5d.html
用了如下帖子的方法是解决存储过程执行错误的问题:
http://topic.csdn.net/u/20081028/14/9a76c65d-5889-4ebd-8a5a-194763b4fd5d.html
但是在程序中创建临时表就不能建立成功:mysql_connect($this->host,$this->user,$this->pass,1,131072)or die("数据库连接失败:".mysql_error());//这样可以执行存储过程不报错,但是程序中不能执行创建临时表
mysql_connect($this->host,$this->user,$this->pass)or die("数据库连接失败:".mysql_error());//这样执行存储过程报错,程序能创建临时表
$ctable="CREATE temporary TABLE beyond(
  `mbtype` varchar(30) NOT NULL,
  `mstype` varchar(30) NOT NULL,
  `mname` varchar(200) NOT NULL,
  `mcolor` varchar(200) NOT NULL,
  `mcode` varchar(30) NOT NULL,
  `cust` varchar(30) NOT NULL,
  `spdp` float NOT NULL,
  `souput` float NOT NULL,
  `sback` float NOT NULL,
  `sbeyond` float NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=gb2312";
//echo $ctable;
$db->query($ctable);
请问是何故?

解决方案 »

  1.   

    报错信息是什么?另外你可以到MYSQL的ERROR LOG中看一下你传过去的是什么内容。
      

  2.   

    把错误信息贴出来,ERROR LOG一般都有记录的。
      

  3.   

    mysql_connect($this->host,$this->user,$this->pass)or die("数据库连接失败:".mysql_error());//这样执行存储过程报错,程序能创建临时表存储过程报错:
    can't return a result set in the given contextmysql_connect($this->host,$this->user,$this->pass,1,131072)or die("数据库连接失败:".mysql_error());//这样可以执行存储过程不报错,但是程序中不能执行创建临时表我用的xampp在MYSQL中没有找到相关的错误日志。程序中也没报错。 $ctable="CREATE temporary TABLE beyond(
      `mbtype` varchar(30) NOT NULL,
      `mstype` varchar(30) NOT NULL,
      `mname` varchar(200) NOT NULL,
      `mcolor` varchar(200) NOT NULL,
      `mcode` varchar(30) NOT NULL,
      `cust` varchar(30) NOT NULL,
      `spdp` float NOT NULL,
      `souput` float NOT NULL,
      `sback` float NOT NULL,
      `sbeyond` float NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=gb2312";
    //echo $ctable;
    $db->query($ctable);
    $insert="insert into beyond select mbtype,mstype,mname,mcolor,mcode,cust,sum(PDP_num),sum(output_num),sum(back_num),((sum(output_num)-sum(back_num)-sum(PDP_num))/sum(PDP_num))*100 as beyond from superrate  where left(sr_date,10) between '$fdate' and '$tdate' and (muser='办房做办' or back_num>'0') group by mcode";
    //echo $insert;
    $db->query($insert);
      $sql="select mbtype,mstype,mname,mcolor,mcode,cust,spdp,souput,sback,sbeyond from beyond where (1=1)";  
      $rownum=$db->rownum($sql);//这里报SQL没有资源的错误,也就是说临时表里没数据
      

  4.   

    db->query()
    是什么?在这个函数中,你是不是把 connection 关掉了?CREATE temporary TABLE beyond
    这种临时表,仅在同一个connection 中有效,当connection 关闭后临时表就被清除了。
      

  5.   

    function connect(){
        $conn=mysql_connect($this->host,$this->user,$this->pass,1,131072)or die("数据库连接失败:".mysql_error()); 
     mysql_select_db($this->db,$conn)or die("The database is not connect!".mysql_error());
     mysql_query("set names gb2312");
     return $conn;
     }
     function query($sql){//这里就是我的query函数了,没有关闭connection,其他地方也没有。
       return mysql_query($sql,$this->connect());
     }
      

  6.   

    现在问题是:
     $conn=mysql_connect($this->host,$this->user,$this->pass,1,131072)or die("数据库连接失败:".mysql_error());
    加上红色部分,就不能创建临时表,可以执行存储过程。
    不加红色部分,就能创建临时表,但执行存储过程报错,麻烦版主大哥,帮我看看,谢谢!
      

  7.   

    那建议调试中看一下这个 $insert 的内容。
    然后检查一下 select 部分有没有记录被选出。
    select mbtype,mstype,mname,mcolor,mcode,cust,sum(PDP_num),sum(output_num),sum(back_num),
    ((sum(output_num)-sum(back_num)-sum(PDP_num))/sum(PDP_num))*100 as beyond 
    from superrate  
    where left(sr_date,10) between '$fdate' and '$tdate' 
    and (muser='办房做办' or back_num>'0') 
    group by mcode
      

  8.   

    can't return a result set in the given context
    不能返回结果集,现在你的SP代码是什么?在MYSQL中是否能运行
      

  9.   

    这个SQL语句我调试过,是没有问题的,能筛选出数据。
    我感到非常奇怪的就是:
    $conn=mysql_connect($this->host,$this->user,$this->pass,1,131072)or die("数据库连接失败:".mysql_error());
    加上红色部分,就不能创建临时表,可以执行存储过程
    不加红色部分,就能创建临时表,但执行存储过程报错,报的错误是下面:
    can't return a result set in the given context 
      

  10.   

    存储过程如下:DELIMITER $$USE `db_offsmplroom`$$DROP PROCEDURE IF EXISTS `UpdateMcode`$$CREATE DEFINER=`root`@`localhost` PROCEDURE `UpdateMcode`(
        IN mcode VARCHAR(20),
        IN btype VARCHAR(50),
        IN stype VARCHAR(50),
        IN mname VARCHAR(255),
        IN mcolor VARCHAR(200),
        IN ecode VARCHAR(50),
        IN munit VARCHAR(50)  
        )
        
    BEGIN
        DECLARE back INT;
        IF LENGTH(mcode)<=0 OR LENGTH(btype)<=0 OR LENGTH(stype)<=0 OR LENGTH(mname)<=0 OR LENGTH(stype)<=0 THEN
        SET back=1;
        SELECT back;
        else
        SET back=0;
        SELECT back;
        END IF;
        END$$DELIMITER ; 
      

  11.   

    楼主,我建议你把问题重新完整的描述一遍。 你这个 UpdateMcode 又是哪儿来的,和问题有什么关系? 
      

  12.   

    不好意思版主,我现在把问题整理好。出问题的源(红色部分):
    $conn=mysql_connect($this->host,$this->user,$this->pass,1,131072)or die("数据库连接失败:".mysql_error()); 
    1.加上红色部分,可以执行存储过程UpdateMcode,但是下面的临时表里没有数据(SQL语句是正确)。$ctable="CREATE temporary TABLE beyond(
      `mbtype` varchar(30) NOT NULL,
      `mstype` varchar(30) NOT NULL,
      `mname` varchar(200) NOT NULL,
      `mcolor` varchar(200) NOT NULL,
      `mcode` varchar(30) NOT NULL,
      `cust` varchar(30) NOT NULL,
      `spdp` float NOT NULL,
      `souput` float NOT NULL,
      `sback` float NOT NULL,
      `sbeyond` float NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=gb2312";
        //echo $ctable;
        $db->query($ctable);
        $insert="insert into beyond select mbtype,mstype,mname,mcolor,mcode,cust,sum(PDP_num),sum(output_num),sum(back_num),((sum(output_num)-sum(back_num)-sum(PDP_num))/sum(PDP_num))*100 as beyond from superrate  where left(sr_date,10) between '$fdate' and '$tdate' and (muser='办房做办' or back_num>'0') group by mcode";
        //echo $insert;
        $db->query($insert);
      $sql="select mbtype,mstype,mname,mcolor,mcode,cust,spdp,souput,sback,sbeyond from beyond where (1=1)";  
      $rownum=$db->rownum($sql);//这里报SQL没有资源的错误,也就是说临时表里没数据2.不加红色部分,执行存储过程UpdateMcode报错,报的错误是下面:
    can't return a result set in the given context 
      临时表中能得到数据。
      

  13.   

    在SP中去掉  SELECT back;试试
    从错误信息上看,是不能返回记录集
      

  14.   

    可是我要返回back值做判断的。
      

  15.   

    1、你可以用OUT参数,传回数值;
    2、存入表中再取BACK值。
      

  16.   

    $conn=mysql_connect($this->host,$this->user,$this->pass,1,131072)改成$conn=mysql_connect($this->host,$this->user,$this->pass,0,131072)你的connection 一定是被新建过。建议你贴出你的全部代码。否则无法猜测。你有没有新建你的DB?
    另外你的 create procedure PHP中的代码是什么?
      

  17.   

    还是版主厉害,一语中地。改为0就OK了,能否和我说下是为什么呢?0是继承MYSQL同一连接?1是重新连接吗?
      

  18.   


    是的。这个参数 new_link  本身就是指示是否在请求相同的情况下是否创建一个新的连接。
    但如果你的connection 不新建,或者你的DB不重新创建的话不应该有这个问题。