みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

キーワードの再検索で

index.phpからキーワードを書きだし、search.phpで$_GETで受け取り→エンコード→
リクエストURLまでセットし、表示されるまでは問題ないのですが、ソート順を変更した際にリクエストURLに2回、キーワードが入ってしまいます。ブラウザのアドレスバーをみると、エンコードされた値(%e3%81%bf%e3%81%8b%e3%82%93(みかんみかん)と言う感じにが2回入ってしまいます。それを、ソートを変更しても、キーワードを1回だけ入れるには、どのようにしたらいいのでしょうか?


[index.php]
<p><a href="search.php?keyword=みかん&sort=standard">みかん</a></p>

[search.php]
<?php
$base = 'http://xxx.xxxxxx.co.jp/xxx/xxx';
$keyword =$_GET["keyword"];
$keyword = urlencode($keyword);
$sort = $_GET["sort"];
$sort = urlencode($sort);
// リクエストURL
$url = $base ."&keyword=".$keyword."&sort=".$sort. ;
?>

表示順序
<form action="<?=$_SERVER["PHP_SELF"]?>" method="get">
</select>
<input type="hidden" name="keyword" value="<?php print(htmlspecialchars($keyword, ENT_QUOTES)); ?>">
<select name="sort">
<option value="satandard">新着</option>
<option value="itemPrice">安い</option>
<input type="submit" value="検索">
</select>

よろしくお願いいたします。

投稿日時 - 2012-01-25 22:15:14

QNo.7266558

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

ANo.1です

>$url = $base."?Id=" .$id ."&keyword=".$keyword."&sort=".$sort. ;

この時点での$urlは問題ないと思います。ただ「この$urlをどう使っているのか?」がわかりません。表示順序のソースではフォームのactionは$_SERVER["PHP_SELF"]になっていますので。

PHP_SELF自体、他の方が指摘されているように使うべきではありませんし、フォーム内にidがhiddenで含まれていないのが謎です(何のために$urlにidを含めているのか・・・)。


(蛇足)
urlencodeに関しては、index.phpでの

<p><a href="search.php?keyword=みかん&sort=standard">みかん</a></p>

で「みかん」をそのまま書いていることを指摘しています。今現在問題なくても他の文字列にしたときに思わぬ動作になる可能性を排除できません。基本的にマルチバイト文字を入れるときにはurlencodeしておくべきでは?(当然search.phpは問題ありません)。

投稿日時 - 2012-01-26 12:45:15

補足

$urlのidですがweb apiを利用しておりますのでweb apiのidになります。(リクエストurlも本当はもっと長いのですが、質問で長くすると分からなくなりますので必要な部分だけで質問させていただいてます。)

$urlは,web apiから
$xlm=simplexml_load_file($url);

としております(肝心なところが抜けてすいませんでした)。
商品名などを取得し、search.phpで表示しています。

PHP_SELFのところですが、このページ(search.php)でソートを変更する場合、フォームのactionはどのようにすれば、良いのでしょうか?

表示順序 <form action="<?=$_SERVER["SCRIPT_NAME"] ?>" method="get">

で大丈夫でしょうか?

あとindex.phpのエンコードのところですが、search.phpと同じような感じで
$keyword ="みかん";
$keyword = urlencode($keyword);

<p><a href="search.php?keyword=$keyword&sort=standard">みかん</a></p>

<p><a href="search.php?keyword=%e3%81%bf%e3%81%8b%e3%82%93&sort=standard">みかん</a></p>

としないとだめなのでしょうか?

長くなってすいません。よろしくお願いいたします。

投稿日時 - 2012-01-26 17:27:42

ANo.2

PHP_SELFは脆弱なので最近はあまり使われないようですね
SCRIPT_NAMEをつかいましょう。

投稿日時 - 2012-01-26 11:07:02

お礼

ご指摘ありがとうございます。SCRIPT_NAMEにしました。

投稿日時 - 2012-01-27 07:45:32

ANo.1

>// リクエストURL
>$url = $base ."&keyword=".$keyword."&sort=".$sort. ;

この$urlをどう使っているのでしょうか?「?」がないのでanchor要素のhref属性に書いていたら動作しないのではないかと思うのですが・・・

search.phpではurlencodeしているのに、index.phpでは生のマルチバイト文字を書いているのも不思議です。

投稿日時 - 2012-01-26 09:32:45

補足

ご回答ありがとうございます。
リクエスurlが間違ってました。

// リクエストURL
>$url = $base ."&keyword=".$keyword."&sort=".$sort. ;
部分ですが
$id='xxxxxxxxxx';
$url = $base."?Id=" .$id ."&keyword=".$keyword."&sort=".$sort. ;

search.phpではurlencodeしているのに、index.phpでは生のマルチバイト文字を書いている所ですが、その部分も若干が理解できてなく、index.phpのキーワード(みかん)をsearch.php側で$_GETしてエンコードはできないのでしょうか?
index.php側でエンコードさせてから、search.phpに渡さないとダメなのでしょうか?

よろしくお願いいたします。

投稿日時 - 2012-01-26 10:50:57

あなたにオススメの質問