183

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

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

4

8 に答える 8

244

department文字列を意味します(ここでは配列キーとして使用されます)。PHPの文字列は、引用符で囲む必要があります。昔、PHPは単一単語の文字列に引用符を使用することについて怠惰でしたが、最近はもう昔のことです。

'department'したがって、またはである必要があります"department"

同じことが他のエラーにも当てはまります。

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

于 2010-05-31T03:09:12.077 に答える
90

エラーメッセージは、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の新しいバージョンにのみ存在するシステム定義の定数がいくつかあります。たとえば、PHP5.3以降にのみ存在するround()などのモードオプション定数がありますPHP_ROUND_HALF_DOWN

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

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

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

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

于 2011-11-06T05:59:45.497 に答える
7

おそらく使用するのを忘れたでしょう""

例えば:

$_array[text] = $_var;

への変更:

$_array["text"] = $_var;
于 2016-05-30T14:12:23.780 に答える
6

配列キーを一重引用符で囲むことができませんでした。

$_POST[メール]

する必要があります:

$ _POST ['email']

于 2017-10-07T08:45:35.817 に答える
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']); 
于 2016-10-21T16:07:03.210 に答える
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"]);

よろしく、

ホルヘ。

于 2011-08-08T16:28:09.780 に答える
0

投稿変数を使用する正しい方法は次のとおりです。

<?php

$department = $_POST['department'];

?>

一重引用符(')を使用する

于 2012-10-15T10:59:57.667 に答える
0

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

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

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

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

于 2018-03-21T14:50:09.233 に答える