php - 用php7.0编写动态调用mysql存储过程的函数

标签 php mysql stored-procedures

只需几句话就可以解释我想做什么。

我想用一个能够调用存储过程的函数来扩展我的库。我在这里找到了制作它的步骤,但我很难让它变得通用

为了实现这一点,我读到我必须在 mysqli_stmt_bind_param 上使用 call_user_func_array,因为我只在执行时知道参数 IN 的数量、类型和 OUT 的数量

这里是我所做的一些细节:

  • 创建到数据库的连接
  • 设置字符集
  • 构建调用字符串,例如 CALL (?,?,?,@outParam1,@outParam2)
  • 准备调用字符串
  • 构建一个参数数组以与调用 mysqli_stmt_bind_param 的 call_user_func_array 一起使用 <= 这给我带来了麻烦
  • 调用mysql_stmt_excute
  • 最后,进行选择以获取参数。

这里是代码的主要部分:

function executeProc($sProcName, $sInParamTypes, $aInParam, $iNumberParameterOut=0)
{
  $oConnection = @mysqli_connect(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DBNAME);

  mysqli_set_charset($oConnection, "utf8");

  /* code to build the $sCallStr */

  $oMysqlCall = mysqli_prepare($oConnection, $sCallStr);

  array_unshift($aFunctionParam, $oMysqlCall, $sInParamTypes);

  $aFunctionParam = array_merge($aFunctionParam, $aInParam);

  call_user_func_array("mysqli_stmt_bind_param", $aFunctionParam);

  mysqli_stmt_execute($oMysqlCall);
}

call_user_func_array 的返回值为 NULL。我尝试手动调用该函数:

 mysqli_stmt_bind_param($aFunctionParam[0], $aFunctionParam[1], $aFunctionParam[2], $aFunctionParam[3], $aFunctionParam[4], $aFunctionParam[5], $aFunctionParam[6], $aFunctionParam[7]);

而且它有效。我在数据库中看到了结果,函数的返回值为 TRUE。 有人可以帮忙吗?还有另一种传递参数数组的方法吗? (比如引用?)

非常感谢您的帮助

最佳答案

你可以使用 "Argument unpacking"使用 ... :

mysqli_stmt_bind_param($oMysqlCall, $sInParamTypes, ...$aInParam);

这将适用于通过引用传递的变量,并且无需使用 array_unshift()array_merge() 来构建您的参数。


示例:

function foo(&$a, &$b, &$c) { var_dump($a,$b,$c); }

这会起作用:

$arr = [1,2,3];
foo(...$arr); // Works

但这会产生一个警告:

$arr = [1,2,3];
call_user_func_array('foo', $arr); 
// Warning:  Parameter 1 to foo() expected to be a reference, value given

关于php - 用php7.0编写动态调用mysql存储过程的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49168731/

相关文章:

php - 在 HTML 表单上插入数据库提交

php - 使用 preg_replace 删除特定字符周围的空格

php - 消息系统,存储在数据库中还是文件系统中更好?

MySQL - 设置每个查询的最大结果集数

java - 通过 Notes Java 代理的存储过程

php - 使用 jquery + php 的动态 sql 查询

php - 用于记录尝试插入已存在行的列

mysql - 如何将表数据导出到csv,其中日期为 'today'

java - 如何用Java处理mysql中的并发事务?

c# - 从 .net 调用 DocumentDb 存储过程