質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

1回答

864閲覧

CSVボタン押下時のCSVの出力です。

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2022/07/27 04:56

前提

DBから取得したデータを一覧画面に表示し、CSVボタン押下後、CSVデータがダウンロードする
という機能をPHPで作っています。

実現したいこと

CSVボタン押下後、CSVデータがダウンロードする

発生している問題・エラーメッセージ

・ループした結果、最期の1件しか出力しない
・ボタン押下時でなく、ロード時にCSV出力の処理が動く

該当のソースコード

<tn0010.php>

// CSV出力 $sqlC = ""; $sqlC .= " SELECT "; $sqlC .= " KANRINO,"; $sqlC .= " keiti.KEITAINM AS KEITAINM,"; $sqlC .=" YOUTO,"; $sqlC .=" tant.TANTNM AS TANTNM,"; $sqlC .=" MAKER,"; $sqlC .=" OS,"; $sqlC .=" IPADDRESS,"; $sqlC .=" CPUNM,"; $sqlC .=" DOMEIN,"; $sqlC .=" CPU,"; $sqlC .=" KOASU,"; $sqlC .=" MEMORI,"; $sqlC .=" DESK1,"; $sqlC .=" DESK2,"; $sqlC .=" DESK3,"; $sqlC .=" DESK4,"; $sqlC .=" DESK5,"; $sqlC .=" OSLICENCE,"; $sqlC .=" OFFICE,"; $sqlC .=" CASE WHEN KONYUYM IS NULL THEN '-' ELSE SUBSTR(TO_CHAR(KONYUYM,'000000'),1,5) || '/' || SUBSTR(TO_CHAR(KONYUYM,'000000'),6,2) END KONYUYM, "; $sqlC .=" CASE WHEN HAIKIYM IS NULL THEN '-' ELSE SUBSTR(TO_CHAR(HAIKIYM,'000000'),1,5) || '/' || SUBSTR(TO_CHAR(HAIKIYM,'000000'),6,2) END HAIKIYM, "; $sqlC .=" BIKO,"; $sqlC .=" KANRINO_OYA"; $sqlC .= " FROM "; $sqlC .= " public.M_TANMATU tanm "; $sqlC .= " LEFT JOIN "; $sqlC .= " public.M_TANT tant "; $sqlC .= " ON "; $sqlC .= " tanm.tantcd = tant.tantcd "; $sqlC .= " LEFT JOIN "; $sqlC .= " public.M_KEITAI keiti "; $sqlC .= " ON "; $sqlC .= " tanm.keitaikb = keiti.keitaikb "; $sqlC .= " ORDER BY" ; $sqlC .= " kanrino"; $resC = dbGetList($pdo_conn, $sqlC); $datalistC = dbGetList($pdo_conn, $sqlC); foreach($resC as $row) { $KANRINO[$count2] = $row['kanrino']; $KANRINO_OYA[$count2] = $row['kanrino_oya']; $IPADDRESS[$count2] = $row['ipaddress']; $KEITAINM[$count2] = $row['keitainm']; $YOUTO[$count2] = $row['youto']; $TANTNNM[$count2] = $row['tantnm']; $MAKER[$count2] = $row['maker']; $OS[$count2] = $row['os']; $CPUNM[$count2] = $row['cpunm']; $DOMEIN[$count2] = $row['domein']; $CPU[$count2] = $row['cpu']; $KOASU[$count2] = $row['koasu']; $MEMORI[$count2] = $row['memori']; $DESK1[$count2] = $row['desk1']; $DESK2[$count2] = $row['desk2']; $DESK3[$count2] = $row['desk3']; $DESK4[$count2] = $row['desk4']; $DESK5[$count2] = $row['desk5']; $OSLICENCE[$count2] = $row['oslicence']; $OFFICE[$count2] = $row['office']; $KONYUYM[$count2] = $row['konyuym']; $HAIKIYM[$count2] = $row['haikiym']; $BIKO[$count2] = $row['biko']; $W_CSV = array( "kanrino" => $KANRINO[$count2] ,"kanrino_oya" =>$KANRINO_OYA[$count2] ,"ipaddress" => $IPADDRESS[$count2] ,"keitainm" => $KEITAINM[$count2] ,"youto" => $YOUTO[$count2] ,"tantnm" =>$TANTNM[$count2] ,"mekar" => $MAKER[$count2] ,"OS" => $OS[$count2] ,"cpunm" => $CPUNM[$count2] ,"domein" => $DOMEIN[$count2] ,"CPU" => $CPU[$count2] ,"koasu" => $KOASU[$count2] ,"memori" => $MEMORI[$count2] ,"desk1" => $DESK1[$count2] ,"desk2" => $DESK2[$count2] ,"desk3" => $DESK3[$count2] ,"desk4" => $DESK4[$count2] ,"desk5" => $DESK5[$count2] ,"OSlicence" => $OSLICENCE[$count2] ,"Office" => $OFFICE[$count2] ,"konyuym" => $KONYUYM[$count2] ,"haikiym" => $HAIKIYM[$count2] ,"biko"=> $BIKO[$count2] ); $count2+=1; } function putCsv($data) { try { //CSV形式で情報をファイルに出力のための準備 $csvFileName = '/tmp/'. 'tanmatu.csv'; $res = fopen($csvFileName, "w"); if ($res === FALSE) { throw new Exception('ファイルの書き込みに失敗しました。'); } // 項目名先に出力 $header = ["kanrino", "kanrino_oya", "ipaddress", "keitainm","youto","tantnm","mekar","OS","cpunm","domein","CPU","koasu","memori", "desk1","desk2","desk3","desk4","desk5","OSlicence","Office","konyuym","haikiym","biko"]; fputcsv($res, $header); // ループしながら出力 foreach($data as $dataInfo) { // 文字コード変換。エクセルで開けるようにする mb_convert_variables('SJIS', 'SJIS', $dataInfo); // ファイルに書き出しをする fputcsv($res, (array)$dataInfo); } // ファイルを閉じる fclose($res); // ダウンロード開始 // ファイルタイプ(csv) header('Content-Type: application/octet-stream'); // ファイル名 header('Content-Disposition: attachment; filename=' . $csvFileName); // ファイルのサイズ ダウンロードの進捗状況が表示 header('Content-Length: ' . filesize($csvFileName)); header('Content-Transfer-Encoding: binary'); // ファイルを出力する readfile($csvFileName); } catch(Exception $e) { // 例外処理をここに書きます echo $e->getMessage(); } } putCsv($W_CSV);   $smarty->assign("W_KENSAKU", $W_KENSAKU); $smarty->assign("datalist", $datalist); $smarty->display("tn0010.tpl");

