Лучший способ экспортировать любую таблицу с помощью Apache2 / PHP и MySQL

#php #mysql #apache

#php #mysql #apache

Вопрос:

Apache2 / PHP имеет доступ ко всем таблицам / базам данных на сервере MySQL, необходимым для пользовательского интерфейса. Я хотел бы создать возможность быстрого и безопасного экспорта любой из этих таблиц в формате CSV без необходимости создания модуля экспорта для каждой отдельной таблицы.

В настоящее время у меня есть следующее

 $file = '/tmp/' . $_POST['table'] . '_export.csv';
$table = $_POST['table'];

$sql = 'SELECT * INTO OUTFILE "' . $file . '"
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    LINES TERMINATED BY "n"
    FROM ' . $table;
$db->query($sql);
file_put_contents('php://output', file_get_contents($file));
unlink($file);
 

Это создает экспорт /tmp для экспорта таблицы, однако Apache2 не имеет разрешений на доступ /tmp , поскольку PrivateTmp=yes , а также разрешения экспортируемого файла rw-r----- .

Я пробовал изменять sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf и добавлять:

 secure-file-priv = /var/lib/mysql-files
 

Затем создайте скрипт, запускаемый root (исполняемый всеми), который перемещает файлы и правильно устанавливает разрешения. Однако это не только не элегантно, secure-file-priv но, похоже, не меняется даже после перезапуска MySQL:

 mysql> SELECT @@GLOBAL.secure_file_priv;
 --------------------------- 
| @@GLOBAL.secure_file_priv |
 --------------------------- 
| /tmp/                     |
 --------------------------- 
1 row in set (0.00 sec)
 

Пожалуйста, обратите внимание: я использую MySQL 8.0.22, и исправления из других потоков, похоже, не помогают.

Каков наилучший способ сделать это?