40893


皆様 いつも大変お世話になっております。  
こちらの記事 <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にデータのみを出力できるのでしょうか？

[code]

    $stmt->execute();       //★流用したい
    
    //★テーブルのページインデックス押下か、検索ボタン(submit)押下
    if (!isset($_POST["extbtn"]) || $_POST["extbtn"] != "CSV") {
        $recset = $stmt->fetchAll(PDO::FETCH_ASSOC);
        $recCount = count($recset);
    //★ＣＳＶボタン(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;
    }
    //****以降　テーブル表示・ページインデックス生成のコーディング
    
[/code]

[![画像の説明をここに入力](https://i.stack.imgur.com/XDpDS.png)](https://i.stack.imgur.com/XDpDS.png)


CC BY-SA 3.0
2018-01-11T13:37:45.030
40890
2018-01-30T03:55:44.343
2018-01-30T03:55:44.343
25696
25696
question
php csv
PHPでCSVデータのダウンロードを行う上での達成手順を教えてください


参照先の例ではPHP単体にアクセスするとブラウザにCSVデータをダウンロードさせる仕組みです。  
同じように「CSV出力用のPHP」と「PHP呼び出し=ダウンロードボタン表示用のHTML」という様に別々にファイルを用意し、HTMLページからPHPを呼び出すようにしてはどうでしょうか。

質問文に書かれたような、HTML中にPHPを埋め込んで **自分自身**
を呼び出してしまうと、HTML部分の記述が邪魔をして意図した動きにならないのではないかと思います。


CC BY-SA 3.0
2018-01-11T14:29:25.053
40891
2018-01-11T14:29:25.053
3060
40890
answer


参考までに、phpからcsvデーターをダウンロードさせる、もっと単純なコードサンプルです。  
（注意、色々な事を省略しています。あくまでも動作確認サンプルです。）

[code]

    <?php    if(isset($_GET["download"])){
    
            $filename = $_GET["filename"].'.csv';
    
            $csv_a = array("NO","日付","フラグ","タイトル","名","姓","ファイル名","ファイル名２","ファイル名３","ファイル名4","リンク先","速度","タグ....");
            $csv_b = array("10987654321","2017-10-19","a1","data1","data1","data1","file1","file2","file3","file4","link1","30","タグ1","タグ２","タグ３","タグ４","タグ５","タグ６","....","タグｎ");
            $csv_c = array("10987654321","2017-10-19","a1","data1","data1","data1","file1","file2","file3","file4","link1","30","タグ1","タグ２","タグ３","タグ４","タグ５","タグ６","....","タグｎ");
    
            header('Content-Type: application/force-download');
            header('Content-Disposition: attachment; filename="'.$filename.'"');
            echo mb_convert_encoding ( implode(",", $csv_a),'SJIS-win',"UTF-8")."\r\n";
            echo mb_convert_encoding ( implode(",", $csv_b),'SJIS-win',"UTF-8")."\r\n";
            echo mb_convert_encoding ( implode(",", $csv_c),'SJIS-win',"UTF-8")."\r\n";
            exit;
        }
        ?>
        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <title>Title</title>
        </head>
        <body>
        <form method="get" action="csvfile.php">
            <input name="filename" type="text" placeholder="csv file name">
            <button type='submit' name="download" value="download">download</button>
        </form>
        </body>
        </html>
    
[/code]

**追記**  
submitされたボタン内容を確認するサンプル （test.phpとしてファイルを作成）

[code]

    <?php
    if(isset($_POST['send']) && $_POST['send'] === 'csv'){
        echo 'csv<br>';
    }elseif(isset($_POST['send']) && $_POST['send'] === 'disp'){
        echo 'disp<br>';
    }
    if(isset($_POST['send']) && $_POST['send'] === 'incsv'){
        echo 'incsv<br>';
    }elseif(isset($_POST['send']) && $_POST['send'] === 'indisp'){
        echo 'indisp<br>';
    }
    foreach($_POST as $key=>$data){
        echo $key.' : '.$data.'<br>';
    }
    ?>
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <form method="post" action="test.php">
        <button name="send" value="csv">csv</button>
        <button name="send" value="disp">disp</button>
        <input type="submit" name="send" value="incsv">
        <input type="submit" name="send" value="indisp">
        <input type="text" name="text1" value="text1">
        <input type="text" name="text2" value="text2">
        <input type="text" name="text3" value="text3">
        <input type="text" name="text4" value="text4">
        <input type="text" name="text5" value="text5">
    </form>
    </body>
    </html>
    
[/code]


CC BY-SA 3.0
2018-01-11T16:58:29.043
40893
2018-01-29T02:11:06.163
2018-01-29T02:11:06.163
22793
22793
40890
answer