| 一、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 |