複数検索とそれと連携した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>