PHPを使い残業申請をweb上でできるようにするためのシステムを作っています。  
申請されたものをリストですべて表示しており、画面上部で検索を行えるようにしたいのです。ドロップダウンメニューを使い絞り込み検索をかけたいのですがうまくいきません。

### やりたいこと

  1. 検索ボタンを押すと、選択した条件に当てはまるものをリストに表示したい
  2. 何も検索していないときはすべて表示
  3. 期間(jissiday)は範囲指定

ググりながらやってはいるものの歯が立たない状態です。  
現在エラーは起きていませんが、検索を押しても何も返ってこない状態です。  
わかる方がいらっしゃればご教示ください。

* * *

以下がコードです。

```

    //データベースに接続
    <?php include('dbc.php');?>
    
    <?php
    //申請されたすべてのものを表示
    $list = $pdo->prepare("SELECT * FROM テーブル名");
    $list->execute();
    $temp= $list->fetchall();
    
    //ここから絞り込み検索の処理を記入しているところです、、、
    $where_sql="";
    
    if(isset($_GET['search'])){
        if($name!=""){
            $where_sql="WHERE テーブル名.name='".$name."'";
        }
        if($kenban!=""){
            $where_sql="WHERE テーブル名.kenban='".$kenban."'";
        }else{
            $where_sql="AND テーブル名.kenban='".$kenban."'";
        }
        if($jissiday!=""){
            if ($where_sql=="") {
              $where_sql = "WHERE テーブル名.jissiday='".$jissiday."'";
            }else{
              $where_sql .= " AND テーブル名.jissiday='".$jissiday."'";
            } 
        }
    }
    
    ?>
    
```

```

    <!DOCTYPE html>
    <html lang="ja">
    <head>
        <meta charset="UTF-8">
        <link rel="stylesheet" type="text/css" href=css/stylesheet2_test.css>
        <link href="https://use.fontawesome.com/releases/v5.6.1/css/all.css" rel="stylesheet">
    
        <title>時間外申請済リスト</title>
    </head>
    
    <a style="margin-left:100px;text-decoration:none;font-size:1.2rem" href='/try_gyoumu/index.php'>業務支援メニューへ</a>
    
    <body>
        <h1 class="title">～時間外勤務申請済リスト～</h1>
    
    　　　　//検索欄
            <div class="selectContainer">
                <div class="selectBox">
                    <form action="jikangai_list_test.php" method="get">
    
                    <select name="name">
                    <option>名前</option>
                    <?php foreach ($namelist as $output) {?>
                        <option><?php echo $output['name']; ?></option>
                    <?php }?>
                    </select>
    
                    <select name="kenban">
                    <option>件番</option>
                    <?php foreach ($gyoumulist as $moutput) {?>
                        <option value='<?php echo $moutput[kenban]?>'><?php echo $moutput[kenban].' '.$moutput['kenmei']; ?></option>
                    <?php }?>
                    </select>
                    <br>
    
                    <input type="date">から <input type="date">まで
                    <input class="sarch-button" type="submit" name="search" value="検索">
            　//ここまで
    
                    <ul class="sort">
                    <li><a class="ichiran" href="jikangai_list.php">全て表示</a></li>
                    <li><a class="ichiran" href="misoumuin.php">未総務印一覧</a></li>
                    <li><a class="ichiran" href="jissibi_mikinyu.php">実施日未記入一覧</a></li>
                    <li><a class="ichiran" href="list_newer.php">新しい順</a></li>
                    <li><a class="ichiran" href="list_older.php">古い順</a></li>
                    </ul>
                    </form>
                </div>
            </div>
    
    
        <br>
        <table>
            <tr>
            <th>名前</th>
            <th>予定日</th>
            <th>予定開始時刻</th>
            <th>予定終了時刻</th>
            <th>承認</th>
            <th>実施日</th>
            <th>実施開始時刻</th>
            <th>実施終了時刻</th>
            <th>時間外稼働時間</th>
            <th>件番</th>
            <th>内容</th>
            <th>総務印</th>
            <th>編集</th>
            <th>削除</th>
            </tr>
    
        <?php
        foreach($temp as $data){
        ?>
            <tr>
            <?php printf("<td>%s</td>",$data['name']); ?>
            <?php printf("<td>%s</td>",$data['yoteiday']); ?>
            <?php printf("<td>%s</td>",$data['yoteistarttime']); ?>
            <?php printf("<td>%s</td>",$data['yoteiendtime']); ?>
            <?php printf("<td>%s</td>",$data['syounin']); ?>
            <?php printf("<td>%s</td>",$data['jissiday']); ?>
            <?php printf("<td>%s</td>",$data['jissistarttime']); ?>
            <?php printf("<td>%s</td>",$data['jissiendtime']); ?>
            <?php
            $from = $data['jissiendtime'];
            $to   = $data['jissistarttime'];
            $result = date_diff(new DateTime($from), new DateTime($to))->format('%H:%I:%S');
            printf("<td>%s</td>",$result);
            ?>
            <?php printf("<td>%s</td>",$data['kenban']); ?>
            <?php printf("<td>%s</td>",$data['naiyou']); ?>
            <?php printf("<td>%s</td>",$data['soumuin']); ?>
            <td><a class="fa fa-edit" href="update_form_test.php?id=<?php echo $data['id']?>"></a></td>
            <td><a class="fa fa-trash delete" href="delete.php?id=<?php echo $data['id'] ?>"></a></td>
            </tr>
       <?php
       }
       ?>
        </table>
    
    </body>
    </html>
    
    <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.12.4.min.js"></script>
    <script>
    $('.delete').click(function(){
    if(!confirm('本当に削除しますか？')){
        return false;
    }
    });
    </script>
    
```
CC BY-SA 4.0
2020-07-22T06:00:38.820
68816
2020-07-22T11:37:04.720
2020-07-22T06:07:13.660
3060
41207
question
php mysql pdo
一覧画面に検索機能を加えたい
ソースコードを提示するのはかんたんですがそれだと学習のためにはならないのであえて  
ソースを書かずに説明させていただきます。

