質問編集履歴

1 追記

earnest_gay

earnest_gay score 403

2016/06/28 14:28  投稿

検索機能を実装するにあたってアドバイスください
現在、マッチングサイトの制作をしており、下記のようなページができています。
![イメージ説明](32803fffb0a3f9790b2a4d6041a4fab7.jpeg)
SQLはこうなってます。
```ここに言語を入力
$page = (INT)filter_input(INPUT_GET, 'page');
$start = $page * 5;
$stmt = $pdo->query(sprintf("SELECT user_data.id ,birth_year,birth_month,birth_day,pref,city,
major_category,major_skill,cont_date,introduction
FROM user_data,user_pr
WHERE user_data.id=user_pr.user_id
ORDER BY id DESC
LIMIT %d, 5", $start));
```
ページング処理です。
```
function paging($limit, $page, $disp=5){
   //$dispはページ番号の表示数
   $next = $page+1;
   $prev = $page-1;
   //ページ番号リンク用
   $start = ($page-floor($disp/2) > 0) ? ($page-floor($disp/2)) : 1;//始点
   $end = ($start > 1) ? ($page+floor($disp/2)) : $disp;//終点
   $start = ($limit < $end)? $start-($end-$limit):$start;//始点再計算
   if($page != 0 ) {
       print '<a href="?page='.$prev.'">&laquo; 前へ</a>';
   }
   //最初のページへのリンク
   if($start >= floor($disp/2)){
       print '<a href="?page=1">1</a>';
   if($start > floor($disp/2)) print "..."; //ドットの表示
   }
   for($i=$start; $i <= $end ; $i++){//ページリンク表示ループ
   $class = ($page == $i) ? ' class="current"':"";//現在地を表すCSSクラス
   if($i <= $limit && $i > 0 )//1以上最大ページ数以下の場合
   print '<a href="?page='.$i.'"'.$class.'>'.$i.'</a>';//ページ番号リンク表示
   }
   //最後のページへのリンク
   if($limit > $end){
   if($limit-1 > $end ) print "...";   //ドットの表示
   print '<a href="?page='.$limit.'">'.$limit.'</a>';
   }
   if($page < $limit){
       print '<a href="?page='.$next.'">次へ &raquo;</a>';
   }
   print "<p>current:".$page."<br>";
   print "next:".$next."<br>";
   print "prev:".$prev."<br>";
   print "limit:".$limit."<br>";
   print "start:".$start."<br>";
   print "end:".$end."</p>";
}
?>
```
表示の分部です。
```ここに言語を入力
<?php
   foreach ($stmt as $row) {
       echo '<a href="human_detail.php?EngineerNo=' .$row['id']. ' "> ';
       echo 'EngineerNo.'.$row['id'].'<br />';
       echo '<img src="">';
       $birth = $row['birth_year'].sprintf('%02d', $row['birth_month']).sprintf('%02d', $row['birth_day']);
       echo '年齢:'.floor((date("Ymd")-$birth)/10000).'歳';
       echo ' | ';
       echo '所在:'.$row['pref'].' '.$row['city'];
       echo ' | ';
       echo '専攻カテゴリー:'.$row['major_category'];
       echo ' | ';
       echo '専攻スキル:'.$row['major_skill'];
       echo ' | ';
       echo '契約可能時期:'.$row['cont_date'].'<br /><br />';
       echo $row['introduction'].'<br /><br />';
       echo '</a>';
       echo '<hr>';
   }
   $limit = $totalPage-1;//最大ページ数
   $page = empty($_GET["page"])? 0:$_GET["page"];//ページ番号
   paging($limit, $page);
?>
```
これに検索機能を実装したいのですが、ちょっとイメージがわきづらいのでアドバイスお願いします。
現段階ではURLパラメータはこうなってます。
http://localhost/xxx/human_list.php?page=
$_POST['page']でページ番号を取得してSQLのLIMITに組み込んでます。
検索機能を実装することで
表示させる内容は変わりませんが
表示させる順番が変わります。
なのでforeach内の記述は今のままで良く、これといって変更する必要はないと思ってます。
本当はこのようなUIにしたいのですが、
![イメージ説明](82afc4c2f071b23f989b3a91fec750f4.jpeg)
まず、簡単な入力検索から実装していきたいと思います。
```ここに言語を入力
<form method="get" action="">
<label for="usersearch">フリーワード検索</label><br />
<input type="text" id="usersearch" name="usersearch" /><br />
<input type="submit" name="submit" value="検索" /><br />
</form>
```
とあった場合、URLパラメータが
http://localhost/xxx/human_list.php?page=
から
http://localhost/xxx/human_list.php?usersearch=&submit=%E6%A4%9C%E7%B4%A2
に変わります。
この状態でページャのリンク(例えば2)をクリックすると
http://localhost/xxx/human_list.php?usersearch=&submit=%E6%A4%9C%E7%B4%A2
から
http://localhost/xxx/human_list.php?page=2
とかになってしまいます。
http://localhost/xxx/human_list.php?usersearch=&submit=%E6%A4%9C%E7%B4%A2
維持したままページ遷移する仕組みが分かりません。
こちらでも調べているのですが、[検索機能 PHP](https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=%E6%A4%9C%E7%B4%A2%E6%A9%9F%E8%83%BD%20php)
なかなか有益な情報にありつけずです...
イメージとしては冒頭のSQLを基準にして
それ以外にも複数のSQL文を用意しておいて
検索内容をGETし、変数などでWHERE句に当てはめ
表示の順番を変更するといったイメージです。
SQL文に変数を割り当てるのは間違いなのは分かってますが
今のイメージではこんなところです。
その複数のSQL文を用意するにあたって、
```ここに言語を入力
$stmt = $pdo->query(sprintf("SELECT user_data.id ,birth_year,birth_month,birth_day,pref,city,
major_category,major_skill,cont_date,introduction
FROM user_data,user_pr
WHERE user_data.id=user_pr.user_id
ORDER BY id DESC
WHERE 専攻カテゴリー
LIMIT %d, 5", $start));
$stmt = $pdo->query(sprintf("SELECT user_data.id ,birth_year,birth_month,birth_day,pref,city,
major_category,major_skill,cont_date,introduction
FROM user_data,user_pr
WHERE user_data.id=user_pr.user_id
ORDER BY id DESC
WHERE 年齢
LIMIT %d, 5", $start));
$stmt = $pdo->query(sprintf("SELECT user_data.id ,birth_year,birth_month,birth_day,pref,city,
major_category,major_skill,cont_date,introduction
FROM user_data,user_pr
WHERE user_data.id=user_pr.user_id
ORDER BY id DESC
WHERE 所在(都道府県のみ)
LIMIT %d, 5", $start));
```
とか複数のSQL文を用意すると思うのですが
これでは$stmtが上書きされてしまうので
$stmt1とか$stmt2とか$stmt3重複しないようにする必要があると思います。
しかし、表示用の分部でforeach ($stmt as $row)としているので
SQL文に合わせて表示用の分部も
foreach ($stmt1 as $row){・・・}
foreach ($stmt2 as $row){・・・}
foreach ($stmt3 as $row){・・・}
とか作っておかないといけないのかなと思っています。
何を基に検索するのかをまとめてみました。
・年齢(10代、20代、30代、40代、50代、60代のラジオボックス)複数選択可能
・所在(都道府県のセレクトボックスを用意し都道府県のみで検索する)
・専攻カテゴリー(これもセレクトボックスを用意)
・専攻スキル(これもセレクトボックスを用意)
・契約可能時期(これもセレクトボックスを用意)
・フリーワード(テキストボックスを用意)
年齢~フリーワードまで全部選択可能にしたいのです。  
今はまだ下調べの段階でイメージだけで質問しているので誤りがあれば教えてください。
宜しくお願いします。
  • PHP

    37457 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • SQL

    5538 questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る