スタック・オーバーフロー Asked by yoshiki on November 20, 2021
PHPを使い残業申請をweb上でできるようにするためのシステムを作っています。
申請されたものをリストですべて表示しており、画面上部で検索を行えるようにしたいのです。ドロップダウンメニューを使い絞り込み検索をかけたいのですがうまくいきません。
ググりながらやってはいるものの歯が立たない状態です。
現在エラーは起きていませんが、検索を押しても何も返ってこない状態です。
わかる方がいらっしゃればご教示ください。
以下がコードです。
//データベースに接続
<?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>
ソースコードを提示するのはかんたんですがそれだと学習のためにはならないのであえて
ソースを書かずに説明させていただきます。
検索ボタンを押すと、選択した条件に当てはまるものをリストに表示したい
ソースコードを見ると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
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP