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

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

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

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

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

1386閲覧

フォームから入力された値を元にMySQLのデータベースをCSVに出力したい

退会済みユーザー

退会済みユーザー

総合スコア0

CSV

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

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2020/01/24 08:10

XAMPPにあるデータベース(10.3.15-MariaDB)を使っています。

PHPにポストされた値を元に、データベースに登録済みのデータをCSVに出力するプログラムを作ろうとしています。

下記のような感じまではなんとか作ってみました。

PHP

1<?php 2 3 // DB接続設定 4 $dsn = "mysql:dbname=generalworks;host=localhost;charset=utf8"; 5 $user = "root"; 6 $password = ""; 7 $options = [ 8 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 9 PDO::ATTR_EMULATE_PREPARES => false, 10 ]; 11 12 try { 13 14 // DB接続 15 $pdo = new PDO($dsn, $user, $password, $options); 16 $sql = "SELECT * FROM `vtw100list`"; 17 $stmt = $pdo->query($sql); 18 $res = $stmt->fetchAll(PDO::FETCH_ASSOC); // FETCHモード利用 19 20 } catch (PDOException $msg) { 21 $msg -> getMessage(); 22 exit(); 23 } 24 25 26 // 動作モードの指定 27 if(isset($_POST['mode'])){ 28 $select_mode = $_POST['mode']; 29 } 30 else { 31 $select_mode = 'output'; 32 } 33 34 35 // モード別動作指定&実行 36 switch ($select_mode) { 37 case 'output': 38 $msg = '出力画面モード'; 39 break; 40 case 'putfile': 41 $msg = 'ファイル出力モード'; 42 put_csv_file(); 43 break; 44 default: 45 $msg = 'モード未指定'; 46 break; 47 } 48 49function put_csv_file(){ 50 51 52 // 初期化 53 $data[] = ''; 54 55 56 // 処理区分コード 57 $qry_class = $_POST['execPeriod']; 58 59 if(!isset($qry_class)){ 60 $iclass = '0'; 61 } else { 62 $iclass = $qry_class; 63 } 64 65 try { 66 67 // DB接続時にfetchモードを指定 68 $pdo = new PDO('mysql:host=localhost;dbname=generalworks;charset=utf8', 'root', '', 69 [PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC]); 70 71 foreach ( 72 $pdo -> query( 73 "SELECT * FROM vtw100n WHERE `vn05str` = '" . $iclass ."' ORDER BY `vn02str`,`vn03str`") 74 AS $row 75 ) { 76 $data[] = $row; 77 } 78 } 79 catch (PDOException $e) { 80 header('content-type: text/plain'); 81 die("データベース接続に失敗しました。: " . $e->getMessage() . "\n"); 82 } 83 84 85 // ファイル名の初期値 86 $fileName = "Untitled.csv"; 87 88 89 // ダウンロード 90 header("Content-Description: File Transfer"); 91 header('Content-Disposition: attachment;filename="' . $fileName . '"'); 92 93 94} 95 96?> 97 98 99<!DOCTYPE html> 100<html> 101<head> 102<meta charset="UTF-8"> 103<title>総務部:自動処理化プログラム</title> 104<link rel="stylesheet" href="./css/style.css" /> 105<!-- jQuery --> 106<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> 107<!-- jQuery UI --> 108<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script> 109<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/jquery-ui.css"> 110<style type="text/css"> 111<!-- 112 113--> 114</style> 115<script> 116<!-- 117$(function() { 118 $( "#tabs-i01" ).tabs(); 119}); 120--> 121</script> 122</head> 123 124<body> 125 126 127<div class="outer"> 128<h1 class="h1title">勤怠実績:月次台帳</h1> 129<div id="tabs-i01"> 130 <ul> 131 <li><a href="#tabs-1">登録</a></li> 132 <li><a href="#tabs-2">入力</a></li> 133 <li><a href="#tabs-3">出力</a></li> 134 </ul> 135 136 <div id="tabs-1"> 137 <div class="inner innerG clearfix"> 138 <h2 class="h2title">月次台帳の出力</h2> 139 <p class="MonthLedge"><strong>”只今準備中です。今しばらくお待ち下さい。”</strong></p> 140 141 <p class="MonthLedge"><?php if(isset($msg)){ echo $msg; }; ?></strong></p> 142 143 <form action="<?php echo basename(__FILE__); ?>" method="POST" enctype="multipart/form-data"> 144 145 <input type="hidden" name="mode" value="putfile"> 146 147 <div class="searchPeriod"> 148 149 <fieldset> 150 151 <legend>帳票の出力期間の選択</legend> 152 153 <select name="execPeriod"> 154 <option value="">お選びください</option> 155 156 <?php foreach ($res as $val) { ?> 157 <option value="<?php echo $val["disp"]; ?>"><?php echo $val["disp"]; ?></option> 158 <?php } ?> 159 160 </select> 161 162 <input type="submit" class="btn" value="月次台帳の帳票(CSV)を出力する"> 163 164 </fieldset> 165 </form> 166 </div><!-- /searchPeriod --> 167 168 </div><!--- /inner ---> 169 </div><!--- /tabs-3 ---> 170 171</div><!--- /tabs-i01 ---> 172</div><!--- /outer ---> 173 174</body> 175 176</html>

