只需几句话就可以解释我想做什么。
我想用一个能够调用存储过程的函数来扩展我的库。我在这里找到了制作它的步骤,但我很难让它变得通用。
为了实现这一点,我读到我必须在 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/