PHPで動的URLを静的URLに変換するやり方を教えてください。
<form method="GET" action="aaa/bbb">
<input type="checkbox" name="ad" value="0">
<input type="checkbox" name="ad" value="1">
<input type="checkbox" name="ad" value="2">
<input type="checkbox" name="sb" value="0">
<input type="checkbox" name="sb" value="1">
<input type="checkbox" name="sb" value="2">
<input type="submit" value="送信">
</form>
上記のフォームからチェックボックスを複数選択してsubmitしたとき、
ブラウザのURLはhttp://www.hogehoge.com/aaa/bbb?ad=1&sb=2
となっていたとします、
これをhttp://www.hogehoge.com/aaa/bbb/1/2
と書き換えるにはどんなPHPスクリプトを書けばよいのでしょうか?
実際はもっとチェックボックスの数が多いので、
mod_rewrite は不向きのように思います。
そうすると、path_info を使うのが良いと思うのですが、
具体的にどのようにコーディングすればいいか分かりません。
お手数ですが、回答をお願いいたします。
No.6ベストアンサー
- 回答日時:
力量不足で実際のスクリプトは私には書けない事は了解されていますね?
>http://hoge.example.com/aaa/bbb/z10Hqwd/などへヘッダーで飛ばすというようなやり方になるのでしょうか?
FORMを受けるのと表示するのの2つスクリプトにした方が作りやすいかなあ?
formを受けるphpなりCGIなりはRewriteの影響を受けない別のディレクトリに置いた方が判りやすそうです
例:
http://hoge.example.com/aaa/bbb/index.php が表示するphp
http://hoge.example.com/ZZZ/encode.php がFORMを受けるPHP
encode.php の役目:
formから受けた場合 =>上から(と言うか配列の添え字の順番に)On/Offの判定をして
まず2進数 に変換します。
たしか2進数だとPHPでは31桁までじゃ無かったかなあ? と思うので
例えば20桁づつ 4つの 2進数の数値にします。
それを16進数ないし62進数に変換した値を得ます
ここでよくよく考えたら62進数でも思ったほど短くなりませんね
16進数で20桁だと 16の2乗である256進数で半分の10桁の筈ですから
62進数でも16~17桁? ぐらいかな? 以下16桁と仮定します。
abcd Wqh6 5Uyt x2Mb と言う4桁づつX4の62進数の値が得られたとします。
それをURLとして
Location: http://hoge.example.com/aaa/bbb/abcd/Wqh6/5Uyt/x …
などとジャンプさせます。
http://hoge.example.com/aaa/bbb/.htaccess にRewriteを#4のような内容で書きます
するとURLはそのままですが 内部で(path_infoの場合)
http://hoge.example.com/aaa/bbb/index.php/abcd/W … に変換され
index.php で /abcd/Wqh6/5Uyt/x2Mb/ と言う値を取得することが出来ます。
ここから下がindex.phpの仕事ですが
/abcd/Wqh6/5Uyt/x2Mb/ =>abcd Wqh6 5Uyt x2Mb=>さらに2進数に
それでどのチェックボックスがチェックされたのかが判りますので、それに応じたページを表示します。
尚、index.phpはパラメーターが取得できない場合 (つまり http://hoge.example.com/aaa/bbb/ にアクセスされた場合)は
<FORM ACTION= "/ZZZ/encode.php"
以下 チェックボックス表示
として FORM表示するようにします
(さもないと項目を変えるたびに FORM文を書くHTMLもindex.phpも両方書き換える羽目になります)
以下 私は数字にも弱いので間違えているかもしれませんが
因みにチェックボックスが80個ですべての組み合わせは 2の80乗になると思います。
これを10進法で表すと (計算違いなら突っ込みヨロシク)
1,208,925,819,614,629,174,706,176 通りと言うまさに天文学的な数字(25桁)
チェックボックスがせいぜい4つか5つなら #5さんの回答でいいんですがね
できました!
詳細なご説明とアドバイスをいただき本当にありがとうございました。
umasikajiro様の回答をもとに動的ページ→静的ページにすることができました。
ありがとうございます。
No.5
- 回答日時:
>PHPで動的URLを静的URLに変換するやり方を教えてください。
>ブラウザのURLはhttp://www.hogehoge.com/aaa/bbb?ad=1&sb=2となっていたとします
>これをhttp://www.hogehoge.com/aaa/bbb/1/2と書き換える
この辺で認識がずれていると話にならないので、2点確認させてください。
・「aaa/bbb?ad=1&sb=2」は「aaa/bbb.php?ad=1&sb=2」のtypoですか?
・「aaa/bbb/1/2と書き換える」ということは、この下にindex.htmlがあるということですか?
前者の場合は、bbb.phpの中でGET変数を使ってHTML出力をする仕組みにしているなら、多分mod_rewriteを使わないとできないと思います。
ただ、後者の場合、静的ファイルがチェックボックスの個数分用意されているのであれば、「http://www.hogehoge.com/aaa/bbb/1_2.html」というURLを作ってincludeすればいいだけのような気がします。例えば、こんな感じです($_GET変数のサニタイジング処理は省略します)。
$ad = $_GET['ad']; ←$_GET['ad']=1と仮定
$sb = $_GET['sb']; ←$_GET['sb']=2と仮定
$url = 'http://www.hogehoge.com/aaa/bbb'.$ad.'_'.$sb.'.h …
include $url;
# 文字化けするので、ダブルクォーテーションはシングルクォーテーションにしてあります。
はずしていたらごめんなさい。
この回答への補足
ご回答いただきありがとうございます。
質問の内容が不十分で申し訳ありません。
「aaa/bbb?ad=1&sb=2」は「aaa/bbb.php?ad=1&sb=2」のタイプです。
この場合、mod_rewriteを使わないとできないのではないかとのことですが、
簡単で結構ですので、記述方法を教えていただけないでしょうか?
お手数ですが、宜しくお願いいたします。
No.4
- 回答日時:
#3のでは 考え方が逆か?
phpやcgiにパラメータを与えた結果表示のページを SEO有利にしたいと言うことですね
で、80もチェックボックスがあるとなると 、、、判りません と言うか私では力不足です
一応考え方のみを書いてみます。
ラジオボタンではなくcheckboxで複数選択可なのでnameは全てユニークなものにします
例:
<input type="checkbox" name="ad0">
<input type="checkbox" name="ad1">
<input type="checkbox" name="ad2">
"ad0" や "sb1"は順番に配列に入れておきます
それぞれのnameごと(配列の各要素ごと)のチェックOn/Offは 0と1に つまり2進数に置き換えることが出来ます
例えばチェックボックス3つだけと仮定したら
上の例で ad0 とad2 がOnで ad1 がoffの場合
101 と言う数値に置き換えることが出来ます。
で、その2進数のパラメータを URLから受け取るために
例えばPATH_INFOを使うとして そのまま2進数で80桁だと またまた見苦しい事態になります
そこで 短くするために 16進数を 用います
例えば http://hoge.example.com/aaa/bbb/index.php/F9 でしたら
index.phpに 16進数 0xF9 が渡り 2進数だと 11111001 となり
1~5番目と8番目のチェックボックスがONで 6,7番目がOFF と言うことに成ります
16進数は2進数の1/4の桁数で済むはず(だと思ったけど?)ですから checkbox数80でしたら
20桁で済みます
或いは16進数ではなく0~9 A~Z a~z で数値を表す62進数 ならばもっと短くできますね
と思ったら ↓ここにそれらしきものが
http://www.123net.jp/dev/?query=62&amount=0&blog …
さてそれを Rewriteで静的=>動的変換する場合ですが
http://hoge.example.com/aaa/bbb/ に .htaccess を置くのなら
RewriteEngine on
RewriteCond %{REQUEST_URI} !^/aaa/bbb/index.php
RewriteRule ^(.*)$ /aaa/bbb/index.php/$1 [L]
queryで引数渡しならば
RewriteRule ^(.*)$ /aaa/bbb/index.php?$1 [L]
ですね
これで62進数でうまくいけば
http://hoge.example.com/aaa/bbb/z10Hqwd/ なんてURLにアクセスしてブラウザにはそのURLを表示したまま
実体は
http://hoge.example.com/aaa/bbb/index.php/z10Hqwd/ にアクセスして
index.phpにパラメータを渡し
そのパラメータに基づいた結果表示を クライアントに返せると思います。
この回答への補足
詳細なご説明ありがとうございます。
umasikajiro様のご指摘の通り、actionで指定した送信先のページをSEOに有利にしたい
という意図ですので、get送信が理想的です。
各チェックボックスのOn/Offを0か1かの2進数に置き換えて、されにそれを
62進数に変換してパラメータとしてセットするというところは理解できるのですが、
根本的なことが理解できていないので、質問させてください。
そもそもチェックボックスのOn/Offを判定する為には、一度submitをかける必要がありますよね?
つまり、チェックボックスのOn/Offを判定する判定用のPHPなどを介してパラメータをセットして
http://hoge.example.com/aaa/bbb/z10Hqwd/などへヘッダーで飛ばすというようなやり方になるのでしょうか?
勉強不足で申し訳ありませんが、宜しくお願いいたします。
No.3
- 回答日時:
意図は URLが長々と見苦しい & 動的ページだとSEO的に不利 と言う事ですよね?
チェックボックスが数十個もあるのでしたら GETで送る場合
静的に変換しても
http://hoge.example.com/aaa/bbb/ad0/ad1/ad2/sb0/ …以下サブディレクトリが数十個繋がる
と言うような見苦しいURLに成りますよ?
Form をGETではなく POSTで送って index.phpなり index.cgiなりを インデックスに指定すれば済む問題かと思います。
HTML文は
<form method="POST" action="/aaa/bbb/">
有効な .htaccess または httpd.confの該当Directoryコンテナに
Directoryindex index.php
または
Directoryindex index.cgi index.php
これで FORMを送れば URLは
http://hoge.example.com/aaa/bbb/
と言う すっきりした形になります。
ご回答ありがとうございます。
umasikajiroさんのご説明通り、SEO対策が最大の目的です。
そうですよね。やはりチェックボックスの数が多いので、POST送信を検討してみたいと思います。インデックス指定は.htaccessでやってみます。ありがとうございました。
No.2
- 回答日時:
サーバーソフトはapacheでしょうか。
PHPでという回答にはなりませんが、apacheのRewrite機能(RewriteRule)を使うと実現可能かと思います。
簡単に説明しますと、
1.apacheへ送られてきたリクエストURLをRewriteRule句の正規表現で置換
2.置換後のURLへリダイレクト
といった感じになります。
※)つまり、apacheからしてみれば2回リクエストを受けることになります。(1回目はURLを置換してリダイレクト、2回目は置換後のURLを処理)
正規表現の組み方次第で色々な事ができます。
実際、自分が過去に関わった案件で同様の要件があり使った手です。
ただサーバーを共有していて、かつ他のサービスが稼働中の場合・・・
apacheの再起動が必要になるので実装は拒まれるかもしれません。
参考URL:http://www.nurs.or.jp/~sug/homep/rewrite/rewrite …
ご回答ありがとうございます。
サーバーソフトはapacheです。
もう少し教えて頂きたいのですが、
チェックボックスは80個くらいあって、複数選択可能なんですが、
どのチェックボックスが、いくつ選択されるか分からないので、
想定されるパラメータの組み合わせを正規表現で全て記述しないといけないのでしょうか?汎用的な記述方法ってありますか?
No.1
- 回答日時:
サーバーサイドかクライアントサイド、どちらでURLを生成するかにより、記述方法が変わってくると思います。
サーバーサイドで処理するならば、単純にPHPで$_GET['ad']、$_GET['sb']でURLを生成して、ヘッダーで飛ばしてしまえばいいだけだと思いますが、クライアントサイドでURLを生成する場合だと、PHPではなくて、JavaScriptを使えばよろしいんではないでしょうか?
要はチェックボックスに入力されたら自動的にその値からURLを生成してaction=""に挿入させれば、http://www.hogehoge.com/aaa/bbb/1/2
のような事は可能だと思います。
ご回答いただき、ありがとうございます。
当初は、サーバーサイドで処理する方法を考えておりましたが、
やはり、ヘッダーで飛ばす方法ぐらいしかないのでしょうか。
できれば、あまり使いたくない方法なものですから、、、すみません。
JavaScriptをはあまり詳しくないので、全く思いつきませんでした。ありがとうございます。これから調べてみようと思います。ちなみにサクッとで結構ですから、どのように書けばいいのか、教えていただけたらうれしいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- HTML・CSS ただいま勉強始めたての初心者です。フォームを縦並べにしたいです。 2 2022/11/20 17:18
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- JavaScript Javascript初心者|jQueryの.val()で値を取得し複数の要素を連結させる方法知りたい 2 2022/06/02 12:06
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- PHP $_SESSIONについて教えて下さい。 2 2023/03/02 09:18
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
検索時の選択内容を保持する方法
-
PHP ボタンが押されたら処理を...
-
phpで分からないエラーが出てし...
-
<input type="hidden" >で配列...
-
PHPを勉強中の専門学生です。 ...
-
フォームボタンを押すたびに数...
-
PHPでチェックボックスの内容を...
-
HTMLで前の画面に戻る時、入力...
-
PHPでクリックするたびに変数を...
-
フォームに入力された値を計算...
-
PHPの関数実行
-
php mysql でチェックボックス...
-
チェックボックスの値に応じてP...
-
PHPで画像の渡しが上手く行きま...
-
フォームでのリセットを使う方法
-
PHPで、ボタンを押すと同じペー...
-
チェックボックスから複数のval...
-
エンターでsubmitさせたい
-
PHPによるCSVファイルの指定列...
-
PHPで受け取ったパラメータを別...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
<input type="hidden" >で配列...
-
検索時の選択内容を保持する方法
-
HTMLで前の画面に戻る時、入力...
-
DBの値をチェックボックスに反...
-
フォームへの前回入力値をクリ...
-
PHPでCookieを使った訪問回数に...
-
PHPで画像の渡しが上手く行きま...
-
PHP ボタンが押されたら処理を...
-
HTMLのリンクをクリックするこ...
-
syntax error, unexpected '}' ...
-
画面が更新されてもチェックボ...
-
チェックボックスのvalueを連結...
-
チェックボックスの必須項目指定
-
PHPでユーザー情報を入力して簡...
-
PHPの関数実行
-
POSTデータのNAME属性をVALUEに...
-
パラメーターを隠す
-
phpで分からないエラーが出てし...
-
PHPで、ボタンを押すと同じペー...
-
テキストボックスに初期値を入れる
おすすめ情報