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;
回答1件
あなたの回答
tips
プレビュー