Привязка переменного числа значений к подготовленному выражению - PullRequest
1 голос
/ 28 июня 2019

В настоящее время я пытаюсь решить небольшую проблему с подготовленными заявлениями MySQLi. Я пытаюсь написать пользовательскую функцию PHP, которая принимает несколько переменных и использует их для записи некоторых данных в таблицу в моей базе данных с помощью подготовленного оператора.

Проблема в том, что мне нужна функция для принятия любого количества параметров.

Пример функции в действии:

db_insert_secure("Goals", "(Name, Description, Type, ProjectID)", $data);

Предполагается, что вся информация, хранящаяся в массиве $ data, будет записана в (4) строки, указанные в таблице Goals.

Однако, поскольку количество параметров может измениться, я не могу придумать способ их эффективного связывания.

У меня была одна идея - использовать оператор switch, который обрабатывал бы привязку разного числа параметров, но я уверен, что это не самый красноречивый или эффективный метод.

Сценарий полностью:

function db_insert_secure($table, $columns, $data)
{
    $link = db_connect();

    $inputData = explode(",", $columns);
    $query = "INSERT INTO ".$table." ".$columns." VALUES (";

    for ($i = 0; $i < sizeof($inputData); $i ++)
    {
            $query .= "?";

            if ($i != sizeof($inputData) - 1)
            {
                $query .= ", ";
            }
    }

    $query .= ")";
    echo $query;

    $check_statement = mysqli_prepare($link, $query);
    //mysqli_stmt_bind_param($check_statement, 's', $data[0]);

    echo $check_statement;

    db_disconnect($link);
}

ПРИМЕЧАНИЕ. Сценарии db_connect и db_disconnect - это пользовательские сценарии для открытия и закрытия соединения с базой данных. db_connect просто возвращает объект подключения.

Может кто-нибудь придумать решение этой проблемы, которое не предполагает использование eval?

1 Ответ

1 голос
/ 28 июня 2019

Как ни странно, после борьбы с этим в течение последних 12 часов или около того мне действительно удалось найти решение проблемы в течение нескольких минут после запуска этой темы.

Вы можете использовать массив в качестве данных для подготовленного оператора, поместив перед ним "...". Например, в моем случае:

mysqli_stmt_bind_param($preparedStatement, 'ssss', ...$data);
...