call_user_func_array() 返回无效 class 或对象错误

call_user_func_array() returning with an invalid class or object error

我是 PHP 的新手,我正在尝试创建一个函数,该函数可以将参数中给定的任何参数插入到也​​指定为函数参数的 table 中,但是当我执行它说的代码:

call_user_func_array() expects parameter 1 to be a valid callback, first array member is not a valid class name or object

这是我的代码:

function insert($table, $args){
    
    $Query = "INSERT INTO ? VALUES(";
    $types="";
    foreach($args as $arg){
        $Query=$Query."?,";
        $type = gettype($arg);
        switch ($type) {
            case "string": 
                $types = $types."s";
                break;
            case "integer": 
            case "double": 
                $types = $types."d";
                break; 
        }
    }
    $Query=substr($Query, 0, -1);
    $Query=$Query.")";
    global $mysqli;
    $stmt=$mysqli->prepare($Query);
    echo $stmt;
    array_unshift($args, $table);
    array_unshift($args, $types);

    call_user_func_array(array($stmt, "bind_param"), $args);
    $stmt->execute();
}

所以这里有什么问题,谢谢你?

为什么,哦,你为什么要创建这样的功能?

别考虑创建如此复杂且毫无用处的功能。这将是你的噩梦。相信我的建议,停止你现在正在做的事情。

如果您只是从 PHP 开始,那么忘记 mysqli。它缺少很多功能并且非常复杂。开始学习PDO。

使用 PDO,您不需要这些功能。

首先打开PDO连接:

$pdo = new PDO("mysql:host=localhost;dbname=db_name;charset=utf8mb4", 'username', 'password', [
    \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
    \PDO::ATTR_EMULATE_PREPARES => false
]);

然后你可以像这样执行一个简单的语句:

$pdo->prepare('INSERT INTO tableA(col1, col2) VALUES(?,?)')
    ->execute(['val1', 'val2']);

绑定未知数量的参数也很简单

$stmt = $pdo->prepare('SELECT * FROM TableA WHERE Id IN ('.implode(',', array_fill(0, count($ids), '?')).')');
$stmt->execute($ids);
$data = $stmt->fetchAll();

看看它比你的自定义函数简单多了。