phpな休日 BBS sitemap
1. プルダウンで分岐する

FORMのプルダウンメニューですが、下記のようにJavaScriptで制御することが多いです。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<SCRIPT LANGUAGE="JavaScript"><!--
function Go(form) {
location.href = form.LinkList.options[form.LinkList.selectedIndex].value;
}
//--></SCRIPT>
<title>JavaScript</title>
</head>
<body>
<form name="JumphMenu">
<select name="LinkList">
<option selected>Select...</option>
<option value="1.html">1</option>
<option value="2.html">2</option>
<option value="3.html">3</option>
</select>
<input type="button" value="Go" onclick="Go(this.form)">
</form>
</body>
</html>

サブウインドウで実行

この機能をPHPで実現してみたのが以下です。

<?php
mb_language("ja");
mb_internal_encoding("UTF-8");
if ($_POST["LinkList"] == "1.html" ) { //もし1.htmlが選択されたら
header("Location: http://www.p-ho.net/11/pdlink1/1.html"); //1.htmへ
exit;
}
elseif ($_POST["LinkList"] == "2.html" ) { //そーじゃなくてもし2.htmlが選択されたら
header("Location: http://www.p-ho.net/11/pdlink1/2.html"); //2.htmへ
exit;
}
elseif ($_POST["LinkList"] == "3.html" ) { //そーじゃなくてもし3.htmlが選択されたら
header("Location: http://www.p-ho.net/11/pdlink1/3.html"); //3.htmへ
exit;
}
else { //どれにも当てはまらなければ
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>pdlink1</title>
</head>
<body>
<form method="POST" action="pdlink.php">
<select name="LinkList">
<option selected>Select...</option>
<option value="1.html">1</option>
<option value="2.html">2</option>
<option value="3.html">3</option>
</select>
<input type="submit" value="Go">
</form>
</body>
</html>
<?php
}
?>

サブウインドウで実行

elseifheader("Location:exit が初出ですね。
elseif はコメントにあるとおり “そーじゃなくてもし” の意味で使用します。if・elseif・else で1セットとなり、if・esleif のどれにも該当しなかった場合に else が実行されます。
header("Location: でリダイレクトさせています(他のページにジャンプさせます)。リダイレクト先の記述は相対パスでも可能ですが、環境(ケータイなど)によっては機能しないので、httpから始まるURLを記述してください。
exit はプログラムの終了の意味です。

2. 短いスクリプトを書く

上記スクリプトでプルダウン内の項目を増やしていくと、1個増やすたびに elseif で処理する部分4行を追加していくことになります。整理して項目が増えても処理部分を変更しないで済むようにします。

<?php
mb_language("ja");
mb_internal_encoding("UTF-8");
if (isset($_POST["LinkList"])) {
$LinkPage = "http://www.p-ho.net/11/pdlink2/" . $_POST["LinkList"];
}
if (isset($LinkPage)) {
header("Location: " . $LinkPage);
exit;
}
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>pdlink</title>
</head>
<body>
<form method="POST" action="pdlink.php">
<select name="LinkList">
<option selected>Select...</option>
<option value="1.html">1</option>
<option value="2.html">2</option>
<option value="3.html">3</option>
</select>
<input type="submit" value="Go">
</form>
</body>
</html>

サブウインドウで実行

リダイレクト先ページの情報を前もって $LinkPage に代入してしまいます。そうすることで if 文がスッキリしました。

3. ケータイ対応(Shift_Jis)

JavaScriptで可能な処理を PHPでさせるメリットのひとつにケータイ対応があります。ケータイで動作させるためには Shift_Jisで出力させなければなりませんが、スクリプトのソースは UTF-8で書き、出力のみ Shift_Jisにします。

<?php
mb_language("ja");
mb_internal_encoding("UTF-8");
mb_http_output("SJIS");
ob_start("mb_output_handler");
if (isset$_POST["LinkList"])) {
$LinkPage = "http://www.p-ho.net/11/sift_jis/" . $_POST["LinkList"];
}
if (isset($LinkPage)) {
header("Location: " . $LinkPage);
exit;
}
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Sift_Jis">
<title>pdlink</title>
</head>
<body>
<form method="POST" action="pdlink.php">
<select name="LinkList">
<option selected>Select...</option>
<option value="1.html">1</option>
<option value="2.html">2</option>
<option value="3.html">3</option>
</select>
<input type="submit" value="Go">
</form>
</body>
</html>

変更点は赤文字部分です。内部処理はUTF-8で、出力はShift_Jisで、ob_start() が文字コードを変換します。このスクリプトの文字コードはUTF-8で保存します。

サブウインドウで実行

Fatal error: Uncaught Error: Undefined constant "Y.n.j" in /home/users/2/secret.jp-final/web/phpholiday/11/index.cgi:181 Stack trace: #0 /home/users/2/secret.jp-final/web/phpholiday/index.php(334): include() #1 {main} thrown in /home/users/2/secret.jp-final/web/phpholiday/11/index.cgi on line 181