これを実行すると、プログラム内部のHTML部分が格納され、指定したファイル名が出力されます。

なお、ファイルを出力しない「初期画面」では、きちんと「帳票出力期間」のオプションリストがきちんと生成されていたので、データベースの接続設定などは大丈夫だと思います。

データベースの内容**'vn05str'$_POST['execPeriod']**と一緒となるデータを、**ビュー'vtw100n'**から抽出して、ファイル名(初期値)"Untitled.csv"エクスプローラを開いて保存できるようにするには、**ファンクション:put_csv_file()**のどの部分を直せばよろしいでしょうか。

素人の私がいろんなサイトの情報を参考に作りました。
もともと知識がないところから始めていますので、説明の至らぬところがたくさんあると思いますがお許し頂きたく存じます。

お手数おかけいたしますが、よろしくお願いいたします。

追伸:ビュー'vtw100n'の構造は下記の通りです。

MySQL

1SELECT 2 `vf01str` AS `vn01str`, 3 `vf02str` AS `vn02str`, 4 `vf03str` AS `vn03str`, 5 `vf04str` AS `vn04str`, 6 `vf05str` AS `vn05str`, 7 `vf06str` AS `vn06str`, 8 `vf07str` AS `vn07str`, 9 `vf08str` AS `vn08str`, 10 `vf09str` AS `vn09str`, 11 `vf10str` AS `vn10str`, 12 `vf11str` AS `vn11str`, 13 `vf12str` AS `vn12str`, 14 `vf13str` AS `vn13str`, 15 `vf14str` AS `vn14str`, 16 `vf15str` AS `vn15str`, 17 CASE 18 WHEN SIGN( `vf16str` ) = -1 THEN 0 19 WHEN SIGN( `vf16str` ) = 0 THEN 0 20 ELSE `vf16str` 21 END 22 AS `vn16str`, 23 `vf17str` AS `vn17str`, 24 `vf18str` AS `vn18str`, 25 `vf19str` AS `vn19str`, 26 `vf20str` AS `vn20str`, 27 `vf21str` AS `vn21str`, 28 `vf22str` AS `vn22str`, 29 `vf23str` AS `vn23str`, 30 `vf24str` AS `vn24str`, 31 `vf25str` AS `vn25str`, 32 `vf26str` AS `vn26str` 33 34FROM 35 `vtw100f` 36 37ORDER BY 38 `vn02str`, 39 `vn03str` 40;

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

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

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

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

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

Orlofsky

2020/01/24 09:48

CREATE VIEW を実行するためにはビュー中で使っているテーブルのCREATE TABLEが必要です。 文字型列の中に , が含まれるならその文字列をダブルクォートで囲まなければなりませんからデータの内容もチェックしておく必要があります。
退会済みユーザー

退会済みユーザー

2020/01/27 01:08

TABLEもVIEWも作成済みです。phpMyAdmin上ではTABLEもVIEWも抽出・表示確認できています。 また、既にデータベースにはデータが登録済みで、そのデータを(VIEWから)CSVで出力したいと思っております。
guest

回答1

0

ベストアンサー

php

1 // 処理区分コード 2 $qry_class = $_POST['execPeriod'];

$_POST['execPeriod']を受信していない状態で呼ばれるとここでNotice: Undefined indexが出そうだね。
if (isset($_POST['execPeriod'])) { ~ }するとよいかも。


