Was bedeutet die PHP-Fehlermeldung "Hinweis: Verwendung einer undefinierten Konstante"?

163

PHP schreibt diesen Fehler in die Protokolle: "Hinweis: Verwendung einer undefinierten Konstante".

Fehler in den Protokollen:

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)

Relevante Codezeilen:

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

Was bedeutet das und warum sehe ich es?

Nik
quelle

Antworten:

217

Sie sollten Ihre Array-Schlüssel angeben:

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

Wie war es für Konstanten suchen genannt department, name, email, message, etc. Wenn es nicht so eine Konstante findet, PHP (bizarr) interpretiert es als ein String ( ‚Abteilung‘, usw.). Offensichtlich kann dies leicht brechen, wenn Sie eine solche Konstante später definieren (obwohl es ein schlechter Stil ist, Konstanten in Kleinbuchstaben zu haben).

Matthew Flaschen
quelle
Bezieht es sich auf die Variable $ _POST?
Nik
3
@Col. Shrapnel, wann habe ich gesagt, dass nur Array-Schlüssel in Anführungszeichen gesetzt werden müssen? Er muss die Schlüssel zitieren, aber nicht nur sie.
Matthew Flaschen
1
Nun, ich meine, dass keine Notwendigkeit besteht, Array-Schlüssel zu zitieren . man muss Strings zitieren, keine Array-Schlüssel. Ein Schlüssel erfordert kein spezielles Anführungszeichen.
Ihr gesunder Menschenverstand
4
Es ist nicht "bizarr" ... Es ist "abwärtskompatibel". PHP erlaubte und bewarb ursprünglich sogar nicht zitierte Zeichenfolgen als Schlüssel. (Okay, vielleicht ist es immer noch "bizarr". :-)
Brian White
1
@BrianWhite Unterhaltsame Tatsache, als ich vorschlug, diese Funktionalität zu verwerfen , konnte ich keine Beweise dafür finden, dass sie jemals offiziell empfohlen wurde, und nur Beta-Versionen von PHP 3.0 enthielten das Verhalten ohne den Hinweis, so dass es abwärtskompatibel zu einer Funktion zu sein scheint, die es war nie veröffentlicht. Wie auch immer, es wird in PHP 8.0 weg sein, wann immer das kommt.
IMSoP
77

Die Fehlermeldung ist auf die unglückliche Tatsache zurückzuführen, dass PHP implizit ein unbekanntes Token als konstante Zeichenfolge mit demselben Namen deklariert.

Das heißt, es wird versucht, dies zu interpretieren (beachten Sie die fehlenden Anführungszeichen):

$_POST[department]

Der einzig gültige Weg, wie dies eine gültige Syntax in PHP wäre, wäre, wenn zuvor eine Konstante departmentdefiniert worden wäre. Leider stirbt es an dieser Stelle nicht mit einem schwerwiegenden Fehler, sondern gibt diesen Hinweis aus und verhält sich so, als ob eine Konstante mit demselben Namen und Wert definiert worden wäre:

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

Es gibt verschiedene Möglichkeiten , wie Sie diese Fehlermeldung erhalten können, aber sie alle haben die gleiche Ursache - ein Token , das könnte eine Konstante sein.

Zeichenfolgen fehlen Anführungszeichen: $my_array[bad_key]

Dies ist das Problem in Ihrem Fall, und es liegt daran, dass Sie String-Array-Schlüssel haben, die nicht in Anführungszeichen gesetzt wurden. Durch das Korrigieren der String-Schlüssel wird der Fehler behoben:

Veränderung:

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

Zu:

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

Variables fehlendes Dollarzeichen: var_without_dollar

Ein weiterer Grund, warum diese Fehlermeldung möglicherweise angezeigt wird, besteht darin, dass Sie das $von einer Variablen oder $this->von einem Mitglied weglassen. Beispielsweise würde eine der folgenden Ursachen eine ähnliche Fehlermeldung verursachen:

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

Ungültiges Zeichen im Variablennamen: $bad-variable-name

