it-swarm.com.de

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

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 es und warum sehe ich es?

147
Nik

Sie sollten Ihre Array-Schlüssel zitieren:

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

Es wurde nach Konstanten gesucht, die department, name, email, message usw. heißen. Wenn es keine solche Konstante findet, = PHP (bizarr) interpretiert es als String ('department', etc). Offensichtlich kann dies leicht brechen, wenn Sie eine solche Konstante später definieren (obwohl es schlecht ist, Konstanten in Kleinbuchstaben zu haben ).

203

Die Fehlermeldung ist auf die bedauerliche 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]

Die einzig gültige Art und Weise, wie dies eine gültige Syntax in PHP wäre, wäre, wenn zuvor eine Konstante department definiert worden wäre. Anstatt an dieser Stelle mit einem schwerwiegenden Fehler zu sterben, wird dieser Hinweis ausgegeben und es wird so verhalten, 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 alle haben dieselbe Grundursache - ein Token, das eine Konstante sein kann .

Zeichenfolgen ohne Anführungszeichen: $my_array[bad_key]

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

Veränderung:

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

Zu:

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

Variable fehlendes Dollarzeichen: var_without_dollar

Ein weiterer Grund, warum diese Fehlermeldung möglicherweise angezeigt wird, besteht darin, dass Sie das $ einer Variablen oder das $this-> eines Mitglieds weglassen. ZB würde eine der folgenden 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 unzulässiges Zeichen in einem Variablennamen zu verwenden - ein Bindestrich (-) anstelle eines Unterstrichs _ wäre ein häufiger Fall.

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

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

Das ist aber nicht:

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

Es wird wie folgt 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 define() sprechen. .

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 Version von PHP nicht definiert ist oder in einer Erweiterung definiert ist, die nicht installiert ist

Es gibt einige systemdefinierte Konstanten, die nur in neueren Versionen von PHP existieren, zum Beispiel die Modusoptionskonstanten für round() wie PHP_ROUND_HALF_DOWN existieren nur in PHP 5.3 oder höher.

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 ()

73
John Carter

sie haben wahrscheinlich vergessen, "".

Zum Beispiel:

$_array[text] = $_var;

ändern:

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

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

$ _POST [email]

sollte sein:

$ _POST ['email']

2
Ahmed Al-hajri

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']); 
1
Hackbal Teamz
<?php 
  ${test}="test information";
  echo $test;
?>

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

1

Die korrekte Verwendung von Post-Variablen ist

<?php

$department = $_POST['department'];

?>

Verwenden Sie einfache Anführungszeichen (')

1
Srihari Goud

Ich bin mir nicht sicher, ob es einen Unterschied gibt, wenn ich Code Igniter verwende 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.

Es sieht so aus, als ob die vordefinierten Fetch-Konstanten 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 war erfolgreich.

0
Venkat