首页 >后端开发 >php教程 >php调用mysql存储过程问题

php调用mysql存储过程问题

WBOY
WBOY原创
2016-06-23 14:22:08990浏览

mysql php

为什么我调用一次存储过程后再做其他查询后就错误了呢?
-------------------------------------------------------------
我要php调用mysql存储过程来查询表中所有数据,正常得出结果.
紧接着做其他查询时,不管使用什么语句都返回错误.

这是存储过程:
#查询shares表中的数据
#call  proc_show_shares('sendtime');      //排序对象
delimiter //
DROP PROCEDURE IF EXISTS proc_show_shares //
CREATE PROCEDURE proc_show_shares (in sorttype varchar(15))
BEGIN    
          Set @sql = concat("select* from shares order by ", sorttype," desc");
          PREPARE cmd from @sql;
          EXECUTEcmd;
          DEALLOCATEPREPARE cmd;
END//
delimiter ;

以下代码运行正常:
$query = "call proc_show_shares('sendtime')";
$results = mysql_query($query);  //调用存储过程
while($result_row = mysql_fetch_row($results))
{
        //{代码段}

        $values[] = $result_row;
}
其中{代码段}是被注释掉的.当取消注释时,就错误了.
代码段为:
$result = mysql_query("select name from users where id = 10001") or die('靠');
上面的sql语句单独运行正常(当然是有结果的),连在一起就输出'靠'了.

为什么?
我可以输出values,但是加上mysql_query("select name from users where id = 10001") or die('靠');就不行了.然而这条语句本身是正确的.

所有过程中数据库一直是连接状态的.

回复讨论(解决方案)

这与存储过程返回的数据结构与普通查询不同有关
普通查询返回的是单一的资源,而执行存储过程返回的是一个资源数组(不准确,但意思到了)
就和你处理简单变量和数组变量不能用相同的方法一样,处理不同的结果集也应该用不同方法
但是 php 的数据库操作函数并没有这样做,于是就出现了你遇到的问题(当然不仅是你)
解决的方法很简单:先读空结果集,然后再执行其他查询

这样做也是有他的道理的:既然你使用了存储过程,那就应该继续将涉及的其他查询也放进存储过程中去
不该由他分门别类的替你处理

mysql_query("select name from users where id = 10001")这句查询一开始就是放在存储过程中来调用的,但是无法读取,所以放弃使用存储过程,直接使用sql语句,结果还是不行。看来第一次使用的存储过程的调用对后面的查询影响很大,前面的存储过程只要改为sql语句调用就一切正常了.

------------------------
另外mysql中,触发器、存储过程、sql语句是不是可以连续调用啊(在不产生递归的情况下).

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn