Как передать массив методу bind_param в качестве аргумента в oop

Когда я хочу передать массив методу bind_param, я получаю следующее сообщение об ошибке.

Предупреждение: call_user_func_array () ожидает, что параметр 1 будет допустимым обратным вызовом, первый член массива не является допустимым именем класса или объектом в C: \ xampp \ htdocs \ mvc \ libs \ Database.php в строке 26

Вот код:

class Database extends mysqli {

    function __construct($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME) {
        parent::__construct($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
    }

    function insert($table, $data){

        echo $table . '<br />';
        print_r($data);
        echo '<br />';        
        $param_types=$this->gettypes_bind_param($data, $keys, $values, $place_holder);
        $field_names= implode(', ', $keys);
        $inputArray[]=&$param_types;
        $j= count($values);
        for ($i=0;$i<$j;$i++)
        {
            $inputArray[]=&$values[$i];
        }

        print_r($inputArray); 
        echo '<br />';
        $result= $this->prepare("INSERT INTO $table ($field_names) VALUES ($place_holder)");
        call_user_func_array(array($result, 'bind_param'), $inputArray);
        $result->execute();
        die;
    }

    function gettypes_bind_param(&$data, &$keys, &$values, &$place_holder){
        $types='';
        foreach ($data as $tmp)
        {
            switch (gettype($tmp))
            {
                case "string" :
                    $types.='s';
                    break;
                case "integer" :
                    $types.='i';
                    break;                
                case "double" :
                    $types.='d';
                    break;                
                default :
                    $types.='b';
                    break;                
            }
            $place_holder .='?, ';
        }
        $place_holder= rtrim($place_holder, ', ');
        $keys = array_keys($data);
        $values = array_values($data);
        return $types;
    }

Извините за мой английский

$result->execute($inputArray); - это один из примеров варианта php.net/manual/en/pdostatement.execute.php здесь
Scuzzy 06.11.2018 22:19

Спасибо за ответ, но это не PDOStatement

karanusret 06.11.2018 22:26
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать оператор Распаковка аргумента (...) ...

$result->bind_param ($param_types, ...$values);

Обратите внимание, что вы передаете типы и значения как отдельные элементы и не должны объединять их, как в call_user_func_array().

Спасибо вам большое :)

karanusret 06.11.2018 22:44

Другие вопросы по теме