t-hoso.net

【PHP】はじめの1バイトしか出力されない怪

Webデザイン

いやぁ、ハマッた。これには参りました。ちょっと聞いて下さいな。プログラムの話なので、興味なーし!って方は、頭が痛くなるので読まない方がよいです。会社で、人事評価プログラムのようなものを作っておりまして。PHPで書いております。まぁ、各人が社員IDとパスワードでログインした画面で、同僚や部下を評価するってものですが、まぁ時間はかかっていますが、うまく作れていたわけですよ。自分の部署にある僕が立ち上げて管理しているイントラサーバー(Apache/WinXP)では、正常に動作していたので、よし、問題ないな、ってことでいざ、会社メインのイントラサーバーにデータを移したところ、うまく動かない・・・・さすがに長いプログラムをここには記述ができないので、サンプルプログラムを書いてみました。まずはどうしたいかというと、↓以下のフォームで、各選択肢を選択して送信すると。。。フォームの状態↓こんな感じで、選択したものによって「bad」「ok」「good」の文字が表示される、というカンタンなものです。成功例ソースは、以下の通りです。赤文字の部分がPHP部分。

<?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>

変数名の先頭に数字を使っちゃいけない、ってことくらいはさすがに知っていますが、末尾にも使っちゃいけないってのは知りませんでした。ってか、他のプログラムはそれでも動いてるんですよねぇ。。ってことで、いないとは思いますが、僕と同じようなトラブルでお悩みの方は、一度変数名を、数字を含まないものに変えてみてくださいな。う?む、ナゾだ。。知っている人いたら、教えてください。