web-dev-qa-db-ja.com

PHPエラーメッセージ "Notice:未定義の定数の使用"はどういう意味ですか?

PHPはログにこのエラーを書き込んでいます: "Notice:未定義の定数の使用"。

ログ内のエラー:

PHP Notice:  Use of undefined constant department - assumed 'department' (line 5)
PHP Notice:  Use of undefined constant name - assumed 'name' (line 6)
PHP Notice:  Use of undefined constant email - assumed 'email' (line 7)
PHP Notice:  Use of undefined constant message - assumed 'message' (line 8)

関連するコード行:

$department = mysql_real_escape_string($_POST[department]);
$name = mysql_real_escape_string($_POST[name]);
$email = mysql_real_escape_string($_POST[email]);
$message = mysql_real_escape_string($_POST[message]);

それはどういう意味ですか、そしてなぜそれを見ているのですか?

145
Nik

あなたはあなたの配列キーを引用するべきです:

$department = mysql_real_escape_string($_POST['department']);
$name = mysql_real_escape_string($_POST['name']);
$email = mysql_real_escape_string($_POST['email']);
$message = mysql_real_escape_string($_POST['message']);

そのように、それはdepartmentnameemailmessageなどと呼ばれる定数を探していました。そのような定数が見つからないとき、PHPは(奇妙に)それを文字列( 'department'など)として解釈します。明らかに、後でそのような定数を定義した場合、これは簡単に壊れる可能性があります(ただし、小文字の定数を使用するのは悪いスタイルですが)。

201

エラーメッセージは、PHPが不明なトークンを同じ名前の定数文字列として暗黙的に宣言するという不幸な事実によるものです。

つまり、これを解釈しようとしています(引用符がないことに注意してください)。

$_POST[department]

これがPHPで有効な構文になる唯一の有効な方法は、以前にdepartment定数が定義されていた場合です。悲しいことに、この時点で致命的なエラーで死ぬのではなく、この通知を発行し、同じ名前と値で定数が定義されているかのように動作します。

// Implicit declaration of constant called department with value 'department'
define('department', 'department');  

このエラーメッセージを取得するにはさまざまな方法がありますが、それらの根本原因はすべて同じです。トークンはcouldである可能性があります。

引用符がない文字列:$my_array[bad_key]

これが問題の原因であり、引用されていない文字列配列キーがあるためです。文字列キーを修正すると、バグが修正されます。

変化する:

$department = mysql_real_escape_string($_POST[department]);
...(etc)...

に:

$department = mysql_real_escape_string($_POST['department']);
...(etc)...

変数にドル記号がありません:var_without_dollar

このエラーメッセージが表示されるもう1つの理由は、変数の$またはメンバーの$this->を省略した場合です。たとえば、次のいずれかの場合、同様のエラーメッセージが表示されます。

my_local;   // should be $my_local
my_member;  // should be $this->my_member

変数名に無効な文字があります:$bad-variable-name

変数名に許可されていない文字を使用しようとすると、同様の、より微妙な問題が発生する可能性があります。アンダースコア-の代わりにハイフン(_)が一般的なケースです。

たとえば、 変数名にはアンダースコアを使用できます

if (123 === $my_var) {
  do_something();
}

しかし、これはそうではありません:

if (123 === $my-var) {
  do_something();
}

これと同じように解釈されます:

if (123 === $my - var) {  // variable $my minus constant 'var'
  do_something();
}

クラススコープを指定せずにクラス定数を参照する

クラス定数を参照するには、::を使用してクラススコープを指定する必要があります。これを逃した場合、PHPはグローバルdefine()について話していると思います。

例えば:

class MyClass {
  const MY_CONST = 123;

  public function my_method() {
    return self::MY_CONST;  // This is fine
  }


  public function my_method() {
    return MyClass::MY_CONST;  // This is fine
  }

  public function my_bad_method() {
    return MY_CONST;  // BUG - need to specify class scope
  }
}

このバージョンのPHPで定義されていない定数、またはインストールされていない拡張機能で定義されている定数を使用する

PHPの新しいバージョンにのみ存在するシステム定義の定数がいくつかあります。たとえば、PHP_ROUND_HALF_DOWNなどの round() のモードオプション定数は、PHP 5.3以降にのみ存在します。

PHP 5.2でこの機能を使用しようとした場合、次のように言います。

$rounded = round($my_var, 0, PHP_ROUND_HALF_DOWN);

次のエラーメッセージが表示されます。

未定義の定数PHP_ROUND_HALF_DOWNの使用-「PHP_ROUND_HALF_DOWN」を想定警告(2):round()のパラメーターカウントが間違っています

73
John Carter

おそらく""を使うのを忘れていました。

例えば:

$_array[text] = $_var;

への変更:

$_array["text"] = $_var;
6
Giancarlo

一重引用符を挿入します。

$department = mysql_real_escape_string($_POST['department']);
$name = mysql_real_escape_string($_POST['name']);
$email = mysql_real_escape_string($_POST['email']);
$message = mysql_real_escape_string($_POST['message']); 
1
Hackbal Teamz
<?php 
  ${test}="test information";
  echo $test;
?>

Notice:未定義の定数テストの使用 - 3行目のテスト情報のD:\ xampp\htdocs\sp\test\envoirnmentVariables.phpにある 'test'を想定

1

配列キーを一重引用符で囲みませんでした。

$ _POST [メール]

する必要があります:

$ _POST ['email']

1
Ahmed Al-hajri

Post変数の正しい使い方は

<?php

$department = $_POST['department'];

?>

一重引用符( ')を使用

1
Srihari Goud

コードイグナイターを使用していて、名前に ""を使用している場合に違いがあるかどうかわかりませんが、うまく機能します。

$department = mysql_real_escape_string($_POST["department"]);
$name = mysql_real_escape_string($_POST["name"]);
$email = mysql_real_escape_string($_POST["email"]);
$message = mysql_real_escape_string($_POST["message"]);

について、

ホルヘ。

定義済みのフェッチ定数はMySQLの拡張機能で廃止されたように見えるので、最初の関数の前にそれらを追加する必要があります...

//定義済みのフェッチ定数

define('MYSQL_BOTH',MYSQLI_BOTH);
define('MYSQL_NUM',MYSQLI_NUM);
define('MYSQL_ASSOC',MYSQLI_ASSOC);

私はテストして成功しました。

0
Venkat