Backup таблиц MySql в файлы sql и обратно на PHP.

 Класс PHP реализация от AI ChatGPT-4

Вопрос к AI ChatGPT:
Нужен PHP MySqli класс который считывает записи из таблицы с кодировкой utf8mb4 и создаёт один или несколько текстовых файлов формата sql с этими данными для обратной записи в таблицу аналог. Максимальное количество записей в файле не должно превышать 10mb. Файлы именуются по названию таблицы и очерёдности записанных данных, помещаются в папку `tmp_baza`.
В функцию создания файла передаётся название исходной таблицы - возвращается отсортированный массив имён созданных файлов, а в функцию записи в таблицу передаётся название пустой таблицы аналога и массив имён файлов созданных первой функцией. Описание и коментирование работы класса.

AI ChatGPT Ответ от AI ChatGPT:
Предлагаю PHP код для класса, который должен выполнить описанные операции:

PHP
class MysqlExportUtf8mb4
{
    protected $db;
    protected $chunkSize = 10485760; // размер чанка - 10 МБ
    protected $tmpDir = 'tmp_baza/';

    public function __construct($hostname, $username, $password, $database)
    {
        $this->db = new mysqli($hostname, $username, $password, $database);
        if ($this->db->connect_error) {
            die('Connect Error (' . $this->db->connect_errno . ') ' . $this->db->connect_error);
        }
        $this->db->set_charset('utf8mb4');
    }

    /**
     * Функция для создания файлов с данными
     *
     * @param string $tableName Название таблицы
     *
     * @return array Отсортированный массив имён созданных файлов
     */
    public function createFiles($tableName)
    {
        $sql = "SELECT * FROM `$tableName` ORDER BY `id`";
        $result = $this->db->query($sql);

        $totalCount = $result->num_rows;
        $filesCount = ceil($totalCount / $this->chunkSize);
        $fileNames = [];

        for ($i = 0; $i < $filesCount; $i++) {
            $fileName = $this->tmpDir . $tableName . '_' . ($i + 1) . '.sql';

            $file = fopen($fileName, 'w');

            if (!$file) {
                throw new Exception("Не удалось создать файл $fileName");
            }

            for ($j = 0; $j < $this->chunkSize && $row = $result->fetch_assoc(); $j++) {
                $insert = "INSERT INTO `$tableName` VALUES (";
                foreach ($row as $value) {
                    if (is_null($value)) {
                        $insert .= "NULL, ";
                    } else {
                        $insert .= "'" . $this->db->real_escape_string($value) . "', ";
                    }
                }
                $insert = rtrim($insert, ', ') . ");\n";
                fwrite($file, $insert);
            }

            fclose($file);

            $fileNames[] = $fileName;
        }

        return $fileNames;
    }

    /**
     * Функция для записи данных в таблицу
     *
     * @param string $tableName Название таблицы
     * @param array $fileNames Массив с именами файлов
     */
    public function loadData($tableName, $fileNames)
    {
        $sql = "LOAD DATA LOCAL INFILE '%s' INTO TABLE `%s` CHARACTER SET utf8mb4 FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ESCAPED BY '\\\\' LINES TERMINATED BY '\\n'";

        foreach ($fileNames as $fileName) {
            $fullFileName = realpath($fileName);
            $this->db->query(sprintf($sql, $fullFileName, $tableName));
        }
    }
}

Пример использования:

PHP
$exporter = new MysqlExportUtf8mb4('localhost', 'username', 'password', 'database');

$fileNames = $exporter->createFiles('my_table');

print_r($fileNames);

$exporter->loadData('my_table_new', $fileNames);

В данном примере создается экземпляр класса `MysqlExportUtf8mb4`, который подключается к базе данных с заданными хостом, именем пользователя, паролем и названием базы данных. Затем вызывается метод `createFiles()` для создания файлов с данными и получения массива их имён. После этого вызывается метод `loadData()`, который загружает данные из файлов в новую таблицу.

Дата публикации: 

ТОП 10 случайных публикаций



Сайт разработан студией © WEB-VidST   


Яндекс.Метрика