検索機能の作り方で困ったので質問させていただきます。
現在、PHPとMySQLとajaxで検索機能を作っています。
仕様としましては、リアルタイムに検索結果を出したかったので、検索項目を用意しチェックなどをしたらその場で結果が出るような造りになっています。
リアルタイムなので、ajaxを複数使い、そして、その複数のajax間でデータのやり取りをしたかったので、PHPのSESSIONを使いデータの受け渡しをしています。
ある条件を満たす(例えば、GETで「Search=on」を取得する)と検索プログラムが起動し、各項目を取得します。
if ($_GET["Search"] == "on") { // 条件が満たされた場合 }
そして、その項目を取得した場合、SESSIONと検索結果を残したかったのでGETパラメータを保存し、その取得した条件でデータベース内を検索し、ヒットしたデータを返しページに反映し、URLにパラメータを反映するような流れとなっています。
if ($_GET["Search"] == "on") { //GETで取得した場合 if ($_GET["検索項目1"]) { //セッションとパラメータに保存 $_SESSION["検索項目1"] = $param["検索項目1"] = $_GET["検索項目1"]; //SESSIONにデータが保存されている、且つ検索ボタンが押されなかった場合 } else if (!$_GET["検索ボタン"] and $_SESSION["検索項目1"]) { //パラメータに保存 $param["検索項目1"] = $_SESSION["検索項目1"]; //ボタンは押されたがGETが空の場合 } else { //SESSION初期化 $_SESSION["検索項目1"] = ""; } } //この後、MySQLで検索、URLにパラメータ反映
また、上記の条件を満たさない(「Search=on」を取得しなかった)場合は、検索結果のSESSIONを初期化し、次に検索条件を満たした場合に引き継がないような仕様にしています。
しかし、この仕様だとページは違うページだが、検索条件を満たしてしまう場合は条件が引き継がれてしまい、本当は初期化しないといけないのにその引き継いだ条件で検索してしまいます。
ページ①:Search=on ↓ //移動 ページ②:Search=on //初期化されず引き継いでしまう
各ajax間に検索した項目を引き継ぎ、URLに前の結果も引き継がれるようにしたかったのでSESSIONを使っています。
この機能を止めればいいのですが、理想の検索がこの仕様なので、どうかできないか悩んでいます。
何か良い方法はないでしょうか。
また、この仕様だと何か他に問題が出てくるでしょうか。
皆様のご意見をお聞かせください。
■追記(2016/06/02)
ajax側のプログラムは、項目ごとに設定したボタンを押すとそれに応じたチェックボックスが起動します。
(例えば、都道府県の項目で選択を押した際には、都道府県を選択できるようなajaxが起動)
ボタンを押した初期起動は、関東や関西など大エリアを選ぶことのできるチェックボックスを生成し返します。
//ajax内(例:都道府県) //初期起動 if ($_GET["Area"] == 1) { //関東や関西などの大エリアチェックボックスを返す }
次に、任意の大エリアを選択すると、それに応じた都道府県を返します。
//ajax内(例:都道府県) //初期起動 if ($_GET["Area"] == 1) { //関東や関西などの大エリアチェックボックスを返す } else if ($_GET["Area"] == 2) { //大エリアに応じた都道府県のチェックボックスを返す }
次に、都道府県を選択すると、それに応じた市区町村を生成し、返します。
//ajax内(例:都道府県) //初期起動 if ($_GET["Area"] == 1) { //関東や関西などの大エリアチェックボックスを返す } else if ($_GET["Area"] == 2) { //大エリアに応じた都道府県のチェックボックスを返す } else if ($_GET["Area"] == 3) { //都道府県に応じた市区町村のチェックボックスを返す }
複数あるajaxは上記のような造りになっており、一度検索し、再度検索する際に以前の情報を保存するために、取得した情報をSESSIONで保存しています。
そして、その情報があった際は初期起動の際に処理を行っています。
//ajax内(例:都道府県) //初期起動 if ($_GET["Area"] == 1) { //再検索の際に以前の情報があった場合はそれを再構築する if ($_SESSION["エリア①"]) { //以前の情報を再構築 } else if ($_SESSION["エリア②"]) { //以前の情報を再構築 } else if ($_SESSION["エリア③"]) { //以前の情報を再構築 } //関東や関西などの大エリアチェックボックスを返す //検索条件を保存 $_SESSION["エリア①"] = $_GET["エリア①"]; } else if ($_GET["Area"] == 2) { //大エリアに応じた都道府県のチェックボックスを返す //検索条件を保存 $_SESSION["エリア②"] = $_GET["エリア②"]; } else if ($_GET["Area"] == 3) { //都道府県に応じた市区町村のチェックボックスを返す //検索条件を保存 $_SESSION["エリア③"] = $_GET["エリア③"]; }
あとは、任意のチェックボックスにチェックし検索ボタンが押されると上記で説明したプログラムにデータが受け渡され検索を開始します。
よろしくお願いします。
■再追記(2016/06/02)
すみません、ajax側のコードを追加しておりませんでした。
ますは、初期起動のコードです。
//初期起動ajax $("エリア選択ボタン").on("click", function() { $.ajax({ url : "hoge.php", type : "get", dataType : "json", scriptCharset: 'utf-8', data: { Area: 1 }, success : function(data){ $("#チェックボックス表示ボックス").remove(); $("#チェックボックス表示ボックス").append(data["tmp"]); }, error: function(XMLHttpRequest, textStatus, errorThrown){ //エラー処理 } }); });
次にチェックボックスにチェックした際のコードです。
$("エリア①").live("change", function() { var Area1 = $('["エリア①"]:checked').map(function(){ return $(this).val() }).get().join(','); var Area2 = $('["エリア②"]:checked').map(function(){ return $(this).val() }).get().join(','); var Area3 = $('["エリア③"]:checked').map(function(){ return $(this).val() }).get().join(','); $.ajax({ url : "hoge.php", type : "get", dataType : "json", scriptCharset: 'utf-8', data: { Area : 1, Area1: Area1, Area2: Area2, Area3: Area3 }, success : function(data){ $("#大エリアボックス").remove(); $("#大エリアボックス").append(data["エリア①"]); if (data["エリア②"]) { $("都道府県ボックス").remove(); $("都道府県ボックス").append(data["エリア②"]); } }, error: function(XMLHttpRequest, textStatus, errorThrown){ //エラー処理 } }); }); //都道府県、市区町村も同じようなコード
この後に、検索ボタンを押すと、上記のようにエリアデータを収集し、検索プログラムへデータを渡します。
よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー