PHPでCSVデータのダウンロードを行う上での達成手順を教えてください
皆様 いつも大変お世話になっております。
こちらの記事 https://blog.supersonico.info/?p=869
を参考にPHPでのCSVデータのダウンロードに挑戦中です。
適用方法が分からなくてお問い合わせさせて頂きました。
こちらの起動を果たすため、当方はHTML兼PHPのWebページに INPUT要素(SUBMITボタン)を配置して実行するようにしてみました。
すると、CSVファイルは確かに提供されるのですが、以下のコードがそのまま収まって提供されてしまいます。(DOCTYPE htmlから/htmlまで)
===質問===
WebページのINPUT要素(SUBMITボタン)の押下から この機能を正常に機能させるには
本来どういった適用を行うべきなのでしょうか?
初歩的なことと思いますが よろしくお願い致します。
====追記=====
実は本件が未だ解決していません...というのもCSVデータ云々以前の話で悩んでいて。
cubickさんyyzさんのご見解から、CSV出力指示の画面とCSVデータを提供するPHPを別にしようと考え始めました。
CSV出力指示の画面は、利用者が任意に指定する内容(パラメータ)をTableへ表示するためのsubmitボタンを既に有しており、この隣にCSVデータを出力するためのsubmitボタンを追加で配置しました。
一フォーム内で2つ目のsubmitボタンを配置してしまった為、CSVデータ用途のsubmitボタンを押下しても
Table表示用途のsubmitが押下された際同様 Tableが表示されてしまう事態が起こってしまっています。
かといって、一Webページ内に別フォーム要素を設けて、こちらにCSVデータ出力用のsubmitボタンを格納してしまうと利用者が任意に指定する内容(パラメータ)が元フォーム側に配置しているため利用できない...また全く同じDBへのアクセス・SELECT発行なので、Table表示内容のデータ取得部分までは、既存のPHPロジックを活用したい、という点で思い悩んいます。
指示画面のPHPとは別のPHPで CSVデータの提供を達成する、の解決策で
指示画面側にユーザ指定値が入力されるケースではどういった対応手順を検討すべきなのでしょうか?
データセット(配列?)の取得までは指示画面側のロジックを流用したい、というのはやはり怠惰な考え方でしょうか
想像以上に初心者ですみません
====更に追記====
CSV出力のために別PHPを動作させる方法が分からなく 現在も試行錯誤中です...。以下に示したコードでは『CSVファイルにデータ以外のHTMLが現れている状況です』。
EXECとやらを利用するのでしょうか??上部の$stmt->execute();の結果を別PHPで利用するようなことを達成したいのですが...。試しにheader関数部分のみを別PHPに記載してこのPHPをEXECで呼び出すようにしてみたら、当該phpがエディタとしてあがってくるだけでした。
またcubickさんのご見解で「HTML中にPHPを埋め込んで」との記載がありましたので、/htmlの下でPHPを再開させ header関数部分のみを記載するようにしてみましたが、状況は変わらず『出力されるCSVファイルにデータ以外のHTMLが現れていしまう状況でした』。
CSV出力の実行指示画面はTableを生成して表示するPHPも兼ねているので、現在のところHTMLの中でTeble用のDB抽出も行ってしまっている状況です。
考え方を改めるべきか、ただ単に別PHPの起動方法を理解すべきなのか、ちょっと分からなくなってしまいました。
どうすれば、CSVにデータのみを出力できるのでしょうか?
$stmt->execute(); //★流用したい
//★テーブルのページインデックス押下か、検索ボタン(submit)押下
if (!isset($_POST["extbtn"]) || $_POST["extbtn"] != "CSV") {
$recset = $stmt->fetchAll(PDO::FETCH_ASSOC);
$recCount = count($recset);
//★CSVボタン(submit)押下
} else {
$file_path = "sample.csv";
$export_csv_title = ["申請№", "№", "種別", "受領書確認", "営業所名", "担当者名", "受注先名称",
"施設名称", "出庫日", "品名CD", "品名名称", "容量", "ロット№", "数量", "単価", "金額", "経費負担部所",
"受付予定者", "受付結果", "受付実施者", "受付実施日", "承認予定者", "承認結果", "承認実施者",
"承認実施日", "更新日", "社内備考"];
foreach($export_csv_title as $key => $val) {
$export_header[] = mb_convert_encoding($val, 'SJIS-win', 'UTF-8');
}
if (touch($file_path)){
$file = new SplFileObject($file_path, "w");
$file->fputcsv($export_header);
while($row_export = $stmt->fetch(PDO::FETCH_ASSOC)){
$export_arr = "";
foreach( $row_export as $key => $val ){
$export_arr[] = mb_convert_encoding($val, 'SJIS-win', 'UTF-8');
}
$file->fputcsv($export_arr);
}
$dbh = null;
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=temporary.csv');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($file_path));
readfile($file_path);
}
exit;
//goto lb_finish;
}
//****以降 テーブル表示・ページインデックス生成のコーディング