PHP Mysqli 和 call_user_func_array 一起工作


PHP Mysqli and working with call_user_func_array

目前我正在使用:

call_user_func(
    $func,
        $_POST['a'],$_POST['b'],$_POST['c'],$_POST['d'],$_POST['e']
);

但是,随着要调用的脚本中的内容增长。迫切需要这样的东西:

call_user_func_array(
    $func,
       $array("_POST", $_POST)
);

更明显。总的来说,我认为我需要创建一个新的数组。因为在我的脚本中,除了 $_POST[headers] 之外,每个 $_POST 都被推送到$func。虽然当我尝试上述内容时,它说:

函数名称必须是字符串。

也许我只是不知道如何正确工作。并且可以使用一些指导。谢谢。

如何调用它的一个例子是:

function somefunc($a,$b,$c,$d,$e)

其中$func被设置为其中一个函数,例如 somefunc。然后,除了标头之外的所有数据都将被推送到该函数。

以我现在使用它的方式call_user_func它运行正常。虽然试图转换,这样我就不必总是添加到它,并且它使用数组动态设置。

它没有你做的那么复杂。

下面是对call_user_func_array()的工作调用的示例:

<?php
function somefunc($a, $b, $c)
{
        echo "a = $a'n";
        echo "b = $b'n";
        echo "c = $c'n";
}
$post = array('x'=>1, 'y'=>2, 'z'=>3);
$func = 'somefunc';
call_user_func_array($func, $post);

该函数采用两个参数:

  • 第一个是可调用对象,它可以简单地是函数的名称。
  • 第二个是数组。数组的值以相同的顺序分配给函数的参数。数组的将被忽略。

您的表达$array("_POST", $_POST)不正确。它将调用名称在变量 $array 中的函数。我认为您将此与对象的可调用语法混淆了。


您在问题

标题和标签中引用了 mysqli,但您在问题中没有提及与 mysqli 有关的任何内容。

mysqli call_user_func_array()最常见的用途是当您想要使用可变数量的参数mysqli_stmt_bind_param()调用函数时,当您尝试创建一个泛型函数来准备任何 SQL 语句并将任意数量的参数绑定到它时。

我过去曾多次发布过这种情况的答案:

  • 如何在 mysqli 中将任意数量的值绑定到预准备语句?
  • mysqli_prepare vs PDO
  • 如何在 PHP 中抽象 mysqli 准备语句?

答案其实很简单。而PHP可以做array_keys($_POST)和array_values($POST)。它会尝试将键/值包含在标头,函数中。就我而言,这是不需要的。因此,与其收集键/值并排除这 3 个。然后再次将它们分开。我将结果推送到 2 个数组,而不是命名为 $postk 和 $postv。

我从旧到新的变化:

老:

call_user_func(
    $func,
        $_POST['a'],$_POST['b'],$_POST['c'],$_POST['d']
);

新增功能:

$i=0;
    foreach(array_diff_key(
           $_POST, array_flip(array('headers', 'func'))) as $k => $v){
        $postk[$i]=$k;
        $postv[$i]=$v;
        ++$i;
    }

call_user_func_array($func,$postv);

通过这种方式,它允许我将任意长度的数组$postk/$postv推送到函数中。这是由 POST 设置的,除了标题,表格,功能。

编辑我确实想添加互联网上到处都是的原始帮助代码。正是该帮助文本及其与其他回复的位置最终给了我所需的结果。