Wat doet het PHP-foutmelding “Kennisgeving: gebruik van undefined constant” gemiddelde?

PHP schrijft deze fout in de logboeken: “Kennisgeving: gebruik van undefined constant”.

fouten in logboeken:

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 regels van de code:

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

Wat betekent het en waarom zie ik het?


Antwoord 1, Autoriteit 100%

U moet uw array-toetsen citeren:

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

Zoals het is, was het op zoek naar constanten genaamd department, name, email, message, enz. Wanneer het niet zo’n constante is, interpreteert PHP (bizarely) het als een string (‘afdeling’, enz.). Vanzelfsprekend kan dit gemakkelijk breken als je een dergelijke constante later hebt gedefinieerd (hoewel het slechte stijl is om een ​​kleine letters te hebben).


Antwoord 2, Autoriteit 37%

De foutmelding is te wijten aan het ongelukkige feit dat PHP impliciet een onbekend token declareert als een constante string met dezelfde naam.

Dat wil zeggen, het probeert dit te interpreteren (let op de ontbrekende aanhalingstekens):

$_POST[department]

De enige geldige manier waarop dit een geldige syntaxis in PHP zou zijn, is als er eerder een constante departmentwas gedefinieerd. Dus helaas, in plaats van te sterven met een fatale fout op dit punt, geeft het deze kennisgeving uit en doet het alsof er een constante is gedefinieerd met dezelfde naam en waarde:

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

Er zijn verschillende manieren waarop u deze foutmelding kunt krijgen, maar ze hebben allemaal dezelfde hoofdoorzaak: een token dat kaneen constante zijn.

Tekens ontbrekende aanhalingstekens: $my_array[bad_key]

Dit is wat het probleem in jouw geval is, en het is omdat je string array-sleutels hebt die niet zijn geciteerd. Het repareren van de snaartoetsen lost de bug op:

Wijzigen:

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

Aan:

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

Variabele ontbreekt dollarteken: var_without_dollar

Een andere reden waarom u deze foutmelding zou kunnen zien, is als u de $van een variabele of $this->van een lid weglaat. Een van de volgende situaties zou bijvoorbeeld een soortgelijk foutbericht veroorzaken:

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

Ongeldig teken in variabelenaam: $bad-variable-name

Een soortgelijk maar subtieler probleem kan optreden als u een niet-toegestaan teken in een variabelenaam probeert te gebruiken – een koppelteken (-) in plaats van een onderstrepingsteken _zou zijn een veelvoorkomend geval.

Dit is bijvoorbeeld OK, aangezien underscores zijn toegestaan in variabelenamen :

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

Maar dit is niet:

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

Het wordt op dezelfde manier geïnterpreteerd:

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

Verwijzen naar een klassenconstante zonder het klassenbereik op te geven

Om naar een klasseconstante te verwijzen, moet je het klassebereik specificeren met ::, als je dit mist, zal PHP denken dat je het hebt over een globale define().

Bijvoorbeeld:

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

Een constante gebruiken die niet is gedefinieerd in deze versie van PHP, of is gedefinieerd in een extensie die niet is geïnstalleerd

Er zijn enkele door het systeem gedefinieerde constanten die alleen bestaan in nieuwere versies van PHP, bijvoorbeeld de modusoptieconstanten voor round()zoals PHP_ROUND_HALF_DOWNbestaan alleen in PHP 5.3 of hoger.

Dus als je deze functie in PHP 5.2 hebt geprobeerd te gebruiken, zeg dan:

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

U krijgt deze foutmelding:

Gebruik van ongedefinieerde constante PHP_ROUND_HALF_DOWN – verondersteld
‘PHP_ROUND_HALF_DOWN’ Waarschuwing (2): Verkeerde parametertelling voor round()


Antwoord 3, autoriteit 3%

je bent waarschijnlijk vergeten ""te gebruiken.

Bijvoorbeeld:

$_array[text] = $_var;

wijzig in:

$_array["text"] = $_var;

Antwoord 4, autoriteit 2%

Je bent vergeten om enkele aanhalingstekens rond je array-toetsen te plaatsen:

$_POST[e-mail]

zou moeten zijn:

$_POST[‘e-mail’]


Antwoord 5

De juiste manier om postvariabelen te gebruiken is

<?php
$department = $_POST['department'];
?>

Gebruik enkele aanhalingstekens(‘)


Antwoord 6

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

Opmerking: gebruik van ongedefinieerde constante test – veronderstelde ‘test’ in D:\xampp\htdocs\sp\test\envoirnmentVariables.php op regel 3
testinformatie


Antwoord 7

Voeg enkele aanhalingstekens in.

Voorbeeld

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

Antwoord 8

Ik weet niet zeker of er enig verschil is, ik gebruik code-ontsteker en ik gebruik “” voor de namen en het werkt geweldig.

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

groeten,

Jorge.


Antwoord 9

Het lijkt erop dat de vooraf gedefinieerde ophaalconstanten verdwenen zijn met de MySQL-extensie, dus we moeten ze toevoegen voor de eerste functie…

//vooraf gedefinieerde ophaalconstanten

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

Ik heb het getest en ben erin geslaagd.

Other episodes