80端口-80勃客♂
80端口悄悄提示:数据载入中……  
80端口悄悄提示:数据载入中……
时间记忆
80端口悄悄提示:数据载入中……
勃客管理
80端口悄悄提示:数据载入中……
用户公告
80端口悄悄提示:数据载入中……
我的相册
最新日志
80端口悄悄提示:数据载入中……
最新评论
80端口悄悄提示:数据载入中……
最新回复
80端口悄悄提示:数据载入中……
我的好友
站点信息
80端口悄悄提示:数据载入中……
 
2008-4-8 11:20:00
php与mysql存储过程

一、php调用mysql存储过程和函数的方法

存储过程和函数是MySql5.0刚刚引入的。关于这方面的操作在PHP里面没有直接的支持。但是由于Mysql PHP API的设计,使得我们可以在以前的PHP版本中的mysql php api中支持存储过程和函数的调用。

在php中调用存储过程和函数的主要步骤

1。调用存储过程的方法。

a。如果存储过程有 IN/INOUT参数,声明一个变量,输入参数给存储过程,该变量是一对,

一个php变量(也可以不必,只是没有php变量时,没有办法进行动态输入),一个Mysql变量。

b。如果存储过程有OUT变量,声明一个Mysql变量。

mysql变量的声明比较特殊,必须让mysql服务器知道此变量的存在,其实也就是执行一条mysql语句。

输入 set @mysqlvar=$phpvar ;

c。使用mysql_query()/mysql_db_query()执行mysql 变量声明语句。

mysql_query("set @mysqlvar【=$pbpvar】");

这样,在mysql服务器里面就有一个变量,@mysqlar。如果时IN参数,那么其值可以有phpar传入。

d。 如果时存储过程。

1。执行 call procedure()语句。

也就是mysql_query("call proceduer([var1]...)");

2. 如果有返回值,执行select @ar,返回执行结果。

mysql_query("select @var)"

接下来的操作就和php执行一般的mysql语句一样了。可以通过mydql_fetch_row()等函数获得结果。

如果时函数。 直接执行 select function() 就可以了。

php调用mysql存储过程和函数的方法一:

程序代码

--------------------------------------------------------------------------------

 $host="localhost";

$user="root";

$password="11212";

$db="samp_db";

$dblink=mysql_connect($host,$user,$password)

or die("can't connect to mysql");

mysql_select_db($db,$dblink)

or die("can't select samp_db");

$res=mysql_query("set @a=$password",$dblink);

$res=mysql_query("call aa(@a)",$dblink);

$res=mysql_query("select @a",$dblink);

$row=mysql_fetch_row($res);

echo $row[0];

--------------------------------------------------------------------------------

 php调用mysql存储过程和函数方法二:此方法需要db_mysqli.dll的支持!

调用带有select语句的存储过程就出现 PROCEDURE p can’t return a result set in the given context的错误。google了半天,在mysql官网上找到一些说法,db_mysql的模块不支持存储过程调用,解决方法是用db_mysqli。测试了一下,果然可以了。

程序代码

--------------------------------------------------------------------------------

 <?php

/* Connect to a MySQL server */

$link = mysqli_connect(

'localhost', /* The host to connect to */

'root', /* The user to connect as */

'root', /* The password to use */

'db_name'); /* The default database to query */

if (!$link) {

printf("Can't connect to MySQL Server. Errorcode: %s\n", mysqli_connect_error());

exit;

}

/* Send a query to the server */

if ($result = mysqli_query($link, "call se_proc('crm')")) {

/* Fetch the results of the query */

while( $row = mysqli_fetch_array($result) ){

echo ($row[0]. "--------- SR. " . $row[1] . "

");

}

/* Destroy the result set and free the memory used for it */

mysqli_free_result($result);

}

/* Close the connection */

mysqli_close($link);

?>

二、错误2013 (#2013 - Lost connection to MySQL server during query)

在同一个页面上不关闭数据库连接时多次调用Mysql存储过程出错,信息如下:

(ERROR 2013: - Lost connection to MySQL server during query),

如果在一个页面上只调用一次查询,就很顺利,调多次时就出有问题.

     在Google上查找一下:给出方法是:要改配置文件  
     set-variable=thread_stack=256k  
     结果依然不行

经过我两个小时的折腾时发现原来是:Client API Version

必须要在5.0.15版本以上 可通过 PHP中的 PHPINFO()查看.

为什么我的要5.0以上(因为我是用Mysql5的存储过程返回结果集,Mysql5才开始支持存储过程,并且要PHP5以上的版本才能支持),安装的时候还要以 模块的安装方式:

Apache2 的 Httpd.conf 文件这样配置:

LoadModule php5_module modules/php5apache2.dll
AddType application/x-httpd-php .php

(前题是你要将:php5ts.dll php5apache2.dll libmysql.dll[5.0的版本的哦]

放到Apache安装目录下modules文件夹里,然后将php.ini 文件放到Apache安装目录下bin文件夹里,最好不要将libmysql.dll不要放到其它系统环境目录下,由其windows不要放到%systemroot%目录下)

我就是这么的,因为我是两个版本的PHP(4和5)共存,我就将4.4的libmysql.dll 放到系统目录下所以出现上面的问题.

实际上是检查 客户端API版本-------------80保留意见,未解决问题(无法加载模块)

三、两个问题

1、存储过程返回一个结果集的问题

正常情况下,如果在php中调用一个mysql存储过程,而该过程返回一个结果集的话,那么会收到“#1312 - PROCEDURE XXX can't return a result set in the given context”的错误提示。

解决方法是,在用mysql_connect()连接数据库时,使用最后一个参数client_flags,设该参数值为0x20000,即如下:
define('CLIENT_MULTI_RESULTS', 0x20000);
$db = mysql_connect("dbhost", "dbuser", "dbpasswd",1,CLIENT_MULTI_RESULTS);

2、提示“Lost connection to MySQL server during query”的问题

如果在一个页面中调用了不止一次存储过程,就可能收到上面的提示。一个省事的方法就是每次调用储存过程都重connect一下数据库。
在网上查了一下这个问题,有的人说可以在phpinfo()中看一下mysql client API的版本,至少在5.0.15以上才行,不过我的已然是5.0.18了。还有说要改php.ini,设置这个参数:set-variable=thread_stack=256k

四、论坛一摘

CREATE PROCEDURE initSystem ()
SELECT * FROM config WHERE id=1;

我在PHP程序中如果只调用该过程那么没有任何问题,但我调过该过程后再执行其他select查询,就会出现第一次正常运行,第二次提示我“Lost connection to MySQL server during query”,再刷新第三次有正常了,第四次又 报错了。不知何故?

某回答:产生了多维数组。

某回答:1)看你的连接语句,试试mysql_pconnect() 2)检查mysql连接的配置,是否有时间限制?

楼主说:我是用mysqli的

某回答:应该不是sp的问题 你程序这里看下

来自于http://bbs.chinaunix.net/viewthread.php?tid=800826

80 | 阅读全文 | 回复(0) | 引用通告 | 编辑
发表评论:
80端口悄悄提示:数据载入中……
http://www.waasai.com/blog/f/80/index.html
Link to waasai.com Home