> 検索ボタンを押すと、選択した条件に当てはまるものをリストに表示したい

ソースコードを見ると２箇所問題があります。

（１）inputされたデータから取得する方法  
（２）その変数の取得してそれをSQLにマージする処理

（１）inputされたデータから取得する方法  
ソースコードを見ると、`$name`や`$kenban`に自動で変数に展開するような書き方をしていますが、  
そんなことはなく[$_GET](https://www.php.net/manual/ja/reserved.variables.get.php)に連想配列として格納されています。それを利用するようにしましょう。

（２）その変数の取得してそれをSQLにマージする処理

```

    $list = $pdo->prepare("SELECT * FROM テーブル名");
    $list->execute();
    $temp= $list->fetchall();
    
```

ソースコードを見るとSQLでprepareを作ったあとに一生懸命Where文を作っていますが、残念ながらすでにSQLは実行されているので、後でSQLをいじろうとしても難しいです。  
SQL実行前にwhere文を作成しましょう。  
さらに直接データをSQLに埋め込むのではなく[バインド](https://www.php.net/manual/ja/pdo.prepare.php)を利用しましょう。  
（参考サイト先の例にバインドの書き方があります。）

```

    $list = $pdo->prepare("SELECT * FROM テーブル名 WHERE 1 {$where_sql}", $param);
    $list->execute();
    $temp= $list->fetchall();
    
```

> 何も検索していないときはすべて表示

パラメータが渡ってこないときは  
上記の$where_sqlや$paramが空になるように処理しましょう

> 期間(jissiday)は範囲指定

こちらはテーブルのカラム構造によって変わりますが、  
inputで〇〇以上〇〇以下のフォームが必要です。例えば

```

    <input type="date" name="kara">から <input type="date" name="made">まで
    
```

というinputを用意して  
PHP側で入力値があれば[範囲検索](https://dev.mysql.com/doc/refman/5.6/ja/range-
optimization.html)できるSQLを発行してみましょう

例えばkaraがあれば

```

    AND jissiday >= :kara 
    
```

というWhere文が生成できればよいかなと思います。

公式のサイトがやっぱりいちばん安定してわかりやすいと思います。ぜひそのあたりを参考にしながら作ってみてください。
CC BY-SA 4.0
2020-07-22T07:12:03.223
68819
2020-07-22T11:37:04.720
2020-07-22T11:37:04.720
22665
22665
68816
answer