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


163

PHPはこのエラーをログに書き込みます:「通知:未定義の定数の使用」。

ログのエラー:

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]);

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

回答:


217

配列キーを引用する必要があります:

$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(異様に)解釈して。明らかに、後でそのような定数を定義した場合、これは簡単に壊れる可能性があります(小文字の定数を持つのは悪いスタイルですが)。


$ _POST変数を参照していますか?
Nik

3
@Col。榴散弾、配列キーだけを引用する必要があると言ったのはいつですか?彼は鍵を引用する必要がありますが、それだけではありません。
マシューFlaschen

1
配列キーを引用する必要がないことを意味します。配列キーではなく文字列を引用する必要があります。キーは特別な引用を必要としません。
常識

4
「奇妙」ではありません...「下位互換」です。PHPはもともと、引用符で囲まれていない文字列をキーとして使用することを許可および促進していました。(さて、多分それはまだ「奇妙」です。:-)
ブライアンホワイト

1
@BrianWhite面白い事実、この機能を廃止することを提案した場合、これが公式に推奨されているという証拠は見つかりませんでした。また、PHP 3.0のベータリリースのみが予告なしに動作を含んでいたため、以前の機能との下位互換性があるようですリリースされていません。とにかく、PHP 8.0では、いつかはなくなるでしょう。
IMSoP 2018年

77

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

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

$_POST[department]

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

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

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

引用符のない文字列: $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の新しいバージョンモードオプション定数存在するいくつかのシステム定義の定数であるround()ようなPHP_ROUND_HALF_DOWNPHP 5.3以降に存在するだけで。

したがって、この機能をPHP 5.2で使用しようとした場合は、次のように言ってください。

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

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

未定義の定数PHP_ROUND_HALF_DOWNの使用-'PHP_ROUND_HALF_DOWN'と見なされます警告(2):round()のパラメーター数が間違っています


共有してくれてありがとう。そのself::部分を逃した。それは今働いています。
moreirapontocom

間違いなく、この回答は他の回答よりも包括的であり、最高の回答バッジに値します!私はクラスのスコープを逃しすぎて、将来の貴重な情報を得ることになりました。ありがとう、ジョン!
Harish ST

6

あなたはおそらく使用するのを忘れました""

例えば:

$_array[text] = $_var;

への変更:

$_array["text"] = $_var;


1

ポスト変数を使用する正しい方法は

<?php

$department = $_POST['department'];

?>

単一引用符を使用( ')


1
<?php 
  ${test}="test information";
  echo $test;
?>

通知:未定義の定数テストの使用-D:\ xampp \ htdocs \ sp \ test \ envoirnmentVariables.phpの3行目のテスト情報で「test」と想定


1

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

$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']); 

0

違いがあるかどうかわからないコードイグナイターを使用していて、名前に ""を使用しています。

$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
この場合、一重引用符と二重引用符の間に違いはありません。
ロビーアベリル2014年

1
@RobbieAverill一方、この場合は実際にはありません-一重引用符付きの文字列はそのまま表示されるため、二重引用符付き文字列はエスケープ文字を解析して変数を評価するため、このシナリオでは一重引用符付き文字列を使用するのが適切です。
フランキー

0

事前定義されたフェッチ定数はMySQL拡張で廃止されたようなので、最初の関数の前に追加する必要があります...

//事前定義されたフェッチ定数

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.