TransWikia.com

一覧画面に検索機能を加えたい

スタック・オーバーフロー Asked by yoshiki on November 20, 2021

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>

One Answer

ソースコードを提示するのはかんたんですがそれだと学習のためにはならないのであえて
ソースを書かずに説明させていただきます。

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

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

(1)inputされたデータから取得する方法
(2)その変数の取得してそれをSQLにマージする処理

(1)inputされたデータから取得する方法
ソースコードを見ると、$name$kenbanに自動で変数に展開するような書き方をしていますが、
そんなことはなく$_GETに連想配列として格納されています。それを利用するようにしましょう。

(2)その変数の取得してそれをSQLにマージする処理

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

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

$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側で入力値があれば範囲検索できるSQLを発行してみましょう

例えばkaraがあれば

AND jissiday >= :kara 

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

公式のサイトがやっぱりいちばん安定してわかりやすいと思います。ぜひそのあたりを参考にしながら作ってみてください。

Answered by keitaro_so on November 20, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP