php调用mysql存储过程问题
程序员文章站
2024-01-28 14:54:52
...
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存储过程来查询表中所有数据,正常得出结果.
紧接着做其他查询时,不管使用什么语句都返回错误.
这是存储过程:
#查询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语句是不是可以连续调用啊(在不产生递归的情况下).
上一篇: 教你如何用photoshop几步把照片调色唯美清新的效果
下一篇: Redis的PHP客户端