CSVのダウンロード処理を実装しておりますが、うまく行くときと行かない時があり、アドバイスをいただきたいです。。
色々と条件を変えてみて、どうやら列が増えるとダウンロードに失敗するようです。
列が増えるとダウンロードできない、などありますでしょうか??
以下、コードになります。
###コード
common.php (ダウンロード用関数)
function download_csv($file_name, $data) { $fp = fopen('php://output', 'w'); // UTF-8からSJIS-winへ変換するフィルター stream_filter_append($fp, 'convert.iconv.UTF-8/CP932//TRANSLIT', STREAM_FILTER_WRITE); foreach ($data as $row) { fputcsv($fp, $row, ',', '"'); } fclose($fp); header('Content-Type: application/octet-stream'); header("Content-Disposition: attachment; filename={$file_name}"); header('Content-Transfer-Encoding: binary'); exit(); }
test.php ★成功時 (入れるデータをemailまででストップ)
<?php require_once("../common/common.php"); //orderテーブル if(connect_db()) { $sql = "SELECT * FROM {$dbname}.order ORDER BY created_at DESC;"; $stmt = $dbh->prepare($sql); $stmt->execute(); $records = $stmt->fetchAll(); } else { } //ダウンロード用のデータを成型 $data = []; $i = 0; $data[$i] = [ //ヘッダーをセット "注文番号", "購入商品", "個数", "金額", "ChargeId", "ステータス", "納品日", "名前", "カナ", "Email", "電話番号", "郵便番号", "住所", "お得な情報", "メモ", "ご注文日時" ]; foreach($records as $record) { $i++; $data[$i][] = $record["order_id"]; $data[$i][] = $record["product_name"]; $data[$i][] = $record["buy_num"]; $data[$i][] = $record["product_price"] * $record["buy_num"]; $data[$i][] = $record["charge_id"]; $data[$i][] = get_status($record["status"],$record["auto_canceled"]); $data[$i][] = $record["sended_day"]; $data[$i][] = $record["name"]; $data[$i][] = $record["name_kana"]; $data[$i][] = $record["email"]; } $file_name = "test.csv"; download_csv($file_name, $data);
test.php ★失敗時 (入れるデータを全て)
<?php require_once("../common/common.php"); //orderテーブル if(connect_db()) { $sql = "SELECT * FROM {$dbname}.order ORDER BY created_at DESC;"; $stmt = $dbh->prepare($sql); $stmt->execute(); $records = $stmt->fetchAll(); } else { } //ダウンロード用のデータを成型 $data = []; $i = 0; $data[$i] = [ //ヘッダーをセット "注文番号", "購入商品", "個数", "金額", "ChargeId", "ステータス", "納品日", "名前", "カナ", "Email", "電話番号", "郵便番号", "住所", "お得な情報", "メモ", "ご注文日時" ]; foreach($records as $record) { $i++; $data[$i][] = $record["order_id"]; $data[$i][] = $record["product_name"]; $data[$i][] = $record["buy_num"]; $data[$i][] = $record["product_price"] * $record["buy_num"]; $data[$i][] = $record["charge_id"]; $data[$i][] = get_status($record["status"],$record["auto_canceled"]); $data[$i][] = $record["sended_day"]; $data[$i][] = $record["name"]; $data[$i][] = $record["name_kana"]; $data[$i][] = $record["email"]; $data[$i][] = $record["phone"]; $data[$i][] = $record["zip_code"]; $data[$i][] = $record["address"]; $data[$i][] = $record["getinfo"]; $memo = preg_replace('/\n|\r|\r\n/', ' ', $record["memo"] ); $data[$i][] = $memo; $data[$i][] = $record["created_at"]; } $file_name = "test.csv"; download_csv($file_name, $data);
ちなみに、データを作っているforeachの部分を、
foreach($records as $record) { $i++; $data[$i][] = $record["order_id"]; $data[$i][] = $record["product_name"]; $data[$i][] = $record["buy_num"]; $data[$i][] = $record["product_price"] * $record["buy_num"]; $data[$i][] = $record["charge_id"]; $data[$i][] = get_status($record["status"],$record["auto_canceled"]); $data[$i][] = $record["sended_day"]; $data[$i][] = $record["name"]; $data[$i][] = $record["name_kana"]; $data[$i][] = $record["email"]; $data[$i][] = $record["phone"]; }
にしても失敗。
emailまでだと成功しますが、emailの代わりにphoneにしても成功します。
↓こちらは成功。
foreach($records as $record) { $i++; $data[$i][] = $record["order_id"]; $data[$i][] = $record["product_name"]; $data[$i][] = $record["buy_num"]; $data[$i][] = $record["product_price"] * $record["buy_num"]; $data[$i][] = $record["charge_id"]; $data[$i][] = get_status($record["status"],$record["auto_canceled"]); $data[$i][] = $record["sended_day"]; $data[$i][] = $record["name"]; $data[$i][] = $record["name_kana"]; $data[$i][] = $record["phone"]; }
エラーの時は、特にエラー文が出るというわけでもなく、
中身が画面に表示されます。
↑このような感じです。
成功するときは、このような文字化けはなく、正常にCSVダウンロードされます。
アドバイスをいただけますと幸いです。何卒、よろしくお願いいたします。
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/10 06:23 編集