質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL

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

PHP

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

Q&A

解決済

1回答

3456閲覧

検索機能を実装するにあたってアドバイスください

earnest_gay

総合スコア615

SQL

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

PHP

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

0グッド

0クリップ

投稿2016/06/28 05:24

編集2016/06/28 05:28

現在、マッチングサイトの制作をしており、下記のようなページができています。
イメージ説明

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にしたいのですが、
イメージ説明

まず、簡単な入力検索から実装していきたいと思います。

<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
なかなか有益な情報にありつけずです...

イメージとしては冒頭の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代のラジオボックス)複数選択可能
・所在(都道府県のセレクトボックスを用意し都道府県のみで検索する)
・専攻カテゴリー(これもセレクトボックスを用意)
・専攻スキル(これもセレクトボックスを用意)
・契約可能時期(これもセレクトボックスを用意)
・フリーワード(テキストボックスを用意)

今はまだ下調べの段階でイメージだけで質問しているので誤りがあれば教えてください。
宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

初心者のためのページング機能実装サンプル

pagination() にある、http_build_query() 周辺の実装が参考になるでしょう。

投稿2016/06/28 05:30

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

earnest_gay

2016/06/28 06:04

http_build_queryのあたり参考にさせていただきます。 もしかして、検索機能の実装はかなり難易度高いのですかね...?
退会済みユーザー

退会済みユーザー

2016/06/28 06:10 編集

素人が多少学習したくらいでできちゃうものなら、僕らがそれなりに高い報酬をもらう理由がないですよね。 とはいえ、どんなにやってもできない人はできないし、さらっと理解できちゃう人もいます。 どんなシステムであれ、「検索機能」は普通は実装されているものなので、プログラマであればできて当前のものです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問