現在、マッチングサイトの制作をしており、下記のようなページができています。
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.'">« 前へ</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.'">次へ »</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内の記述は今のままで良く、これといって変更する必要はないと思ってます。
まず、簡単な入力検索から実装していきたいと思います。
<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代のラジオボックス)複数選択可能
・所在(都道府県のセレクトボックスを用意し都道府県のみで検索する)
・専攻カテゴリー(これもセレクトボックスを用意)
・専攻スキル(これもセレクトボックスを用意)
・契約可能時期(これもセレクトボックスを用意)
・フリーワード(テキストボックスを用意)
今はまだ下調べの段階でイメージだけで質問しているので誤りがあれば教えてください。
宜しくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/28 06:04
退会済みユーザー
2016/06/28 06:10 編集