Перейти к содержимому

Полное руководство по функции mysqli_set_local_infile_handler в PHP

Расширение mysqli предоставляет множество функций для взаимодействия с базами данных MySQL. Одна из таких функций — mysqli_set_local_infile_handler, которая позволяет задать функцию обратного вызова для обработки запросов LOAD DATA LOCAL INFILE. Доступна начиная с PHP 5.3, эта функция требует наличия расширения mysqli.

В этом руководстве объясняется, как работает функция и как эффективно использовать её в ваших PHP-проектах.

Что такое функция mysqli_set_local_infile_handler?

mysqli_set_local_infile_handler — это встроенная функция PHP, которая задаёт пользовательский обратный вызов для обработки запросов LOAD DATA LOCAL INFILE. Она принимает два аргумента:

  • Объект подключения к MySQL (обычно возвращаемый функцией mysqli_connect или new mysqli).
  • Функция обратного вызова для обработки запроса.

Ниже приведён синтаксис функции mysqli_set_local_infile_handler:

PHP-синтаксис функции mysqli_set_local_infile_handler

php
mysqli_set_local_infile_handler($connection, callable $callback);

Особенности функции mysqli_set_local_infile_handler

Функция mysqli_set_local_infile_handler предоставляет надёжный способ перехвата и обработки запросов LOAD DATA LOCAL INFILE в PHP. Ключевые особенности включают:

1. Пользовательская обработка данных

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

2. Работа с существующими подключениями

Вы можете привязать обработчик к любому активному объекту подключения mysqli. Если у вас уже есть подключение, вы можете использовать тот же объект для установки пользовательского обратного вызова для обработки запросов LOCAL INFILE.

Как использовать функцию mysqli_set_local_infile_handler

Ниже приведены шаги по использованию функции mysqli_set_local_infile_handler в ваших PHP-проектах:

1. Подключение к серверу MySQL

Прежде чем использовать функцию mysqli_set_local_infile_handler, необходимо установить подключение к серверу MySQL. Для современных PHP-проектов рекомендуется использовать объектно-ориентированный конструктор:

Как использовать функцию mysqli_set_local_infile_handler?

php
<?php

$host = 'localhost';
$user = 'username';
$password = 'password';
$database = 'mydatabase';

$connection = new mysqli($host, $user, $password, $database);

if ($connection->connect_error) {
    die('Connection failed: ' . $connection->connect_error);
}

2. Установка функции обратного вызова

После установки подключения к серверу MySQL вы можете использовать функцию mysqli_set_local_infile_handler для задания функции обратного вызова, обрабатывающей запросы LOCAL INFILE.

Важно: Чтобы этот обработчик сработал, на сервере MySQL должна быть включена системная переменная local_infile (SET GLOBAL local_infile = 1;). Кроме того, LOAD DATA LOCAL INFILE представляет угрозу безопасности (например, несанкционированный доступ к файлам), поэтому его следует использовать только при необходимости и с надлежащей защитой.

Ниже приведён пример кода:

Пример использования функции PHP mysqli_set_local_infile_handler

php
<?php

function custom_local_infile_handler($link, $file) {
    // Open the file and return a resource handle
    $fp = fopen($file, 'r');
    if (!$fp) {
        return false;
    }
    return $fp; // Must return a valid file resource handle
}

if (mysqli_set_local_infile_handler($connection, 'custom_local_infile_handler')) {
    echo "Callback function set successfully.";
} else {
    echo "Error setting callback function: " . mysqli_error($connection);
}

Этот код устанавливает пользовательскую функцию обратного вызова с именем custom_local_infile_handler для обработки запросов LOCAL INFILE для подключения к MySQL. Обратный вызов должен возвращать действительный дескриптор ресурса файла при успехе или false при ошибке.

3. Вызов обработчика

Обратный вызов автоматически вызывается при выполнении оператора LOAD DATA LOCAL INFILE через mysqli_query:

Вызов обработчика с помощью mysqli_query

php
<?php

$sql = "LOAD DATA LOCAL INFILE '/path/to/your/data.csv' INTO TABLE my_table FIELDS TERMINATED BY ','";
$result = mysqli_query($connection, $sql);

if ($result) {
    echo "Data loaded successfully.";
} else {
    echo "Error loading data: " . mysqli_error($connection);
}

Заключение

Подводя итог, mysqli_set_local_infile_handler предоставляет полный контроль над тем, как данные из локальных файлов загружаются в MySQL. Реализовав пользовательский обратный вызов, вы сможете безопасно управлять доступом к файлам, применять преобразования данных и вести подробные журналы, обеспечивая соответствие массовых импортов правилам безопасности и бизнес-логике вашего приложения.

Practice

Какова основная цель функции set_local_infile_handler в PHP?

Считаете ли это полезным?

Предпросмотр dual-run — сравните с маршрутами Symfony на продакшене.