PHPで$_ENVを使うと警告が出る

このQ&Aのポイント
  • PHPの$_ENVを使用する際に警告が出る問題について解説します。
  • Windowsでの環境確認のためにif文を使用する場合、Undefined index: OSという警告が表示されます。
  • 警告を消す方法として、環境でメッセージの表示をOFFにするか、if文の条件を修正する方法があります。
回答を見る
  • ベストアンサー

PHPで$_ENVを使うと警告が出る

《環境》 Windows 7 SP1 XAMPP 5.6.3.0 Apache 2.4.10 MySQL 5.6.2 PHP 5.6.3 phpAdmin 4.2.11 稼働環境がWindowsかどうかを確認するために if (preg_match("/Windows/", $_ENV["OS"])) というif文を入れると、実行時に Notice: Undefined index: OS in C:\localhost\form.php on line nn という警告が出ます。処理は実行しているようですが気になります。 何が悪いのでしょうか? 環境でメッセージの表示をOFFにしてしまえば消えるとは思いますが、警告を残しておくのは気色悪いので消したいと思います。 よろしくお願いします

  • PHP
  • 回答数5
  • ありがとう数6

質問者が選んだベストアンサー

  • ベストアンサー
  • shimix
  • ベストアンサー率54% (865/1590)
回答No.2

var_dump($_ENV) とでもして確認すれば自明ですが、xampp5.6.3をデフォルトのまま使っているならば$_ENVは(配列として変数は存在していますが)要素数は 0 のハズです。 ∴ undefined index(該当する添え字の要素が存在しない)になります。 php.iniで、variables_order="GPCS" となっているハズですから、variables_order="EGPCS" に書き替えて、Apacheのリスタートさせてください。 (蛇足) >if (preg_match("/Windows/", $_ENV["OS"])) preg_matchじゃなくて、strposを使うべき。マニュアルにもそう書いてます。 http://php.net/manual/ja/function.preg-match.php >ある文字列が他の文字列内に含まれているかどうかを調べるためだけに >preg_match() を使うのは避けた方が良いでしょう。 >strpos() か strstr() 関数を 使う方が速くなります。

gen-goro
質問者

お礼

