複数検索とそれと連携したCSVの出力、検索状態のリセットができるようになっています。
全体像
HTMLフォーム
<?php
$search_conditions = $_SESSION['search_conditions'] ?? [];
?>
<form action="" method="POST">
<div class="label"></div>
<input type="date" name="start_date" value="<?php echo $search_conditions['start_date'] ?? ''; ?>">
<div>
〜
</div>
<div class="label"></div>
<input type="date" name="end_date" value="<?php echo $search_conditions['end_date'] ?? ''; ?>">
<div class="label">日付(月)</div>
<input type="month" name="month" value="<?php echo $search_conditions['month'] ?? ''; ?>">
<div class="label">メーカー</div>
input type="text" name="maker" value="<?php echo $search_conditions['maker'] ?? ''; ?>">
<input type="submit" name="submit" value="検索">
<button type="submit" name="export" value="csv">csv出力</button>
<input type="submit" name="reset" value="リセット">
</form>
<style>
.sticky-header th {
background-color: #FFF; /* ヘッダーの背景色を指定(スクロール時に透過しないように) */
position: sticky;
top: 0; /* 画面の上端からの位置 */
z-index: 10; /* 他の要素より上に表示する */
}
</style>
<tbody>
<thead class="sticky-header">
<tr>
<th>商品名</th>
</tr>
</thead>
<?php foreach($lists as $list){ ?>
<tr>
<td><?php echo $list['item']; ?></td>
<td>¥<?php echo number_format($list['price']);?></td>
</tr>
<?php } ?>
</tbody>
</table>
サーバーサイド
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// 検索条件をセッションに保存
$_SESSION['search_conditions'] = $_POST;
// リセットボタンがクリックされたかどうかを確認
if (isset($_POST["reset"])) {
// $lists を初期化
$lists = array();
// 検索条件を初期化する
unset($_SESSION['search_conditions']);
unset($_SESSION['search_result']);
// 初期化後にリダイレクトするか、必要な処理を行うことができます
header("Location: index.php"); // サーチページへリダイレクト
exit();
}
$where = []; //初期化
$params = [];
//$query = "";
//検索
//日付〜日付検索
if(isset($_POST['start_date']) && isset($_POST['end_date']) && !empty($_POST['start_date']) && !empty($_POST['end_date'])){
$where[] = "si.date BETWEEN :start_date AND :end_date";
$params['start_date'] = $_POST['start_date'];
$params['end_date'] = $_POST['end_date'];
}
//月検索
if(isset($_POST['month']) && !empty($_POST['month'])){
$date = $_POST['month'];
$start_date = $date . '-01';
$end_date = date('Y-m-t',strtotime($start_date));
$where[] = "si.date BETWEEN :start_date_month AND :end_date_month";
$params['start_date_month'] = $start_date;
$params['end_date_month'] = $end_date;
}
//商品検索
if(isset($_POST['item']) && !empty($_POST['item'])){
$where[] = "si.item LIKE :item";
$params['item'] = '%'. $_POST['item'].'%';
}
// 情報を取得
$stmt = $dbh->prepare("SELECT * FROM orders WHERE status = '承認待ち' OR status = '承認済み'");
$stmt->execute();
$orders = $stmt->fetchAll(PDO::FETCH_ASSOC);
$lists = [];
//発注承認前表示
$query = "SELECT DISTINCT
s.item,
s.price,
FROM stock AS s
LEFT JOIN orders AS o ON s.code = o.code
LEFT JOIN shops AS sp ON s.shop_id = sp.shop_id";
if($where){
$query .= " AND " . implode(' AND ', $where);
}
try{
$stmt = $dbh->prepare($query);
foreach($params as $key => $val){
$stmt->bindValue(':'.$key,$val);
}
$stmt->execute();
$lists = $stmt->fetchAll(PDO::FETCH_ASSOC);
//検索したものを維持して表示
$_SESSION['search_result'] = $lists;
if(empty($lists)){
echo "該当するデータはないが、クエリは成功。";
}
} catch (PDOException $e) {
echo "エラー";
throw new PDOException($e->getMessage(), (int)$e->getCode());
}
// リセットボタンがクリックされたかどうかを確認
if (isset($_POST["reset"])) {
// $lists を初期化
$lists = array();
// 検索条件を初期化する
unset($_SESSION['search_result']);
// 初期化後にリダイレクトするか、必要な処理を行うことができます
header("Location: index.php"); // サーチページへリダイレクト
exit();
}
}
else {
// リセットボタンがクリックされていない場合、ここで $lists を初期化
$lists = array();
}
// CSV出力処理
if (isset($_POST['export'])) {
$export_query =
"SELECT s.item,s.price
FROM stock AS s
LEFT JOIN shops AS sp
on s.shop_id = sp.shop_id
LEFT JOIN orders AS o
on s.code = o.code";
if (!empty($where)) {
$export_query .= " WHERE " . implode(' AND ', $where);
}
try {
$export_stmt = $dbh->prepare($export_query);
foreach ($params as $key => $val) {
$export_stmt->bindValue(':' . $key, $val);
}
$export_stmt->execute();
$export_data = $export_stmt->fetchAll(PDO::FETCH_ASSOC);
// CSV出力処理
header('Content-Type: text/csv;charset=UTF-8');
header('Content-Disposition: attachment; filename="商品データ.csv"');
$output = fopen('php://output', 'w');
fputs($output, "\xEF\xBB\xBF");
fputcsv($output, ['日付', '商品コード','メーカー', '商品名', '残数', '発注数量', '商品単価', '小計', '店舗','地域']);
foreach ($export_data as $row) {
//¥1,000のようなnumber_formatのような表示にする
$row['price'] = '¥'.number_format($row['price'], 0, '.', ',');
fputcsv($output, $row);
}
fclose($output);
exit();
} catch (\PDOException $e) {
throw new \PDOException($e->getMessage(), (int)$e->getCode());
}}
検索
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// 検索条件をセッションに保存
$_SESSION['search_conditions'] = $_POST;
$where = []; //初期化
$params = [];
//$query = "";
//検索
//日付〜日付検索
if(isset($_POST['start_date']) && isset($_POST['end_date']) && !empty($_POST['start_date']) && !empty($_POST['end_date'])){
$where[] = "si.date BETWEEN :start_date AND :end_date";
$params['start_date'] = $_POST['start_date'];
$params['end_date'] = $_POST['end_date'];
}
//月検索
if(isset($_POST['month']) && !empty($_POST['month'])){
$date = $_POST['month'];
$start_date = $date . '-01';
$end_date = date('Y-m-t',strtotime($start_date));
$where[] = "si.date BETWEEN :start_date_month AND :end_date_month";
$params['start_date_month'] = $start_date;
$params['end_date_month'] = $end_date;
}
//商品検索
if(isset($_POST['item']) && !empty($_POST['item'])){
$where[] = "si.item LIKE :item";
$params['item'] = '%'. $_POST['item'].'%';
}
// 情報を取得
$stmt = $dbh->prepare("SELECT * FROM orders WHERE status = '承認待ち' OR status = '承認済み'");
$stmt->execute();
$orders = $stmt->fetchAll(PDO::FETCH_ASSOC);
$lists = [];
//発注承認前表示
$query = "SELECT DISTINCT
s.item,
s.price,
FROM stock AS s
LEFT JOIN orders AS o ON s.code = o.code
LEFT JOIN shops AS sp ON s.shop_id = sp.shop_id";
if($where){
$query .= " AND " . implode(' AND ', $where);
}
try{
$stmt = $dbh->prepare($query);
foreach($params as $key => $val){
$stmt->bindValue(':'.$key,$val);
}
$stmt->execute();
$lists = $stmt->fetchAll(PDO::FETCH_ASSOC);
//検索したものを維持して表示
$_SESSION['search_result'] = $lists;
if(empty($lists)){
echo "該当するデータはないが、クエリは成功。";
}
} catch (PDOException $e) {
echo "エラー";
throw new PDOException($e->getMessage(), (int)$e->getCode());
}
}
CSV出力
// CSV出力処理
if (isset($_POST['export'])) {
$export_query =
"SELECT s.item,s.price
FROM stock AS s
LEFT JOIN shops AS sp
on s.shop_id = sp.shop_id
LEFT JOIN orders AS o
on s.code = o.code";
if (!empty($where)) {
$export_query .= " WHERE " . implode(' AND ', $where);
}
try {
$export_stmt = $dbh->prepare($export_query);
foreach ($params as $key => $val) {
$export_stmt->bindValue(':' . $key, $val);
}
$export_stmt->execute();
$export_data = $export_stmt->fetchAll(PDO::FETCH_ASSOC);
// CSV出力処理
header('Content-Type: text/csv;charset=UTF-8');
header('Content-Disposition: attachment; filename="商品データ.csv"');
$output = fopen('php://output', 'w');
fputs($output, "\xEF\xBB\xBF");
fputcsv($output, ['商品名','商品価格']);
foreach ($export_data as $row) {
//¥1,000のようなnumber_formatのような表示にする
$row['price'] = '¥'.number_format($row['price'], 0, '.', ',');
fputcsv($output, $row);
}
fclose($output);
exit();
} catch (\PDOException $e) {
throw new \PDOException($e->getMessage(), (int)$e->getCode());
}}
リセットボタン
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// リセットボタンがクリックされたかどうかを確認
if (isset($_POST["reset"])) {
// $lists を初期化
$lists = array();
// 検索条件を初期化する
unset($_SESSION['search_conditions']);
unset($_SESSION['search_result']);
// 初期化後にリダイレクトするか、必要な処理を行うことができます
header("Location: index.php"); // サーチページへリダイレクト
exit();
}
// 検索条件をセッションに保存
$_SESSION['search_conditions'] = $_POST;
// ... 以下の検索処理のコード ...
} else {
// リセットボタンがクリックされていない場合、ここで $lists を初期化
$lists = array();
}
?>
<!DOCTYPE html>
<html>
<head>
<title>検索フォーム</title>
</head>
<body>
<form method="post" action="search.php">
<!-- ここに検索条件の入力フィールドを追加 -->
<input type="submit" name="reset" value="検索状態を初期化">
</form>
</body>
</html>