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

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

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

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

Q&A

解決済

2回答

437閲覧

アドレスバーに追加した文字列が変換されてしまう

umauman

総合スコア57

PHP

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

0グッド

0クリップ

投稿2018/07/18 14:52

編集2018/07/19 05:19

前提・実現したいこと

フォームで選択した値の後ろにパラメーターを追加したく思います。
(とある検索フォームで「hogehoge」というワードを検索した時の
結果画面です。それをさらに条件によってソートするものになります。)

下記ソースですと末尾のパラメータ部分の「&xxxxx=yyy」
の「&」や「=」が「%..」と言った文字に置き換わってしまいます。

希望するブラウザのアドレスバーの表示↓↓↓

php

1?s=hogehoge&animals=cat&xxxxx=yyy

このような形式になってしまいます。↓↓↓

php

1?s=hogehoge&animals=cat%26xxxxx%3Dyyy

上記を回避するにはどのようにすれば良いでしょうか?

php

1<?PHP 2 $s=filter_input(INPUT_GET,"s"); 3 $h["s"]=is_null($s)?"":htmlspecialchars($s); 4 $h["s"].='&xxxxx=yyy'; //この部分がブラウザのアドレスバーで変わってしまう 5?> 6 7<form method="get"> 8<input type="text" name="s" value="<?php echo $h["s"] ?>"> 9<button type="submit" name="animals" value="cat"></button> 10<button type="submit" name="animals" value="dog"></button> 11<button type="submit" name="animals" value="rabbit">うさぎ</button> 12</form>

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/07/18 22:13

HTMLの基礎を見直すといい
guest

回答2

0

ベストアンサー

仕様通りです。

sがtext入力である限り無理ですね(もちろんtextに限らず&がvalueに入ってる時点でNG)

URLパラメータは key=value形式となっており複数あると&でつなぎます。
そのほかに&があるとそこで区切りとなってしまうため、URLエンコードが自動でかかります。
「&xxxxx=yyy」はあくまで「s」のvalueですしね。

それもそうですがボタンを押すと「%26xxxxx%3Dyyy」が延々と追記されていく作りもどうにかしないと、ですね。

投稿2018/07/18 22:23

編集2018/07/18 22:43
m.ts10806

総合スコア80765

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

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

umauman

2018/07/19 04:28

ご回答ありがとうございます。色々破たんしているみたいですみません。 >「&xxxxx=yyy」はあくまで「s」のvalueですしね。 そうなのですね。もう1つinputタグを加えて別valueとして取得する方法等でもうちょっとがんばってみます。 確かにどんどん追加されていきます..
m.ts10806

2018/07/19 04:29

> もう1つinputタグを加えて別valueとして取得する方法 今のところそれしかないと思います。
umauman

2018/07/19 05:21

最後に「<input type="hidden" name="xxxxx" value="yyy">」を加えてうまくいきました。 色々とヒントをいただき助かりました。
m.ts10806

2018/07/19 05:22

「最後に」と仰いますが、順番は特に意味はないので、同じform内であればどこに置いても良いかと。
umauman

2018/07/19 05:30

再度、ありがとうございます。 パラメーターとしては特に前後逆になってしまっても結果に違いは無いのかもしれませんが、 <input type="hidden" name="xxxxx" value="yyy">を上に持ってくる、下に持ってくるので もう一つのパラメーター「&animals=cat」と順番が変わるのだな..と思った次第です。
m.ts10806

2018/07/19 05:37

どこになってもパラメータを受け取るときは PHPの場合だと$_GET[{key}]なので順番は変えたところで何に対して何の影響もありません。
umauman

2018/07/19 05:42

あくまでブラウザのアドレスバーの見た目の話をしているつもりなのですが違っていますか...?
m.ts10806

2018/07/19 05:45 編集

気を悪くされたら申し訳ないのですが、 見た目がどうでもプログラムに与える影響はないので、順番がどうというのをこだわるのが私は分かりません。
umauman

2018/07/19 05:56

最初は結果に影響があるのかなと思っていたのですが、最後の方に変わりないことがわかりましたので 今は特にこだわりは無いです。 この気づいた部分の説明が抜けていたので混乱させてしまったかもしれません。 こちらこそ申し訳ございません。
m.ts10806

2018/07/19 06:08

いえいえ、ちょっときつめの表現になってしまいました。申し訳ないです。
guest

0

パースして、hidden で突っ込んでもだめなんでしたっけ?
*すまん。試してない^^;

追記:ちょっとサンプル書いてみた。→ぜんぜん違うものになったw

php

1<?PHP 2function h($str){ 3 return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); 4} 5 6$s = isset($_GET['s']) ? (array)$_GET['s'] : ['']; 7var_dump($s); 8$i = 0; 9?> 10 11<!DOCTYPE html> 12<html lang="ja"> 13<head> 14<meta charset="utf-8"> 15<title>test</title> 16</head> 17<body> 18 <form method="get"> 19 <?php foreach($s as $val):?> 20 <input type="text" name="s[<?php echo $i;?>]" value="<?php echo h($s[$i])?>"> 21 <?php $i+=1;?> 22 <?php endforeach;?> 23 <?php if($s[0] !== ''):?> 24 <input type="text" name="s[<?php echo $i;?>]"> 25 <?php endif;?> 26 <button type="submit" name="animals" value="cat"></button> 27 <button type="submit" name="animals" value="dog"></button> 28 <button type="submit" name="animals" value="rabbit">うさぎ</button> 29 </form> 30</body> 31</html>

サンプルなので、いろいろ考慮してないです。
例えば、$s[0]消した場合とか。

投稿2018/07/19 04:58

編集2018/07/19 06:00
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

umauman

2018/07/19 05:14

ありがとうございます。「パース」というものが初見なのですが、調べてみます。
退会済みユーザー

退会済みユーザー

2018/07/19 06:03

構文解析することを指します。この場合は GET の中身を取り出すことです。 hidden で追記でも良かったと思いますが、text に入れる方法でサンプル作ってみました。
umauman

2018/07/19 06:08

動作確認しましたが入力したテキストがURLに追加されていきます。 これもとても勉強になりそうです。 パースの解説もありがとうございます!
退会済みユーザー

退会済みユーザー

2018/07/19 06:13

ん?追加したかったんじゃないの? 追加したいって要件だと思って書いたんだけど^^; いらないなら、$s を配列に入れるのをやめて、foreach の内容を適当に活かせばよいです。
umauman

2018/07/19 06:29

テキスト追加であっています。(日本語の問題ですみません...) こういうのをさらっと記述できるようになりたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問