您的位置:首页 > 编程语言 > PHP开发

php调用mysql存储过程(关于CLIENT_MULTI_RESULTS)

2011-04-27 21:02 507 查看
以为php有用于调用存储过程的内建函数,查了一下发现只能用mysql_query(call
pro())这样的方式,我认为从本质上也就相当于在mysql命令行里执行语句了,由于我的存储过程含有输入输出参数,直接调用会报一个mysql_error错误:XXXXcan't
return a result set in the given context

google了一下这个错误发现有人用以下的代码解决了这个问题:

原文地址:http://www.phpweblog.net/GaRY/archive/2008/01/29/2752.html#Post

关键就是两点

define
(
'
CLIENT_MULTI_RESULTS
'
,

131072
);

$link

=

mysql_connect
(
"
127.0.0.1
"
,

"
root
"
,

""
,
1
,
CLIENT_MULTI_RESULTS) or
die
(
"
Could not connect:
"
.
mysql_error
());

下面就可以正常使用了,以下是例子程序。

1
<?
php

2

define
(
'
CLIENT_MULTI_RESULTS
'
,

131072
);

3

4

$link

=

mysql_connect
(
"
127.0.0.1
"
,

"
root
"
,

""
,
1
,
CLIENT_MULTI_RESULTS) or
die
(
"
Could not connect:
"
.
mysql_error
());

5

mysql_select_db
(
"
vs
"
) or
die
(
"
Could not select database
"
);

6
?>

7

8
<?
php

9

$result

=

mysql_query
(
"
call get_news_from_class_id(2)
"
) or
die
(
"
Query failed:
"

.
mysql_error
());

while
(
$row

=

mysql_fetch_array
(
$result
,
MYSQL_ASSOC))

{

$line

=

'
<tr><td><a target = _blank href=/
''
.$row["url"].
'
/
'
>
'
.
$row
[
"
title
"
]
.
'
(
'
.
$row
[
"
page_time
"
]
.
'
)
'
.
'
</a></td></t
r>
'
;

echo

$line
;

printf
(
"
/n
"
);

}

mysql_free_result
(
$result
);

?>

<?
php

mysql_close
(
$link
);

?>

其中的一个参数CLIENT_MULTI_RESULTS不明白是什么意思,google之,在mysql的官方主页上关于mysql提供的c接口的文档
(http://dev.mysql.com/doc/refman/5.0/en/mysql-real-connect.html)里找到了这个参数
和其他一些参数,我大概翻译了一下描述,如下:

Flag Name

Flag
Description


CLIENT_COMPRESS

Use compression protocol.(使用压缩协议
。)
CLIENT_FOUND_ROWS

Return the number of found (matched) rows, not the number of
changed rows.(返回找到(匹配)的行数,而不是改变了的行数
。)
CLIENT_IGNORE_SIGPIPE

Prevents the client library from installing a
SIGPIPE

signal handler. This can be used to avoid
conflicts with a handler that the application has already
installed.(阻止客户端库安装一个SIGPIPE信号处理器。这个可以用于当应用程序已经安装该处理器的时候避免与其发生冲突。
CLIENT_IGNORE_SPACE

Allow spaces after function names. Makes all functions names
reserved words.(允许在函数名后使用空格。所有函数名可以预留字
。)
CLIENT_INTERACTIVE

Allow
interactive_timeout


seconds
(instead of
wait_timeout


seconds) of
inactivity before closing the connection. The client's session

wait_timeout


variable is set to
the value of the session
interactive_timeout


variable.(允许使用关闭连接之前的不活动交互超时的描述,而不是等待超时秒数。客户端的会话等待超时变量变为交互超时变量
。)
CLIENT_LOCAL_FILES

Enable
LOAD DATA LOCAL


handling.
CLIENT_MULTI_RESULTS

Tell the server that the client can handle multiple result sets
from multiple-statement executions or stored procedures. This flag
is automatically enabled if
CLIENT_MULTI_STATEMENTS

is enabled. See the note
following this table for more information about this
flag.(通知服务器客户端可以处理由多语句或者存储过程执行生成的多结果集。当打开
CLIENT_MULTI_STATEMENTS时,

这个标志自动的被打开。可以在本表后查看更多关于该标志位的信息。
CLIENT_MULTI_STATEMENTS

Tell the server that the client may send multiple statements in
a single string (separated by “
;


”). If this flag is not set,
multiple-statement execution is disabled. See the note following
this table for more information about this flag.(通知服务器客户端可以发送多条语句(由分号分隔)。如果该标志为没有被设置,多条语句执行
。)
CLIENT_NO_SCHEMA

Don't allow the
db_name.tbl_name.col_name


syntax.
This is for ODBC. It causes the parser to generate an error if you
use that syntax, which is useful for trapping bugs in some ODBC
programs.(不允许“数据库名.表名.列名”这样的语法。这是对于ODBC的设置。当使用这样的语法时解析器会产生一个错误,这对于一些ODBC的程序限制bug来说是有用的。
CLIENT_ODBC

Unused.(不使用)
CLIENT_SSL

Use SSL (encrypted protocol). This option should not be set by
application programs; it is set internally in the client library.
Instead, use
mysql_ssl_set()


before calling
mysql_real_connect()


.(使用SSL。这个设置不应该被应用程序设置,他应该是在客户端库内部是设置的。可以在调用mysql_real_connect()之前调用mysql_ssl_set()来代替设置。
CLIENT_REMEMBER_OPTIONS

Remember options specified by calls to
mysql_options()


. Without this option, if
mysql_real_connect()


fails, you must repeat
the
mysql_options()


calls before trying to connect
again. With this option, the
mysql_options()


calls need not be
repeated.(记住通过调用mysql_options()生成的设置。如果不使用这个设置,当mysql_real_connect失败时,再重新连接之前必须反复调用mysql_options()。当然,如果使用这个设置,就不必反复调用了。
下面有对于
CLIENT_MULTI_STATEMENTS

的说明:

If you enable
CLIENT_MULTI_STATEMENTS

or
CLIENT_MULTI_RESULTS

, you should
process the result for every call to
mysql_query()


or
mysql_real_query()


by using a loop that calls
mysql_next_result()


to determine whether there are more
results. For an example, see
Section 20.9.12, “C API Support for Multiple
Statement Execution”
.

如果打开了
CLIENT_MULTI_STATEMENTS或

CLIENT_MULTI_RESULTS,你必须对每一个mysql_query()或者mysql_real_query()的调用结果通过一个循环来处理,在这个循环中,调用mysql_next_result()来决定(发现)是否有更多的结果,如

Section 20.9.12,
“C API Support for Multiple Statement Execution”

以上供需要的朋友参考吧。
转自:http://blog.sina.com.cn/s/blog_550ffb0b0100dybn.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: