飛ばすフォームを作成しようとしています。
<?php
$strKey=urlencode($_POST[’keywd’]);
switch($_POST[’xyz’]){
case ”aa”:
$url=”http://www.aaa”;
break;
case ”bb”:
$url=”http://www.bbb”;
break;
}
header(”Location: ”.$url.$strKey);
?>
と設定し、フォームで
<form method=”POST” action=”○○.php”>
<input type=”text” name=”keywd” size=”20” />
<input type=”submit” name=”xyz” value=”aa” />
<input type=”submit” name=”xyz” value=”bb” /></form>
とすると、「aaa」という表示でボタンは動くのですが、
このvalueを任意の文字に変えたいのです。
どの様に変更すれば、良いのでしょうか?
どうか、よろしくお願いします。
<input type=”submit” name=”xyz” value=”aa” />
の aa を消せば
<input type=”submit” name=”xyz” value=”” />
任意の文字になりますが?意味が違うかな?
えーーーっと
<input type=”submit” name=”aa” value=”aa” />
<input type=”submit” name=”bb” value=”bb” />
を
<input type=”submit” name=”xyz” value=”送信” />
<input type=”submit” name=”xyz” value=”修正” />
とか文字を2バイトにしたいのでしょうか???
(上記だと仮定して)
<input type=”submit” name=”aaa” value=”送信” />
<input type=”submit” name=”bbb” value=”修正” />
と言う風にname属性を変えて、
if(!empty($_POST[’aaa’]))
と言う風にしたほうが楽です。
間違ってたらポイント不要なので
質問を具体的にしてコメントお願いします。
言葉足らずで、ご迷惑おかけします。
おっしゃる通り、文字を2バイトにし、ボタンは5個くらい
設定したいのです。
例えば、ヤフーのトップページの検索に「検索」と「辞書」が
ありますが、こんな風にするにはどうすれば良いのかなと。
仮定として教えてもらったように試してみたのですが、
動きませんでした。
name=”xyz”に「case ”aa”」と「case ”bb”」の区別を
付けられないものでしょうか?
「name=”xyz[aa]”」とすると作動しないのです。
あぁ 意味わかりました
ボタンの表示を変えたかったのね
<form method=” POST” action=” ○○.php”>
<input type=”text” name=”keywd” size=”20”>
<INPUT type=”submit” name=”xyz” value=”aa”>
<input type=”submit” name=”name” value=”任意の名前”>
</form>
FROM構文は FROM内で与えられた変数全部持っていきますから上記のようの関係ない名前でボタン作ってその上に書いてあれば良いかと。。
こう書くと「aa」と「任意の名前」の二つのボタンができて、
「aa」は作動して、「任意の名前」が作動しなかったです。
僕があまりわかってないので、混乱させてすみません。
PHPも質問するのも難しいです。
http://php.s3.to/man/function.array-key-exists.html
array_key_exists
2の回答者です。
emptyじゃなくて
array-key-exists() か isset()を試してみてください。
(失礼しました)
array-key-exists($_POST, ”aaa”)
isset($_POST[”aaa”])
if($_POST[”aaa”] == ”2バイト文字”)でも
行けるかもしれないけど、ブラウザによって
挙動が異なる可能性もありえます。
ご丁寧にありがとうございます。
これで動きそうな感じなのですが、僕の記述方法が悪いのか、
なぜか作動しません。。
もし、お手数でなければ、最終的にどう書けばいいのかも
教えてもらえたら最高です!
本当に初心者まるだしで、すみません。
<form method=” POST” action=” ○○.php”>
<input type=”text” name=”keywd” size=”20”>
<INPUT type=”hidden” name=”xxx” value=”aa”>
<INPUT type=”hidden” name=”yyy” value=”bb”>
<input type=”submit” name=”name” value=”任意の名前”>
</form>
隠したい変数はsubmitでなくhiddenを使います
ボタンの表示はOKになりました!
いや本当に助かりました。ありがとうございます!
ですが、hiddenを2つ設定し、ボタンも2つ置くと、どちらのボタンも
あとで書いた方(ここでは「bb」)のURLに飛んでしまいます。
hidden部分のvalue属性をsubmitボタンそれぞれに反映させる
必要があると思うのですが、これはどうすれば良いのでしょうか?
あと、もう少しで作動する感じです。
どうか、よろしくお願いします。
SEO 対策 検索ツール : DW230
ひとつのボタンで2つの変数を送るなら上記でそのままOKです
ボタン2つで別の動きをするのであれば
FROMごと追加しなければいけません
1個目
<form method=” POST” action=” ○○.php”>
<input type=”text” name=”keywd” size=”20”>
<INPUT type=”hidden” name=”xxx” value=”aa”>
<input type=”submit” name=”name” value=”任意の名前”>
</form>
2個目
<form method=” POST” action=” ○○.php”>
<input type=”text” name=”keywd” size=”20”>
<INPUT type=”hidden” name=”aaa” value=”bb”>
<input type=”submit” name=”name” value=”任意の名前”>
</form>
おまけ
この状態だと設置後下に1行分空白が出来てしまうので
FROMに属性を付けると良いでしょう
<form style=”margin-bottom: 0” method=” POST” action=” ○○.php”>
こんな感じです
これだと確かに希望通りの動作はします。
ですが、テキスト入力欄が2つになってしまいます。
1つのテキスト入力欄にsubmitボタンを2つ付けるのは
無理なのでしょうか?お手数かけてすみません。
できれば、ヤフーのようにと、思っていたのですが。。
難しいです。
サーバーが何で動いているかはともかくとして、以下のようにJavascriptのお世話になっては?
<form method=”POST” action=”○○.php”name=”kkk”>
<input type=”text” name=”keywd” size=”20” />
<input type=”text” name=”xyz” size=”40” value=”” />
<input type=”submit” name=”sbm” value=”エイエイ” onClick=”document.kkk.xyz.value=’aa’;”/>
<input type=”submit” name=”sbm” value=”ビイビイ” onClick=”document.kkk.xyz.value=’bb’;”/>
</form>
また、以下の様にHiddenを使わない手段もありますが、一瞬フォームが乱れるかも。
<form method=”POST” action=”○○.php”name=”kkk”>
<input type=”text” name=”keywd” size=”20” />
<input type=”submit” name=”sbm” value=”エイエイ” onClick=”this.value=’aa’;”/>
<input type=”submit” name=”sbm” value=”ビイビイ” onClick=”this.value=’bb’;”/>
</form>
送信ボタンは複数同じ名前で設定しても、チャンと value で区別できれば問題無いはずなので、元に戻してしまいました。
自前のサーバで試してみたのですが、Shift-JIS では上手くいかないみたいでした。
PHPの内部処理コードとの不一致が影響するのかも。(デフォはShift-JISじゃなかったはず)
文字コードがhtmlとphpとで合っていないとか、文字化けとかがあり得るのでEUCにしてみました。
test2.html
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=EUC-JP”>
<title>TEST2</title>
</head>
<body>
<form method=”POST” action=”test2.php”>
<input type=”text” name=”keywd” size=”20” />
<input type=”submit” name=”xyz” value=”サイトA” />
<input type=”submit” name=”xyz” value=”デフォルト” />
</form>
</body>
</html>
test2.php
<?php
$strKey=urlencode($_POST[’keywd’]);
switch($_POST[’xyz’]){
case ”サイトA”:
$url=”http://www.aaa”;
break;
case ”デフォルト”:
$url=”http://www.bbb”;
break;
}
print ”Location: ”.$url.$strKey.”<br />¥n”;
?>
それぞれをEUCで保存して、テキストボックスに”123456”をテストした所、
”サイトA” ボタンでは、
Location: http://www.aaa123456
”デフォルト” ボタンでは、
Location: http://www.bbb123456
となりました。
やりたかった事をハズしてますか?
いえ、やりたかったことは、この通りなのです!
僕もEUCで書いているのですが、
case ”サイトA”:
という様に、caseの後に「サイトA」と日本語を持ってくると、
作動しなくなってしまうのです。
これで動けば悩みもズバッと解決するのですが。
ですので、caseの後は、英語で表記し、フォームの
value部分を日本語で表示させたいのです。
これは無理でしょうか?
ややこしくなってきてしまいました。申し訳ないです。
P.S.
コメントせずに次の回答へ行ってしまいました。
「dungeon-master」さんの方式も試してみたのですが、
ダメみたいでした。サーバーも関係あるのでしょうか?
ちなみにcside-2nd( http://www.cside-2nd.jp/ )で、
PHP自体は大丈夫なのですが。
「ヤフーのように」ということですので、
↓これでいかがですか。
<?php
if (isset($_POST[’keywd’])) {
//キーワードをエンコード
$strKey = urlencode($_POST[’keywd’]);
//submitボタンにより分岐
if ($_POST[’aa’]) {
$url = ”http://www.aaa”;
} elseif ($_POST[’bb’]) {
$url = ”http://www.bbb”;
} elseif ($_POST[’cc’]) {
$url = ”http://www.ccc”;
}
//それぞれのurlに飛ばす
header(”Location: ”.$url.”?keywd=”.$strKey);
exit;
}
?>
<form action=”test.php” method=”post”>
<input type=”text” name=”keywd” size=”20”>
<input type=”submit” name=”aa” value=”(aaの名前)”>
<input type=”submit” name=”bb” value=”(bbの名前)”>
<input type=”submit” name=”cc” value=”(ccの名前)”>
</form>
どうもこの記述でも作動しないみたいです。
「switch文」と「if else if文」の明確な違いも
分かっていないので、もしかしたら僕が根本的に、
最初から勘違いしてしまっているのかもしれません。
動作確認をしたファイルをそのままコピー&ペーストしているので、全く動かない事は無いように思いますが...
テストしたPHPはversin 5.0.3 でした。影響があるでしょうか?
> caseの後ろに「サイトA」...
動作しなくなるとは一致する物が無くて、$url が空のままということでしょうか?
という事は、正しく比較できていないという事でしょうから
$case1=”サイトA”;
$case2=”デフォルト”;
の様に変数に置換えて(switch 内では、case $case1: の様にして)みては。
これなら、
switch の前で、
var_dump($_POST);
var_dump($case1);
などとして、確認出来るでしょう。
case で比較するのは $POST_[’xyz’] の値、つまり value で与えた属性ですから、同じにしないといけません。
できました!
ようやくできました!
いや、本当に助かりました。
これで生きていけます。
さっきは、なぜか画面が真っ白に表示されたのですが、
これならできました!
お手数かけました。
みなさんありがとうございます!
http://php.s3.to/man/function.mb-convert-encoding.html
mb_convert_encoding
8の回答、説明が不足して申し訳ありません。
<form method=”POST” action=”○○.php”name=”kkk”>
<input type=”text” name=”keywd” size=”20” />
<input type=”text” name=”xyz” size=”40” value=”” />
<input type=”submit” name=”sbm” value=”エイエイ” onClick=”document.kkk.xyz.value=’aa’;”/>
<input type=”submit” name=”sbm” value=”ビイビイ” onClick=”document.kkk.xyz.value=’bb’;”/>
</form>
”と’を半角に置換えるのを忘れないようにください。
PHP側では、xyzの値を switchに掛けてください。比較する文字列はASCII (”aa”や”bb”)の方です。
(回答8の下の例では、switchに掛けるのはsbmの値になっていました。)
マルチバイト文字での比較がうまくいかないのは、サーバーの種類に関係する可能性はあります。
mb_convert_encodingを使って、強制的にコードをマッチさせることができるかもしれません。
switch( mb_convert_encoding($_POST[”xyz”], ”UTF-8”, ”auto”) ){
場合によっては”UTF-8”を”EUC-JP”など別の指定に…
ご親切にありがとうございます!
”と’を半角に変えるのは、なんとかセーフで
やっておりました。
1つ上の回答のおかげで、なんとか動くようになりました。
この方法もこれから試してみます!
「onClick=」を使うのは参考になります。
ありがとうございました。
みなさんの優しさに触れて、嬉しいです。
わかりにくくて、すみません!
「value=”aa”」と記述しないと作動しないのです。
普通「value」には、表示させたい文字を乗せると思うのですが、
これに「aa」としか表示させることができなくて、困ってる次第です。