Когда кто-то зарегистрирован в моей базе данных MySQL, эта функция должна работать:
mysql_query("SELECT mail FROM users INTO OUTFILE 'test.txt'");
Но я получаю ошибку
Доступ запрещен для пользователя 'registerdb' @ '%' (с использованием пароля: YES)
Итак, как я предоставляю разрешение FILE на сеанс / пользователь?
Chek для разрешений этого пользователя:
SHOW GRANTS ДЛЯ 'registerdb' @ '%'
Если в списке отсутствует разрешение FILE, просто добавьте его:
ГРАНТ ФАЙЛ . to 'registerdb' @ '%'
а потом:
ПРИВИЛЕГИИ ФЛЮЗА;
Но остерегайтесь, предоставляя разрешение FILE на *.*
Вы по существу предоставляете этому пользователю полный доступ к любому файлу сервера .
Чтобы ограничить ограничение местоположения, в котором файлы могут быть прочитаны и записаны, установите систему secure_file_priv в определенный каталог .
Сначала вам нужно удалить файл за пределами MySQL, в MySQL нет функции, которая может удалить или перезаписать файл.
Это мера безопасности, и вы должны быть благодарны за этот факт.
Обратите внимание, что может быть сложно определить, где именно MySQL хранит свои файлы.
Обычно я использую
LOAD DATA INFILE 'nonexistingfile' INTO validtable
Ошибка, которая генерирует, дает вам полный путь для текущей базы данных, в SELECT ... INTO OUTFILE
будет записываться SELECT ... INTO OUTFILE
.
Вы можете использовать различные способы удаления (или улучшения перемещения) файла, на cron-job
приходит cron-job
.
Вы даже можете написать пользовательский UDF, который сделает удаление для вас, хотя это угроза безопасности мэра и программисты, которые делают это, заслуживают судьбу хуже чем-то ужасного.
Другой вариант – сделать
START TRANSACTION; SELECT @today:= CURDATE(); INSERT INTO saved_mail_log (filename, whensaved, user_id) VALUES (CONCAT(@today,'mailsave.csv'), @today, '1234'); SELECT mail FROM users WHERE user_id = '1234' INTO OUTFILE CONCAT(@today,'mailsave.csv'); COMMIT;
Я не уверен на 100%, что вы можете использовать функцию для создания параметра OUTFILE
, если вам не нужно будет выбирать это значение и вводить его в запрос с использованием динамического SQL.
Вы можете получить последний файл, используя:
SELECT * FROM saved_mail_log WHERE user_id = '1234' ORDER BY whensaved DESC LIMIT 1