10bet网址
mysql php api.
下载本手册

3.2.5存储过程

版权所有1997-2021 PHP文档组。10bet官方网站

MySQL数据库支持存储过程。存储过程是存储在数据库目录中的子程序。应用程序可以调用并执行存储过程。这称呼SQL语句用于执行存储过程。

范围

存储过程可以INOUT出去参数,取决于MySQL版本。MySQLI接口对不同类型的参数没有特殊概念。

在参数中

输入参数随附称呼陈述。请确保正确逃离值。

示例3.18调用存储过程

<?php mysqli_report(mysqli_report_error | mysqli_report_strict);$mysqli = new mysqli("example.com", "user", "password", "database");$mysqli->查询("DROP TABLE IF EXISTS ");$mysqli->查询("CREATE TABLE test(id INT)");$mysqli->查询("DROP PROCEDURE IF EXISTS p");$ mysqli->查询(“创建过程p(在id_val int)开始插入到测试(ID)值(ID_val);结束;”);$ mysqli->查询(“呼叫p(1)”);$结果= $ mysqli->查询(“从测试中选择ID”);var_dump($结果 - > fetch_assoc());

上面的示例将输出:

数组(1){[“ID”] =>字符串(1)“1”}


inut / out参数

价值INOUT/出去使用会话变量访问参数。

例3.19使用会话变量

<?php mysqli_report(mysqli_report_error | mysqli_report_strict);$mysqli = new mysqli("example.com", "user", "password", "database");$mysqli->查询("DROP PROCEDURE IF EXISTS p");$ mysqli->查询('创建过程p(out msg varchar(50))开始选择“嗨!”进入msg;结束;');$ mysqli->查询(“设置@msg ='');$ mysqli->查询(“呼叫p(@msg)”);$结果= $ mysqli->查询(“选择@msg为_p_out”);$行= $结果 - > fetch_assoc();回声$行['_ p_out'];

上面的示例将输出:

你好!


应用程序和框架开发人员可以通过混合使用会话变量和基于数据库的目录检查来提供更方便的API。但是,请注意基于目录检查的定制解决方案可能会对性能产生影响。

处理结果集

存储过程可以返回结果集。从存储过程返回的结果集无法正确获取mysqli ::查询。这mysqli ::查询函数组合语句执行并将第一个结果设置为缓冲结果集,如果有的话。但是,有来自用户隐藏的其他存储过程结果集mysqli ::查询失败返回用户预期的结果集。

从存储过程返回的结果集使用mysqli :: real_query.mysqli :: multi_query.。这两个函数都允许获取语句返回的任意数量的结果集,例如称呼。未能获取存储过程返回的所有结果集会导致错误。

示例3.20从存储过程中获取结果

<?php mysqli_report(mysqli_report_error | mysqli_report_strict);$mysqli = new mysqli("example.com", "user", "password", "database");$mysqli->查询("DROP TABLE IF EXISTS ");$mysqli->查询("CREATE TABLE test(id INT)");$mysqli->query("INSERT INTO test(id) VALUES (1), (2), (3)");$mysqli->查询("DROP PROCEDURE IF EXISTS p");$ mysqli->查询('创建过程p()读取SQL数据开始从测试中选择ID;从测试中选择ID + 1;结束;');$ mysqli-> multi_query(“呼叫p()”);do {if($结果= $ mysqli-> store_result()){printf(“--- \ n”);var_dump(结果- > fetch_all ()); $result->free(); } } while ($mysqli->next_result());

上面的示例将输出:

---阵列(3){[0] =>数组(1){[0] =>字符串(1)“1”} [1] =>数组(1){[0] =>字符串(1)“2”} [2] =>数组(1){[0] =>字符串(1)“3”}} ---阵列(3){[0] =>数组(1){[0] =>字符串(1)“2”} [1] =>数组(1){[0] =>字符串(1)“3”} [2] =>数组(1){[0] =>字符串(1)“4”}}


使用准备的陈述

使用更准备的语句接口时不需要特殊处理,以获取与上述相同存储过程的结果。准备好的声明和非准备的声明界面是相似的。请注意,并非每个MySQL服务器版本都可以支持准备称呼SQL语句。

示例3.21存储过程和准备的陈述

<?php mysqli_report(mysqli_report_error | mysqli_report_strict);$mysqli = new mysqli("example.com", "user", "password", "database");$mysqli->查询("DROP TABLE IF EXISTS ");$mysqli->查询("CREATE TABLE test(id INT)");$mysqli->query("INSERT INTO test(id) VALUES (1), (2), (3)");$mysqli->查询("DROP PROCEDURE IF EXISTS p");$ mysqli->查询('创建过程p()读取SQL数据开始从测试中选择ID;从测试中选择ID + 1;结束;');$stmt = $mysqli->prepare("CALL p()");支撑- > execute ();{如果(结果=支撑美元- > get_result ()) {printf(“\ n”); var_dump($result->fetch_all()); $result->free(); } } while ($stmt->next_result());

上面的示例将输出:

---阵列(3){[0] =>数组(1){[0] => int(1)} [1] =>数组(1){[0] => int(2)} [2] =>数组(1){[0] => int(3)}} ---数组(3){[0] =>数组(1){[0] => int(2)} [1]=>数组(1){[0] => int(3)} [2] =>数组(1){[0] => int(4)}}}


当然,也支持使用BIND API进行获取。

示例3.22存储过程和使用绑定API的准备语句

<?php mysqli_report(mysqli_report_error | mysqli_report_strict);$mysqli = new mysqli("example.com", "user", "password", "database");$mysqli->查询("DROP TABLE IF EXISTS ");$mysqli->查询("CREATE TABLE test(id INT)");$mysqli->query("INSERT INTO test(id) VALUES (1), (2), (3)");$mysqli->查询("DROP PROCEDURE IF EXISTS p");$ mysqli->查询('创建过程p()读取SQL数据开始从测试中选择ID;从测试中选择ID + 1;结束;');$stmt = $mysqli->prepare("CALL p()");支撑- > execute ();{如果(支撑美元- > store_result()){$支撑- > bind_result ($ id_out); while ($stmt->fetch()) { echo "id = $id_out\n"; } } } while ($stmt->next_result());

上面的示例将输出:

id = 1 id = 2 id = 3 id = 2 id = 3 id = 4


也可以看看

mysqli ::查询
mysqli :: multi_query.
mysqli :: next_result
mysqli: more_results