Q&A
実現したいこと
SELECT したデータをCSVにしてダウンロードする方法を実現したい
前提
環境は CentOS7 です。
PHP 等でデータを取得、自分で CSV を作れば良いのだろうけど、入れたり出したりや文字コードでめんどくさくなりたいくないのでmysqlコマンドで出力させたいのです。
しかし、mysqlコマンドを実行する shell 側でデータを弄ると、これまた文字コードや改行コードでめんどくさいことになりました。
しかたないので、いっその事、MySQL側で作成した CSV を使用しようと思っています。
具体的には INTO OUTFILE を使用したいと思っています。
発生している問題・エラーメッセージ
ファイルを吐き出すとユーザグループ共mysqlとなっており、パーミッションは644で、mysql側でしか操作できません。
そして、INTO OUTFILE はファイルの上書きをしてくれません。
つまり、正規の方法でゆくと、
・mysqlコマンドで INTO OUTFILE を使用してCSVファイルを吐き出す
・次のコマンド実行の前にmysqlユーザかrootユーザでファイルを消す
という作業が必要になります。
これをWEBインターフェースでやろうとして、困っています。
mysqlが吐き出したファイルをapacheから削除やリネームが出来ません。
何か良いアイディアは無いでしょうか。
最悪、rootのcronで当該ファイルを定期的に削除するしか無いかな、と思っています。
該当のソースコード
php
1<?php 2$file = "/tmp/test.csv"; 3shell_exec("sh ./test.sh"); 4header('Content-Type: text/csv'); 5header('Content-Disposition:attachment;filename = "'.basename($file).'"'); 6header('Content-Length: ' . filesize($file)); 7echo file_get_contents($file); 8exit;
shell
1#!/bin/bash 2rm -f /tmp/test.csv 3mysql -u root -p**** test_db <<EOT 4 SELECT * FROM test 5INTO OUTFILE '/tmp/test.csv' 6FIELDS TERMINATED BY ',' 7 ENCLOSED BY '\"' 8 ESCAPED BY '' 9LINES 10 TERMINATED BY '\r\n' 11EOT
試したこと
ちなみに、/tmp に吐き出すと、systemd のせいで、tmp の位置すら違うのでmysql, apache共にPrivateTmpはfalseにしています。
よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2023/03/27 09:51
2023/03/31 14:28