【PHP】はじめの1バイトしか出力されない怪
2008/11/28
Webデザイン
<?php if($_POST['q1'] != ""){ for($j=1;$j<4;$j++){ $q[$j] = $_POST['q'.$j]; if($q[$j] == "2"){ $q2[$j] = "bad"; } elseif($q[$j] == "4"){ $q2[$j] = "ok"; } elseif($q[$j] == "6"){ $q2[$j] = "good"; } } } ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>テスト</title> </head>
<body>
<?php for($i=1;$i<4;$i++){ echo $q2[$i]."<br />"; }?>
<form action="testtest.php" method="post"> <input type="radio" name="q1" value="2" />2 <input type="radio" name="q1" value="4" />4 <input type="radio" name="q1" value="6" />6<br /> <input type="radio" name="q2" value="2" />2 <input type="radio" name="q2" value="4" />4 <input type="radio" name="q2" value="6" />6<br /> <input type="radio" name="q3" value="2" />2 <input type="radio" name="q3" value="4" />4 <input type="radio" name="q3" value="6" />6<br /> <input type="submit" value="送信" /> </form> </body> </html>
先にも書いたとおり、自分の管理しているWinXP/Apacheのサーバーでは、問題なく動作していたので、これをそのまま会社のイントラサーバーに入れたら、これが動かない。。具体的に言うと、表示が以下のようになってしまう。はじめの一文字しかでない。「bad」「ok」「good」の文字を日本語にすると、1文字どころか、黒いひし形に?のマークが出たマークになってしまい、表示すらされなくなりました。とすれば、どうやらはじめの1バイト分しか出力されていない、という結論に自分なりに達したわけですね。散々悩んで、会社のシステム部に相談しに行きましたが、解決策は見つからず。。。一応他のサーバー(Linux/Apache)に入れたところ、正常に動作しました。こりゃ、会社のイントラサーバー独特の問題かぁ、とあきらめていても仕方がないので、プログラムの書き方を少し変更することにしました。んで、下のように書き換えたら直った、と。<?php if($_POST['q1'] != ""){ for($j=1;$j<4;$j++){ $q[$j] = $_POST['q'.$j]; } } ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>テスト</title> </head>
<body>
<?php for($i=1;$i<4;$i++){ if($q[$i] == "2"){ echo "bad"; } elseif($q[$i] == "4"){ echo "ok"; } elseif($q[$i] == "6"){ echo "good"; } } ?>
<form action="testtest.php" method="post"> <input type="radio" name="q1" value="2" />2 <input type="radio" name="q1" value="4" />4 <input type="radio" name="q1" value="6" />6<br /> <input type="radio" name="q2" value="2" />2 <input type="radio" name="q2" value="4" />4 <input type="radio" name="q2" value="6" />6<br /> <input type="radio" name="q3" value="2" />2 <input type="radio" name="q3" value="4" />4 <input type="radio" name="q3" value="6" />6<br /> <input type="submit" value="送信" /> </form>
</body> </html>
どうも、いろいろいじっているうちにわかってきました。今回、変数名に「質問」という意味を込めて「$q」と「$q2」という変数名を作りました。んで、それぞれを配列として、中に取得したフォーム結果を格納したわけですが、どうやら$q2[0]とか$q2[1]とかが、配列$q2の1番目(0)、配列$q2の2番目(1)という風に認識されず、$q20や、$q21といったように、カッコを無視した状態で認識されているようでした。その証拠に、以下のように変数名を変更したら、問題なく動作するようになりましたし。。。これってどういうことなんでしょうねぇ。<?php if($_POST['q1'] != ""){ for($j=1;$j<4;$j++){ $q[$j] = $_POST['q'.$j]; if($q[$j] == "2"){ $message[$j] = "bad"; } elseif($q[$j] == "4"){ $message[$j] = "ok"; } elseif($q[$j] == "6"){ $message[$j] = "good"; } } } ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>テスト</title> </head>
<body>
<?php for($i=1;$i<4;$i++){ echo $message[$i]."<br />"; }?>
<form action="testtest.php" method="post"> <input type="radio" name="q1" value="2" />2 <input type="radio" name="q1" value="4" />4 <input type="radio" name="q1" value="6" />6<br /> <input type="radio" name="q2" value="2" />2 <input type="radio" name="q2" value="4" />4 <input type="radio" name="q2" value="6" />6<br /> <input type="radio" name="q3" value="2" />2 <input type="radio" name="q3" value="4" />4 <input type="radio" name="q3" value="6" />6<br /> <input type="submit" value="送信" /> </form> </body> </html>
変数名の先頭に数字を使っちゃいけない、ってことくらいはさすがに知っていますが、末尾にも使っちゃいけないってのは知りませんでした。ってか、他のプログラムはそれでも動いてるんですよねぇ。。ってことで、いないとは思いますが、僕と同じようなトラブルでお悩みの方は、一度変数名を、数字を含まないものに変えてみてくださいな。う?む、ナゾだ。。知っている人いたら、教えてください。