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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

PHP

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

Q&A

解決済

3回答

1074閲覧

phpでCSVダウンロード機能が上手くいかない

yoheiiii

総合スコア86

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

PHP

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

0グッド

0クリップ

投稿2022/07/05 05:48

編集2022/07/05 17:00
foreach($datas as $data){ $list = array( $data['OrderId'], $data['EnterpriseId'], $data['EnterpriseNameKj'], $data['EntCustId'], $data['NameKj'], $data['比較対象'], "顧客名が誤っている", $data['補足情報'], ); } $head = ['注文ID', '事業者ID', '加盟店名', '加盟店顧客番号', '顧客名', '比較対象', 'アラート内容', '補足情報']; mb_convert_variables('SJIS','UTF-8',$head); mb_convert_variables('SJIS','UTF-8',$list); header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment; filename=商品リスト_{$date}.csv"); //ファイルを開く $stream = fopen('php://output', 'w'); //ヘッダーを書き込み fputcsv($stream, $head); //レコードを書き込み foreach($list as $record){ fputcsv($stream, $record); } exit();

イメージ説明
csvは出力されますが、レコードの部分が上手くいきません。
ご教授頂けないでしょうか?

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

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

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

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

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

yoheiiii

2022/07/05 06:26

追記になります。 試しに$listを $list = array( array("a","b","c","c","c","c","c","c"), array("k","b","c","c","c","c","c","c"), array("y","b","c","c","c","c","c","c"), ); のような形式にしたところ上手くいきました。 添付の$listの中身を上記の形式にするにはどうすればよろしいでしょうか?
退会済みユーザー

退会済みユーザー

2022/07/05 06:26

$list のサンプルは示されないの?
yoheiiii

2022/07/05 06:28

わかりにくく申し訳ございません。 添付の下部に記載しております。
退会済みユーザー

退会済みユーザー

2022/07/05 06:33

あのさぁ、画像でvar_dump()を示されてさぁ、関心のある人にいちいち手入力をさせるのは、悪手だよ。逆の立場でモノを考えてみたら、これをもとにサンプルコードを書くのは面倒だなって気づくと思うんだけど。
yoheiiii

2022/07/05 06:37

配慮が足りず申し訳ございません。 以後このようなことがない様に致します。
guest

回答3

0

ベストアンサー

fputcsv($stream, $record);$recordがarrayじゃなくstringで渡されてる箇所を特定すればOK。
$listを詰めてる箇所のソースコードがないので、我々は感知不能。

とりあえず現状で出力したいなら

php

1if (is_array($list)) { 2 foreach($list as $record){ 3 fputcsv($stream, $record); 4 } 5} 6else { 7 fputcsv($stream, $list); 8}

とか。


更新されたソースコードを見ましたが、
foreach($datas as $data)ループの内側で
header()でCSVダウンロードの手順を踏んで出力するの、アルゴリズムとして間違ってますよね。

示されたコードの範囲内で、順序の見直しなどを加えると、こうなる。

php

1header("Content-Type: application/octet-stream"); 2header("Content-Disposition: attachment; filename=商品リスト_{$date}.csv"); 3 4$head = ['注文ID', '事業者ID', '加盟店名', '加盟店顧客番号', '顧客名', '比較対象', 'アラート内容', '補足情報']; 5mb_convert_variables('SJIS','UTF-8',$head); 6 7$stream = fopen('php://output', 'w'); 8 9fputcsv($stream, $head); 10 11foreach ($datas as $data){ 12 $list = array( 13 $data['OrderId'], 14 $data['EnterpriseId'], 15 $data['EnterpriseNameKj'], 16 $data['EntCustId'], 17 $data['NameKj'], 18 $data['比較対象'], 19 "顧客名が誤っている", 20 $data['補足情報'], 21 ); 22 mb_convert_variables('SJIS','UTF-8',$list); 23 24 fputcsv($stream, $list); 25}

ただし、もうちょっとうまいやり方がネット上にいくつもある。

PHPで配列をCSV出力する - Qiita
この事例は、SplFileObjectを使うやり方、一旦一時ファイルにCSV出力したものをダウンロードさせるやり方。

一レコードごとにUTF-8→SJIS変換せず、一旦UTF-8のまま出力して、ファイルまるごとSJIS変換しちゃう方法もできそう。

投稿2022/07/05 06:27

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

退会済みユーザー

総合スコア0

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

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

yoheiiii

2022/07/05 07:24

ご回答ありがとうございます。 まだ上手くいっておりません。 $listを詰めてる箇所のソースコード追記致しました。 現状arrayでしかやっておらずstringで渡す方法がわかっておりません。 $list = array( array("a","b","c","c","c","c","c","c"), array("k","b","c","c","c","c","c","c"), array("y","b","c","c","c","c","c","c"), ); 上記のような形式にする方法をご教授頂けないでしょうか?
退会済みユーザー

退会済みユーザー

2022/07/05 07:42

あくまで机上のコードなので、デバッグよろしく。
退会済みユーザー

退会済みユーザー

2022/07/05 07:54 編集

UTF-8からSJISへの変換で、狭義のSJISコードに存在しない文字を含んでいるとそこで落ちるので、 許容されるなら"SJIS-WIN"を使うといいかも。 https://www.php.net/manual/ja/mbstring.encodings.php
yoheiiii

2022/07/05 08:00

出来ました。 細かくご教授頂きありがとうございました。 また貴重なお時間ありがとうございました。 記載順序など注意し行っていきます。 本当にありがとうございました。
guest

0

$listはforeachで一要素ずつ取り出す前の配列ですよね?
fputcsv($stream, $list);ではなくfputcsv($stream, $record);では?

投稿2022/07/05 06:14

RiaFeed

総合スコア2701

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

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

yoheiiii

2022/07/05 06:23

すみません。 記載ミスです。 fputcsv($stream, $record); で行っております。
guest

0

ぱっと見で間違いだろうな、と思うのは

foreach($list as $record){ fputcsv($stream, $list); }

ですね。わざわざforeachで回してるのに、毎回 $list をputしてもダメでしょう。ここで使うならおそらく$recordなんでしょうが、それをそのままで良いのかまでは分かりません。とりあえずまずはここを見直してみるとどうでしょうか?

投稿2022/07/05 06:07

AbeTakashi

総合スコア4470

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

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

yoheiiii

2022/07/05 06:13

失礼致しました。 記載ミスです。 $recordでやってます。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問