スレッド表示 | フラット表示〕 全トピック 920 件中 210 番目 次≫ ≪前

if(preg_match("/Windows/", $_ENV["OS"])){ のラインでエラー

created: 2006-07-29 12:31 | modified: 2006-07-31 14:09 | reply: 5

[3191] if(preg_match("/Windows/", $_ENV["OS"])){ のラインでエラー

user: teru | created: 2006-07-29 12:31
最近PHPの勉強を始めたばかりの初心者です。m(__)m

参考書を片手に勉強しているのですが、どうしても解決しない問題が有りましたので、お解かりになる方がいらっしゃいましたら、ご助言宜しくおねがいします。

//環境------------------------------------------------------------
Windows XP
apache_2.0.58-win32
php-5.1.4
mysql-essential-5.0.22-win32

//エラーメッセージ------------------------------------------------
Notice: Undefined index: OS in C:\Program Files ?中略? \view.php on line 45

//例文------------------------------------------------------------
if(preg_match("/Windows/", $_ENV["OS"])){      //45行目
$sql = mb_convert_encoding($sql,"SJIS","EUC-JP"); //46行目
}


フォームからデータベースに送信する際に、OSがWindowsならEUC-JPからSJISにするという記述を用いているのですが、
if(preg_match("/Windows/", $_ENV["OS"])){ のラインでエラーが表示されてしまします。
本にあったサンプルデータなので、記述に問題があるのではなく、環境に問題があるのだと思っているのですが、何を直せば良いのか全く想像がつきません。

ちなみに、インターネットで自分なりに調べていたところ、同じようにOSが何であるかを調べる方法にif (substr(PHP_OS,0,3) == 'WIN') { と言う定数を引用する方法もあることを知り試してみたところ問題なく動きました。

勉強のためにも、原因がわからないままにしておきたくないので、どうにかして理解したいです。何をどう確認したらよいのかもよくわからない素人ですが、お解かりになる方がいらっしゃいましたら、ご助言宜しくお願いしますm(__)m
reply: 3193 返信 編集 削除

[3193] 配列にインデックスが存在しない

user: ach | created: 2006-07-29 15:10
配列からデータを取得するときに,存在しないインデックス(キー)の値を参照した際に出るエラーです.

具体的にはこんな感じ.コピペして実行すると同じエラーが出るはず.
<?php
error_reporting(E_ALL);
$hoge = Array(
'foo' => 'bar',
'notice' => 0
);
var_dump($hoge);
echo 'foo =>';
var_dump($hoge['foo']);

echo 'hage =>';
var_dump($hoge['hage']); //hageは存在しないのでNoticeが出る

echo 'hage + @ =>';
var_dump(@$hoge['hage']); //@でNoticeは抑制できる
?>

Noticeはあまり重要ではないバグが存在する場合にでるエラーです.
でもNoticeのバグが,意図しない動作の原因になるときもあります.
Parent: 3191  reply: 3194 返信 編集 削除

[3194] Re.配列にインデックスが存在しない

user: teru | created: 2006-07-29 17:41
ach様
ご助言ありがとうございましたm(__)m

お手数をおかけしました。
こんなに丁寧に教えていただけると、素人としては大変助かります。

結果的に理解するには、もう少しいろんな事を理解しなければならないようです(苦笑

教えて下さったことを少しずつ本で索引しながら調べてます。

頑張ります。

本当にありがとうございました。
Parent: 3193  reply: 3198 返信 編集 削除

[3198] おっと,本題の答えを……

user: ach | created: 2006-07-30 20:50
忘れてましたorz

この場合$_ENVにOSというキーに対応する値がないということなわけです.
$_ENVを環境変数と呼びますが,OSやシェルの環境変数を引き継ぐため必ずこのキーがあるというものではないみたいです.
たとえばlinuxでApacheを動かしてもOSの値はなくて,代わりになんじゃコリャというようなもの
たとえばApacheを起動したときに使った仮想ターミナルの種類が入っていたりします.

で,たしかWindowsの場合はシステムの環境変数をそのまま引き継いだ気がしますが……
チェックしてみてください.

それと,こういう場合(どんなキーがあるの?と思ったときとか)
<head><title>全変数一覧</title></head>
<body><pre>
<?php var_dump($GLOBALS); ?>
</pre></body>
とこんなコードで全変数をチェックしてしまうのも手です.
Parent: 3194  reply: 3201 3202 返信 編集 削除

[3201] Re.おっと,本題の答えを……

user: teru | created: 2006-07-31 11:27
achさん
ありがとうございます。
>$_ENVを環境変数と呼びますが,OSやシェルの環境変数を引き継ぐため必ずこのキーがあるというものではないみたいです.

はい。昨日からずっと調べていて、なんとなく雰囲気でそんな感じな事に気づきました。
"なんとなく"と言うのは概念を理解できなくて苦しんでおります(苦笑

で・・・早速$GLOBALSを試してみました。
下記のような結果になりました。

array(5) {
["GLOBALS"]=>
array(5) {
["GLOBALS"]=>
*RECURSION*
["_POST"]=>
array(0) {
}
["_GET"]=>
array(0) {
}
["_COOKIE"]=>
array(0) {
}
["_FILES"]=>
array(0) {
}
}
["_POST"]=>
array(0) {
}
["_GET"]=>
array(0) {
}
["_COOKIE"]=>
array(0) {
}
["_FILES"]=>
array(0) {
}
}

また、register_globals を”Off””ON”することで表示される内容が違う事もわかりました。

ここに_ENVが無いのはおかしなことですよね?

またしばらく調べてきます。
Parent: 3198  返信 編集 削除

[3202] Re.おっと,本題の答えを……

user: teru | created: 2006-07-31 14:09
achさんへ

結果から申しますと解決いたしました。
本当にありがとうございます。

<?php var_dump($GLOBALS); ?>で確認したあと、
php.iniをもう一度再設定し、PEARを再インストールしたところエラーが直りました。

やっと先に進めそうです。

丁寧なご指導頂きありがとうございました。
Parent: 3198  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 210 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