早々の解答をありがとうございます variables_order="EGPCS"としたら警告は消えました。 当方phpは始めたばかりの初心者のため、マニュアルを見てもGPCSをEGPCSにするとどこへどのような影響が出るのか分かりませんでした。EGPCSのままで特に問題はないのでしょうか? これからsrtpos()/srtstr()関数の使い方を調べてみます。 などと言っていたら、 質問の命令は以下のような使い方をしていました。 質問したプログラムではうまくいったのですが、他のプログラムではエラーが出ました。 if (preg_match("/Windows/", $_ENV["OS"])) { $sql = mb_convert_encodin($sql,"EUC-JP","SJIS"); ← エラー発生 } エラー発生の行に Fatal error: call to undefined function mb_convert_encoding(") in C:\localhost\form2.php on line nn と出てきました。 このif文と次の変換命令は同じ行をコピーして使っているのに、エラーが出たり、出なかったりするので何が原因なのか分からず困っています。 もし分かりましたら重ねてご教授願います。

その他の回答 (4)

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.5

>図解!速効プログラミング PHP+MySQL >2005年8月4日初版第1刷 >という本でphpを学習しています あまりに古すぎます。amazonのレビューで3年前には「昔の本なので、これから買うには不適」と書かれていたりするのに(それからさらに3年経っていますからね)。 >その本の中の設定が、画面はS-JIS、DBはEUC-JPとなっているためです。 おそらくは大昔のMySQL4.0を前提に書かれている書籍なんでしょうかね。ブラウザ側のhtmlもphpスクリプトも今はutf-8が主流ですし、DBへ接続するときにはクライアント(phpスクリプト)の文字セットを通知すればDBサーバとの間で文字コードは自動変換されるようになっています。DBへの接続もPDOが推奨ですし、プレースホルダを使うのがデフォです。そんな古い書籍はとっとと捨ててください(正直、百害あって一利なしです)。 http://qiita.com/mpyw/items/b00b72c5c95aac573b71

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.4

>if (preg_match("/Windows/", $_ENV["OS"])) >{ >$sql = >mb_convert_encodin($sql,"EUC-JP","SJIS"); ← エラー発生 >} >エラー発生の行に >Fatal error: call to undefined function mb_convert_encoding(") in C:\localhost >\form2.php on line nn >と出てきました。 えっと・・。ソースはmb_convert_encodinでエラーメッセージがmb_convert_encodingというのは『あり得ない』ので、どちらかが間違っていますよね。どちらが違っているかわからないと回答不可です。 で、SQL文($sqlという変数名から邪推)をmb_convert_encodingするってことは『あり得ない』ですし、そもそもOSによって文字セットが違うなんてこともないです。いったい何のためにこんなことをやっているのかが謎です。

gen-goro
質問者

お礼

失礼しました codingは「mb_convert_encodin」でした メッセージは、画面を消してしまったので、メモしていた時の内容を手打ちしたものです。その時に「mb_convert_encoding」と打ってしまっていました。 ようは「g」が抜けていたんですね ありがとうございます 何でこんなことをやっているかというと、現在 図解!速効プログラミング PHP+MySQL 2005年8月4日初版第1刷 という本でphpを学習しています その本の中の設定が、画面はS-JIS、DBはEUC-JPとなっているためです。 環境の違いを意識させるのと、変換するにはこうすればできる、といったことを教えようとしているんだと思います。 まだ実際の環境でプログラムを作ったことがないので、このようなことが現実的なのかどうかはわかりません。 また資料が古いため、現在の言語環境に合っているかどうかもわかりません。 その辺は今後の課題だと思います。 大変ありがとうございました

noname#244856
noname#244856
回答No.3

稼動環境をチェックするには定数「PHP_OS」を使うのが理想的です。 function is_windows() { return PHP_OS === 'WIN32' || PHP_OS === 'WINNT'; }

gen-goro
質問者

お礼

ありがとうございます 参考にさせて頂きます

  • t_ohta
  • ベストアンサー率38% (5081/13278)
回答No.1

エラーメッセージに書かれている通り、$_ENV には "OS" というキーが存在しないのです。

gen-goro
質問者

お礼

ありがとうございます そうなんですか・・・

関連するQ&A

  • $_ENV[OS]のキーはどうやって知るでしょうか。

    preg_match("/Windows/",$_ENV[OS])の$_ENV[ ]のキーであるOSはどこから来ているでしょうか。$_ENVはグローバル変数のため、[ ]の入っているキーも予め決まっていると思いますが、その解説してくれるサイトが見つかりません。 特に$_ENV[OS]のOSはどのOSに対応しているでしょうか。そのキーの中身(値)を知りたいですが、それも解説してくれるサイトが見つかりません。 また、グローバル変数のキーを解説してくれるサイトや本をご存知でしたら紹介していただけませんでしょうか。 さらに閲覧者はPCかケータイのどちらからアクセスしているのを判断するにも、preg_match("ケータイ",グローバル変数[使用機器])といったコードを使っていると思いますが、そういう解釈は正しいでしょうか。

    • ベストアンサー
    • PHP
  • PHPでのガラケー、PC、iPhone振り分け

    レッツPHPさんの写メールBBSを使用しています。 iPhoneページを作成し、mailbbs.phpで振り分け設定を試みたのですが どれだけやってもどうにも上手くいきません。 スマートフォンのページ名をmailbbs_smart.htmlとし、 (他のPC用、携帯用ではデフォルトでmailbbs_pc.html、mailbbs_i.htmlとなっていました) 振り分け設定では mailbbs.phpに $ua = explode("/", $_SERVER['HTTP_USER_AGENT']); if (strstr($ua[0], "DoCoMo")) { $env = "i"; // DoCoMo } elseif (preg_match("#^UP.Browser|KDDI#i", $ua[0])) { $env = "i"; // au } elseif (preg_match("#^J-PHONE|Vodafone|SoftBank|MOT#i", $ua[0])) { $env = "i"; // Vodafone } elseif (preg_match($ua[0] , "iPhone")) { $env = "smart"; //iPhone } と記述しました。 他にeregなどでも設定したのですが大抵 ・ページが表示されない か ・PC用のデザインで表示される という風になってしまいます。 htmltamplate.incとの関連付けが上手くいってないからでしょうか。 当方PHPに関してあまり詳しくありません。 レッツPHPさんの写メールBBSを使用した方いましたら、 是非ご教授お願いします。 レッツPHPさんのHP http://php.s3.to/bbs/bbs7.php

    • 締切済み
    • PHP
  • 特殊な連想配列について

    どなたか教えてください。 $_REQUESTを使用した部分に警告が出て正しく表示されません。 参考にしたサンプルソースの説明書にはPHP5.2.6と書いてあったのですが、 私の環境は5.3ですのでそれが起因しているような気がするのですが、ググっても 全くわかりません。 if($_REQUEST(["xxx"]) != "" ) のような記述部分が全て Notice: Undefined index: xxx in C:\xampp\htdocs\abcde\test.php on line 49 のようになります。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 正規表現での最後尾のバックスラッシュの扱いについて

    使用しているSQLテーブルで、フィールド名siteurlに格納しているURLの最後尾にスラッシュがついているものとついていないものがあるので、つけるように統一しようと思います。 PHPを書き、実行したところ、次のようなエラーが出てきました。 Warning: preg_match() [function.preg-match]: No ending delimiter '/' found in C:\xampp\htdocs\sql_open.php on line 42 この部分のコードは次の通りです。 if(!preg_match("\/$",$row["siteurl"])){ //行末がスラッシュでないならスラッシュを追加する $row["siteurl"].="/"; } エラーの内容を考えて、コードを以下のように修正したところ、 if(!preg_match("\/$",$row["siteurl"])){ //行末がスラッシュでないならスラッシュを追加する $row["siteurl"].="/"; } というエラーが出てきます。 preg_match() [function.preg-match]: Delimiter must not be alphanumeric or backslash in C:\xampp\htdocs\sql_open.php on line 42 正規表現はあまり得意ではなく、どこかしら間違いがあったのかもしれませんが自分ではわかりません。 この問題の解決方法をご教示ください。どなたかご教示のほど、どうかよろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPで似たコードを繰り返す場合の簡潔な書き方??

    ご質問失礼します。 PHPでデータベースのデータを下記のようなコードを使い表示しています。 ※質問内容に該当する一部のみ記載させていただいています ・ ・ ・ ・ ・ if(preg_match("/新規/", $row['status1'])){ $table .= $row['status1']." 新規です"; } else { if(preg_match("/更新/", $row['status1'])){ $table .= $row['status1']." 更新です"; } else { if(preg_match("/削除/", $row['status1'])){ $table .= $row['status1']." 削除です"; } else { $table .= "いません"; } } } if(preg_match("/新規/", $row['status2'])){ $table .= $row['status2']." 新規です"; } else { if(preg_match("/更新/", $row['status2'])){ $table .= $row['status2']." 更新です"; } else { if(preg_match("/削除/", $row['status2'])){ $table .= $row['status2']." 削除です"; } else { $table .= "いません"; } } } if(preg_match("/新規/", $row['status3'])){ $table .= $row['status3']." 新規です"; } else { if(preg_match("/更新/", $row['status3'])){ $table .= $row['status3']." 更新です"; } else { ・ ・ ・ ・ ・ ・ status1から、5つあればstatus5まで、似たようなPHPを繰り返し書いて動作させています。 このような場合、簡潔に書く方法などありますでしょうか。 ご存知の方いらっしゃいましたらお時間のある際にお教え下さいませんでしょうか。 また、簡潔に書く方法がない場合でも無いとお教えいただければ幸いです(○ `人´ ○)

    • ベストアンサー
    • PHP
  • 携帯ユーザーのPHPによる振り分け

    WindowsXP dreamweaverCS3を使用 PHPの知識はまったくありません。 PCサイト「www.deri6mon.com」(PC用サイト)がすでにできており、 これをQRコードに変換してあります。 そのQRコードをユーザーがスマホと携帯のバーコードリーダーで変換し、 PCサイトにアクセスさせますが、携帯ユーザーは当然容量がオーバーしますので エラーでとまってしまいます。 そこで、別に携帯サイトを用意してPCサイトにアクセスしてきた携帯ユーザーを 携帯サイトに自動で振り分けたいと考えています。 PCサイトの最上部に下記を記述しました。 PHPを書き込んだファイルはhtml→phpに拡張子を変換してあります。 -----------------ここから------------------- <?php $page_m='http://www.deri6mon.com/mb/index.html'; $agent=$_SERVER['HTTP_USER_AGENT']; if (preg_match("/UP\.Browser\/[3-5]/",$agent) || preg_match("/J-PHONE\//",$agent) || preg_match("/DoCoMo\//",$agent) && !(preg_match("/(Win|Mac|Linux|FreeBSD|OS¥/2|Solaris)/i",$agent)) || preg_match("/UP.Browser/",$agent) || preg_match("/^Vodafone/",$agent) || preg_match("/^SoftBank/",$agent) || preg_match("/^MOT-/",$agent) || preg_match("/DDIPOCKET;/",$agent) || preg_match("/WILLCOM;/",$agent) || preg_match("/L-mode\/\//",$agent)) { header("Location: $page_m"); }else{ }//end if ?> -----------------ここまで---------------- しかしどうしても携帯でPCサイトが表示されてしまいます。 どこの設定(記述)をどうしたら良いのでしょうか。 因みにhttp://emu.mobile.goo.ne.jp/emu/emu.phpでPCサイトのアドレスを入れると携帯サイトのTESTが表示されるので記述は問題ないと思います。 教えてgooの過去Qを調べてみて気がついた記述が、私が使っているサーバーは 自動で挿入される広告があり「header Locationはエラーになる」というのが ありました。 これを回避するにはどうすればいいのでしょうか? PHPの知識が無いのでわかりやすく回答していただけるとたすかります。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHP 下記エラーメッセージの解消について

    下記PHP エラーメッセージの解消方法と、正常にプログラムが動くための簡単なスクリプトも添えていただければ幸いです。よろしくお願い申し上げます。 ■エラーメッセージ (1)Notice: Undefined variable: error in C:\xampp on line 66 (2)Notice: Undefined variable: error in C:\xampp on line 69 ■スクリプト <body> <h1>ログインする</h1> <form action="" method="post"> <dl> <dt>メールアドレス</dt> <dd> ⇒(ここからPHP文です) <input type="text" name="email" size="35" maxlength="255" value="<?php echo htmlspecialchars($_POST['email']); ?>" /> <?php if ($error['login'] == 'blank'): ?> <p class="error">* メールアドレスとパスワードをご記入ください</p> <?php endif; ?> <?php if ($error['login'] == 'failed'): ?> <p class="error">* ログインに失敗しました。正しくご記入ください。</p> <?php endif; ?> ⇒(ここまでPHP文です) </dd> <dt>パスワード</dt> <dd> <input type="password" name="password" size="35" maxlength="255" value="<?php echo htmlspecialchars($_POST['password']); ?>" /> </dd> ......省略 </form> なのですが、 下記エラーメッセージが出てしまいます。 (1)Notice: Undefined variable: error in C:\xampp on line 66 (2)Notice: Undefined variable: error in C:\xampp on line 69 これは、上記スクリプトのPHP文を指しております。 どのように初期化をすればよいかわからず、ここで立ち止まっておりました。 ☆どうすればこのエラーメッセージを解消でき、また、本スクリプトが正常に作動しますでしょうか? ☆初期化のためのスクリプトを添えて頂ければ嬉しく思います。 みなさまのお力を貸して頂ければ幸いでございます。 よろしくお願い申し上げます。

    • ベストアンサー
    • PHP
  • 【PHP】「ereg_match」はなぜ不人気なのか?

    PHP初心者です。 現在ファイルの中を英語や日本語で検索するプログラムを作っています。 検索といえば「preg_match」が一番人気あるように見えます。しかしたとえば、 mb_internal_encoding("UTF-8"); mb_regex_encoding("UTF-8"); if(preg_match( '/我輩は.である/' ,'我輩は猫である')){ print "マッチ!"; } 上記のような使い方をすると「.」は「猫」にマッチせず「...」にするとようやくマッチします。「preg_match」はマルチバイトに対応していないのでしょうか。 そこでマルチバイトと正規表現に対応した検索関数「mb_ereg_match」を知りました。 if(mb_ereg_match( '我輩は.である' ,'我輩は猫である')){ これなら正常にマッチします。 がしかし… 「mb_ereg_match」は全然辞書に載ってません。分厚いPHP辞書をいくつも持ってますが「ereg_match」すら載ってません。何か不人気の理由があるのでしょうか?気に入ったのに不安で使えません。 お詳しい方、解説よろしくお願いいたします。

    • 締切済み
    • PHP
  • PHPのエラーについて教えてください。

    PHPのエラーについて教えてください。 TwitterでBot動かしています。 最近警告が大量に出て困っています。 Warning: preg_match() [function.preg-match]: Compilation failed: unmatched parentheses at offset 29 in /usr/local/www/htdocs/ファイル名/public_html/EasyBotter.php on line 279 EasyBotter.phpのファイルは DLしたまま使用していましたので 何がいけないのか、さっぱりわかりません。 どなたかご指導いただけませんでしょうか? プログラミングができなくても作れるTwitter bot 【バージョン】Easybotter 2.04bata 【設置鯖名】 @PAGES

    • ベストアンサー
    • PHP
  • phpでエージェントの振り分けがうまくいかない

    phpでエージェントの振り分けがうまくいかない 以下のようにmフォルダの中にindex.phpを以下の内容で設置し、同列でi,a,sフォルダを設け それぞれindex.htmlを設けました。しかし携帯でhttp://hoge.com/m で打つとサイトがみつかりませんになります。<?phpより上は空白、改行はありません。 振り分けがうまく機能しないのはなぜでしょうか? <?php $agent = $_SERVER['HTTP_USER_AGENT']; if(preg_match("/^DoCoMo/i", $agent)){ header("Location: http://hoge.com/m/i/index.html"); exit; }else if(preg_match("/^(J?-PHONE|Vodafone|MOT?-[CV]|SoftBank)/i", $agent)){ header("Location: http://hoge.com/m/s/index.html"); exit; }else if(preg_match("/^KDDI?-/i", $agent) || preg_match("/UP?.Browser/i", $agent)){ header("Location: http://hoge.com/m/a/index.html"); exit; }else{ header("Location: http://hoge.com/index.php"); exit; } ?>

    • ベストアンサー
    • PHP

専門家に質問してみよう