php

1 foreach ( 2 $pdo -> query( 3 "SELECT * FROM vtw100n WHERE `vn05str` = '" . $iclass ."' ORDER BY `vn02str`,`vn03str`") 4 AS $row 5 ) {

斬新なコードだね、うごくの?
PDO::queryの戻り値はPDOStatementオブジェクトなので、
$data[] = $row;として配列に叩き込んでいるのはPDOStatementであって、
ほしいCSVのようなものではないのです。

php

1$stmt = $pdo->prepare("SELECT * FROM vtw100n WHERE `vn05str` = :iclass ORDER BY `vn02str`,`vn03str`"); 2$stmt->bindValue(':iclass', $iclass, PDO::PARAM_STR); 3$stmt->execute(); 4$rows = $stmt->fetchAll(PDO::FETCH_ASSOC|PDO::FETCH_UNIQUE); 5$data += $rows;

とか書いたらどうだろう? 知らんけど。あくまで机上のコードだし、MySQL専門外なので。


CSVファイルの出力に関しては、SplFileObjectを使うと楽かもしれない。
基礎:PHPでDBからCSVを出力する(簡易版) - Qiita

投稿2020/01/24 13:30

編集2020/01/27 04:15
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2020/01/27 01:10

お返事ありがとうございます。 ---PHP <?php // 処理区分コード if (isset($_POST['execPeriod'])) { $iclass = $_POST['execPeriod']; } else { $iclass = '202001'; } try { // DB接続時にfetchモードを指定 $pdo = new PDO('mysql:host=localhost;dbname=generalworks;charset=utf8', 'root', '', [PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC]); $stmt = $pdo-> prepare("SELECT * FROM `vtw100n` WHERE `vn05str` = :iclass ORDER BY `vn02str`,`vn03str`"); $stmt -> bindValue(':iclass', $iclass, PDO_PARAM_STR); $stmt -> execute(); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC|PDO::FETCH_UNIQUE); $data += $rows; } catch (PDOException $e) { header('content-type: text/plain'); die("データベース接続に失敗しました。: " . $e->getMessage() . "\n"); } // ファイル名の初期値 $fileName = "Untitled.csv"; // ダウンロード header("Content-Description: File Transfer"); header('Content-Disposition: attachment;filename="' . $fileName . '"'); ?> --- で動作確認しようと思ったのですが動作しませんでした。
退会済みユーザー

退会済みユーザー

2020/01/27 03:05

「動作しませんでした」だけじゃ、第三者に様子は伝わりません。 解決させるつもりがあるなら、webブラウザ上でどういう表示になっているのか、error_logに何らかのエラーメッセージが出力されていないか、文法ミスがないか然るべきチェックツールにかけるとか、私宛(あるいはteratail宛)にぶつける前にやることは山程ありますよ。 そこは、初心者もベテランも関係なく、コードを動かしている環境でしか得られない情報を一通り回収しましょうねって話です。
退会済みユーザー

退会済みユーザー

2020/01/27 03:08

XAMPPなら、例えば C:\xampp\apache\logs に error_log が記録されているはずですので、phpのコードを動かしたらまずここをチェックします。 また、phpのコードの冒頭に、 ini_set('display_errors', "On"); ini_set('error_reporting', E_ALL); を置けば、文法ミスがない限りエラー表示をwebブラウザに出力してくれるようになります。
退会済みユーザー

退会済みユーザー

2020/01/27 03:44

最初のお返事を修正しようとしていたら遅くなってしまいました。 まずは、データの抽出ができるかだけでも確認しようと思い、教えていただいたコードを元に、簡略版のプログラムを、下記の通り作成してテストしてみました。 <?php // 処理区分コード if (isset($_GET['execPeriod'])) { $iclass = $_GET['execPeriod']; } else { $iclass = "202001"; } try { // DB接続時にfetchモードを指定 $pdo = new PDO('mysql:host=localhost;dbname=generalworks;charset=utf8', 'root', ''); $stmt = $pdo->prepare("SELECT * FROM vtw100n WHERE `vn02str` = :iclass ORDER BY `vn02str`,`vn03str`"); $stmt->bindValue(':iclass', $iclass, PDO_PARAM_STR); $stmt->execute(); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC|PDO::FETCH_UNIQUE); $data += $rows; } catch (PDOException $e) { header('content-type: text/plain'); die("データベース接続に失敗しました。: " . $e->getMessage() . "\n"); } ?> 上記を実行したところ、下記のようなエラーが表示されてしまいました。 Warning: Use of undefined constant PDO_PARAM_STR - assumed 'PDO_PARAM_STR' (this will throw an Error in a future version of PHP) on line 19 Warning: PDOStatement::bindValue() expects parameter 3 to be int, string given on line 19 Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: no parameters were bound on line 20 Warning: A non-numeric value encountered on line 22 Fatal error: Uncaught Error: Unsupported operand types in 22 Stack trace: #0 {main} thrown on line 22 そのため、自分なりに他の文献で対処できないかと思い、教えて頂いた部分を下記のように変更したところ、概ね出力したい形式を表示できるようになりました。 $stmt = $pdo->prepare('SELECT * FROM `vtw100n` WHERE`vn02str` = `:iclass` ORDER BY `vn02str` ASC,`vn03str` ASC'); $stmt->bindValue(:iclass, $iclass, PDO_PARAM_STR); $stmt->execute(); $res = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach ($res as $row) { $result = implode(',', $row); // 変数への格納処理 } 条件入力による抽出を行うため、教えていただいた部分を下記のように反映したところ <?php $stmt = $pdo->prepare('SELECT * FROM `vtw100n` WHERE`vn02str` = `:iclass` ORDER BY `vn02str` ASC,`vn03str` ASC'); $stmt->bindValue(`:iclass`, $iclass, PDO_PARAM_STR); ?> 次のようなエラーが出ました。 Warning: Use of undefined constant PDO_PARAM_STR - assumed 'PDO_PARAM_STR' (this will throw an Error in a future version of PHP) on line 16 Warning: PDOStatement::bindValue() expects parameter 3 to be int, string given on line 16 Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: no parameters were bound on line 17
退会済みユーザー

退会済みユーザー

2020/01/27 04:21 編集

PDO::PARAM_STR ですすみませんでした。 https://www.php.net/manual/ja/pdo.constants.php はじめてつかうbindValue()についてはドキュメント類もチェックしてください。 PHP: PDOStatement::bindValue - Manual <https://www.php.net/manual/ja/pdostatement.bindvalue.php> あと、プレースホルダーにはクォーテーションマーク類は不要です。それもbindValue()のマニュアルを見てください。
退会済みユーザー

退会済みユーザー

2020/01/28 04:18

ありがとうございました。 おかげさまで、お力添えいただきました内容を元に、下記の通り、思い通りの動作をするプログラムができました。 <?php // 処理区分コード if (isset($_GET['execPeriod'])) { $iclass = $_GET['execPeriod']; } else { $iclass = date('Ym');; } try { // DB接続時にfetchモードを指定 $pdo = new PDO('mysql:host=localhost;dbname=general_works;charset=utf8', 'root', ''); $stmt = $pdo->prepare("SELECT * FROM vtw100n WHERE `vn02str` = :iclass ORDER BY `vn02str`,`vn03str`"); $stmt->bindValue(':iclass', $iclass, PDO::PARAM_INT); $stmt->execute(); $res = $stmt->fetchAll(PDO::FETCH_ASSOC); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=Untitled.csv'); $file = new SplFileObject('php://output', 'w'); foreach ($res as $rows) { mb_convert_variables('SJIS-win', 'UTF-8', $rows); $file->fputcsv($rows); } $file->fflush(); } catch (PDOException $e) { header('content-type: text/plain'); die("データベース接続に失敗しました。: " . $e->getMessage() . "\n"); } ?> もし可能であれば、ファイルに出力する際に「カラム名」を設定したいと思うのですが、『foreach ($res as $rows) ~ 』のあたりに”$rows = "列1,列2,列3,列4,列5, ・・・";”のようにしてみたのですが、うまく埋め込むことができませんでした。 もともと『カラム名』はなくても大丈夫といえば大丈夫なのですが、”できれば”埋め込みたいと思っています。 お忙しい中恐縮いたしますが、ご教授いただきたく、お願い申し上げます。
退会済みユーザー

退会済みユーザー

2020/01/28 04:29

array_keys($res)したら、ヘッダー(カラム名)に使えるんじゃないですかね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問