<tn0010.tpl>

<HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=UTF-8"> <LINK rel="stylesheet" type="text/css" href="./style.css"> <TITLE>test</TITLE> 中略 <TD><INPUT type="button" name="sa" value="CSV出力"></TD> 中略 <FORM name="form2" action="tn0010.php" method="POST"> <INPUT type="hidden" name="W_CSV" value=""> </FORM> </BODY> </HTML>

試したこと

functionの処理を.tplで試して、<INPUT type="hidden" name="W_CSV" value="" Onclick = "function名"();>にするのを試しました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

1)
$count2を初期化しないで使ってる、最初にゼロを詰めること。

2)
$W_CSVがそもそも常に上書きされて、最後のデータの1行分の配列しか入ってないよね。
そういうコードになってる。
そもそも、$KANRINO[$count2]$KANRINO_OYA[$count2]などに一旦代入したあとに$W_CSV = array(~~);で詰め直すのは無駄。

php

1 $W_CSV = []; // 初期化 2 foreach($resC as $row) { 3 $row = [ 4 "kanrino" => $row['kanrino'] 5 ,"kanrino_oya" => $row['kanrino_oya'] 6 ,"ipaddress" => $row['ipaddress'] 7 ,"keitainm" => $row['keitainm'] 8 ,"youto" => $row['youto'] 9 ,"tantnm" => $row['tantnm'] 10 ,"mekar" => $row['maker'] 11 ,"OS" => $row['os'] 12 ,"cpunm" => $row['cpunm'] 13 ,"domein" => $row['domein'] 14 ,"CPU" => $row['cpu'] 15 ,"koasu" => $row['koasu'] 16 ,"memori" => $row['memori'] 17 ,"desk1" => $row['desk1'] 18 ,"desk2" => $row['desk2'] 19 ,"desk3" => $row['desk3'] 20 ,"desk4" => $row['desk4'] 21 ,"desk5" => $row['desk5'] 22 ,"OSlicence" => $row['oslicence'] 23 ,"Office" => $row['office'] 24 ,"konyuym" => $row['konyuym'] 25 ,"haikiym" => $row['haikiym'] 26 ,"biko" => $row['biko'] 27 ]; 28 array_push($W_CSV, $row); // とか、$W_CSV[] = $row;とか 29 }

