奇怪的MYSQL问题

dzxccsu 2009-12-07 12:07:08
我上次问的执行存储过程错误,帖子如下:
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);
请问是何故?
...全文
123 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
左大神在这 2009-12-07
  • 打赏
  • 举报
回复
把错误信息贴出来,ERROR LOG一般都有记录的。
ACMAIN_CHM 2009-12-07
  • 打赏
  • 举报
回复
报错信息是什么?

另外你可以到MYSQL的ERROR LOG中看一下你传过去的是什么内容。
dzxccsu 2009-12-07
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 acmain_chm 的回复:]
引用0是继承MYSQL同一连接?1是重新连接吗?

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


[/Quote]谢谢版主。非常谢谢!
ACMAIN_CHM 2009-12-07
  • 打赏
  • 举报
回复
[Quote]0是继承MYSQL同一连接?1是重新连接吗?[/Quote]

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

dzxccsu 2009-12-07
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 acmain_chm 的回复:]
$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中的代码是什么?
[/Quote]还是版主厉害,一语中地。改为0就OK了,能否和我说下是为什么呢?0是继承MYSQL同一连接?1是重新连接吗?
ACMAIN_CHM 2009-12-07
  • 打赏
  • 举报
回复
$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中的代码是什么?
wwwwb 2009-12-07
  • 打赏
  • 举报
回复
1、你可以用OUT参数,传回数值;
2、存入表中再取BACK值。
dzxccsu 2009-12-07
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wwwwb 的回复:]
在SP中去掉  SELECT back;试试
从错误信息上看,是不能返回记录集
[/Quote]可是我要返回back值做判断的。
wwwwb 2009-12-07
  • 打赏
  • 举报
回复
在SP中去掉 SELECT back;试试
从错误信息上看,是不能返回记录集
dzxccsu 2009-12-07
  • 打赏
  • 举报
回复
不好意思版主,我现在把问题整理好。

出问题的源(红色部分):
$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
临时表中能得到数据。
ACMAIN_CHM 2009-12-07
  • 打赏
  • 举报
回复
楼主,我建议你把问题重新完整的描述一遍。 你这个 UpdateMcode 又是哪儿来的,和问题有什么关系?
dzxccsu 2009-12-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wwwwb 的回复:]
can't return a result set in the given context
不能返回结果集,现在你的SP代码是什么?在MYSQL中是否能运行
[/Quote]存储过程如下:

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 ;

dzxccsu 2009-12-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 acmain_chm 的回复:]
那建议调试中看一下这个 $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

[/Quote]这个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
wwwwb 2009-12-07
  • 打赏
  • 举报
回复
can't return a result set in the given context
不能返回结果集,现在你的SP代码是什么?在MYSQL中是否能运行
ACMAIN_CHM 2009-12-07
  • 打赏
  • 举报
回复
那建议调试中看一下这个 $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
dzxccsu 2009-12-07
  • 打赏
  • 举报
回复
现在问题是:
$conn=mysql_connect($this->host,$this->user,$this->pass,1,131072)or die("数据库连接失败:".mysql_error());
加上红色部分,就不能创建临时表,可以执行存储过程。
不加红色部分,就能创建临时表,但执行存储过程报错,麻烦版主大哥,帮我看看,谢谢!
dzxccsu 2009-12-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 acmain_chm 的回复:]
db->query()
是什么?在这个函数中,你是不是把 connection 关掉了?

CREATE temporary TABLE beyond
这种临时表,仅在同一个connection 中有效,当connection 关闭后临时表就被清除了。
[/Quote]


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());
}

ACMAIN_CHM 2009-12-07
  • 打赏
  • 举报
回复
db->query()
是什么?在这个函数中,你是不是把 connection 关掉了?

CREATE temporary TABLE beyond
这种临时表,仅在同一个connection 中有效,当connection 关闭后临时表就被清除了。
dzxccsu 2009-12-07
  • 打赏
  • 举报
回复
mysql_connect($this->host,$this->user,$this->pass)or die("数据库连接失败:".mysql_error());//这样执行存储过程报错,程序能创建临时表

存储过程报错:
can't return a result set in the given context

mysql_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没有资源的错误,也就是说临时表里没数据

56,678

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