Ein ähnliches, aber subtileres Problem kann auftreten, wenn Sie versuchen, ein nicht zugelassenes Zeichen in einem Variablennamen zu verwenden. Ein Bindestrich ( -) anstelle eines Unterstrichs _ist ein häufiger Fall.

Dies ist beispielsweise in Ordnung, da Unterstreichungen in Variablennamen zulässig sind :

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

Aber das ist nicht:

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

Es wird genauso interpretiert:

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

Verweisen auf eine Klassenkonstante ohne Angabe des Klassenbereichs

Um auf eine Klassenkonstante zu verweisen, müssen Sie den Klassenbereich mit angeben. ::Wenn Sie dies verpassen, wird PHP denken, dass Sie von einer globalen Konstante sprechen define().

Z.B:

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
  }
}

Verwenden einer Konstante, die in dieser PHP-Version nicht definiert ist oder in einer nicht installierten Erweiterung definiert ist

Es gibt einige systemdefinierte Konstanten, die nur in neueren Versionen von PHP vorhanden sind, z. B. die Modusoptionskonstanten für round()solche, die PHP_ROUND_HALF_DOWNnur in PHP 5.3 oder höher vorhanden sind.

Wenn Sie also versucht haben, diese Funktion in PHP 5.2 zu verwenden, sagen Sie:

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

Sie würden diese Fehlermeldung erhalten:

Verwendung der undefinierten Konstante PHP_ROUND_HALF_DOWN - angenommen 'PHP_ROUND_HALF_DOWN' Warnung (2): Falsche Parameteranzahl für round ()

John Carter
quelle
Danke fürs teilen. Ich habe den self::Teil verpasst . Es funktioniert jetzt.
moreirapontocom
Ohne Zweifel ist diese Antwort umfassender als andere und verdient das beste Antwortabzeichen! Ich habe den Klassenumfang zu sehr verpasst und am Ende einige wertvolle Informationen für die Zukunft erhalten. Danke, John!
Harish ST
6

Sie haben wahrscheinlich vergessen zu verwenden "".

Zum Beispiel:

$_array[text] = $_var;

ändern:

$_array["text"] = $_var;
Giancarlo
quelle
3

Sie haben es versäumt, einfache Anführungszeichen um Ihre Array-Schlüssel zu setzen:

$ _POST [E-Mail]

sollte sein:

$ _POST ['email']

Ahmed Al-hajri
quelle
Es sollte $ _POST ['email'] sein;
Ibnul Quayum
1

Die korrekte Verwendung von Post-Variablen ist

<?php

$department = $_POST['department'];

?>

Verwenden Sie ein einfaches Anführungszeichen (')

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

Hinweis: Verwendung eines undefinierten Konstantentests - angenommener 'Test' in D: \ xampp \ htdocs \ sp \ test \ envoirnmentVariables.php in Zeile 3 Testinformationen

Santoshvijaypawar
quelle
1

Fügen Sie einfache Anführungszeichen ein.

Beispiel

$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']); 
Hackbal Teamz
quelle
0

Ich bin mir nicht sicher, ob es einen Unterschied gibt. Ich benutze Code Igniter und ich benutze "" für die Namen und es funktioniert großartig.

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

Grüße,

Jorge.

Jorge Vicente Mendoza
quelle
1
In diesem Fall gibt es keinen Unterschied zwischen einfachen und doppelten Anführungszeichen.
Robbie Averill
1
@RobbieAverill, obwohl dies in diesem Fall tatsächlich nicht der Fall ist - da Zeichenfolgen in einfachen Anführungszeichen die Ist-Werte anzeigen, in denen Zeichenfolgen in doppelten Anführungszeichen Escapezeichen analysieren und Variablen auswerten, ist es in diesem Szenario ein guter Stil, Zeichenfolgen in einfachen Anführungszeichen zu verwenden.
Frankie
0

Es sieht so aus, als ob die vordefinierten Abrufkonstanten mit der MySQL-Erweiterung verschwunden sind. Wir müssen sie also vor der ersten Funktion hinzufügen ...

// vordefinierte Abrufkonstanten

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

Ich habe getestet und es geschafft.

Venkat
quelle