でいいんじゃないの?

3)
mb_convert_variables('SJIS', 'SJIS', $dataInfo); って面白いことしてるね。
通常、phpコードをutf-8で書いていて、データベースにもutf-8でアクセスしているから、
CSV出力するときにSJISにしたいんだよね?
ところで、通常SJISっていうと狭義のSJISになっちゃうので、
MS拡張漢字なども扱えるCP932っていうのを使うといいよ。
変換先に存在しない文字があるとエラーになるので注意ね。

4)
$smarty->assign("W_KENSAKU", $W_KENSAKU);
の前に全角空白があるから、たぶんここでエラーになる。
全角空白やタブ記号を表示できるエディタを使っておきたいところ。

5)
「ボタン押下時でなく、ロード時にCSV出力の処理が動く」の件は、
具体的にどうしたいんだろうか。
フォーム送信したらダウンロードさせるのか、
それともXHRとかAjaxとか使って実現させるのか、そういう話になるよ?
tn0010.php を実行すると、header()など使ってもうCSVダウンロードする流れになってて
putCsv($W_CSV); を無条件に実行しているんだけど、
一つのphpファイルでデータ表示処理とダウンロードさせる処理を兼ねるには、
そもそもの構造がおかしいよ。
一つのphpファイルで全部賄うのもいいけど、特段制約がなければ、
シンプルにデータ表示&確認用のphp、データダウンロード処理のみのphp、
って分けたほうが作りやすい。

フォーム送信したらダウンロードさせるやり方なら、
target="_blank"にしたPOST送信フォームの中にダウンロードボタンでも設置して、
POSTメソッドでフォーム受信したときだけ、
CSV出力処理を動かすようにでもしたら、とりあえず成り立つかもね。
$_SERVER['REQUEST_METHOD']でチェックできるし。

投稿2022/07/27 05:24

編集2022/07/27 05:41
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/07/27 05:25

って、上司に聞くからここは頼らないんだっけか?
退会済みユーザー

退会済みユーザー

2022/07/27 05:36

上司は外出ばかりでいないの。 一覧画面があって、上にボタンがあり、そのボタン押下したらCSVを出力したい 上司から以下のようなメールが来てたけど理解できない。外出先からはメール見れないらしいし。  CSV出力用のPGを別に作成し、そちらにPOSTした方が良いかも?→どういう意味か分かります?
退会済みユーザー

退会済みユーザー

2022/07/27 05:36

あと、載せ忘れたけど、初期化はしてあるよ。
退会済みユーザー

退会済みユーザー

2022/07/27 05:39

phpファイルを、データ表示用と、CSVダウンロード用に分けて作れ、って指示だろうね。 5)の後半に書いた流れと大体合ってる。
退会済みユーザー

退会済みユーザー

2022/07/27 05:41

複数行はできました。ありがとうございます。あとはロード時に動く問題と、文字化けのところなので、上のやつ参考にやります。
退会済みユーザー

退会済みユーザー

2022/07/27 05:53

tplファイルで、function putCsv($data) {内の処理できますか?
退会済みユーザー

退会済みユーザー

2022/07/27 06:55

tn0010.phpとtn0010.tplを一旦コピーして例えばtn0011.phpやtn0011.tplにして、 tn0010.phpでのPOST送信先をtn0011.phpにし、 putCsv()はtn0011.phpには残して、tn0010.phpからはなくして呼ばない。 そう分けるとわかりやすくなると思うけど。
退会済みユーザー

退会済みユーザー

2022/07/27 06:55

具体的に5)のやり方教えてください
退会済みユーザー

退会済みユーザー

2022/07/27 08:52

5)のどこがわからないか、詳しく。 コピペで動くコードを書くのはわたしはあまり良しとしないので、 要点を絞ってほしい。 できないのか、わからないのか、仕組みがわからないのか、構造がわからないのか、動かないのか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問