“Uyarı: Tanımsız sabit kullanımı” PHP hata mesajı ne anlama geliyor?


163

PHP bu hatayı günlüklere yazıyor: "Uyarı: Tanımlanmamış sabit kullanımı".

Günlüklerde hata:

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)

İlgili kod satırları:

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

Ne anlama geliyor ve neden görüyorum?

Yanıtlar:


217

Dizi anahtarlarınızı belirtmelisiniz:

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

Olduğundan, adı verilen sabitler arıyordu department, name, email, message, vb böyle bir sabiti bulmaması durumunda, bir dize ( 'bölümü', vs) olarak PHP (tuhaf) yorumlayıp onu. Açıkçası, bu tür bir sabiti daha sonra tanımladıysanız kolayca kırılabilir (küçük harf sabitleri olması kötü bir stil olsa da).


$ _POST değişkenine atıfta bulunuyor mu?
Nik

3
@Col. Şarapnel, ne zaman sadece dizi anahtarlarının alıntılanması gerektiğini söyledim ? Anahtarları alıntılaması gerekmiyor, sadece onları değil.
Matthew Flaschen

1
dizi anahtarları alıntı gerek yok demek istiyorum . bir dizi anahtarları değil, dizeleri alıntı var. bir anahtar özel fiyat teklifi gerektirmez.
Senin Ortak Aklın

4
"Tuhaf" değil ... "geriye dönük uyumlu". PHP başlangıçta izin verilmeyen dizeleri anahtar olarak kullanarak izin verdi ve hatta tanıtıldı. (Tamam, belki de hala "tuhaf". :-)
Brian White

1
@BrianWhite Eğlenceli gerçek, bu işlevselliği kullanımdan kaldırmayı önerdiğimde , resmi olarak teşvik edildiğine dair hiçbir kanıt bulamadım ve sadece PHP 3.0'ın beta sürümleri bildirimde bulunulmadan davranışı içeriyordu, bu nedenle hiç bırakmadım. Her neyse, PHP 8.0'da, her ne zaman gelirse gider.
IMSoP

77

Hata iletisi, PHP'nin bilinmeyen bir belirteci aynı adda sabit bir dize olarak dolaylı olarak bildireceği talihsiz gerçeğinden kaynaklanmaktadır.

Yani, bunu yorumlamaya çalışıyor (eksik alıntı işaretlerini not edin):

$_POST[department]

Bunun PHP'de geçerli sözdizimi olabilmesinin tek geçerli yolu, önceden departmenttanımlanmış bir sabit olmasıydı . Ne yazık ki, bu noktada Ölümcül bir hata ile ölmek yerine, bu Bildirimi yayınlar ve aynı ad ve değerle bir sabit tanımlanmış gibi davranır:

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

Bu hata iletisini almanın çeşitli yolları vardır, ancak hepsinin aynı kök nedeni vardır - sabit olabilecek bir belirteç .

Tırnaklar eksik tırnaklar: $my_array[bad_key]

Sizin durumunuzdaki sorun budur ve alıntılanmamış dizi dizisi anahtarlarına sahip olmanızdır. Dize anahtarlarını düzeltmek hatayı düzeltir:

Değişiklik:

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

Kime:

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

Değişken eksik dolar işareti: var_without_dollar

Bu hata iletisini görmenizin başka bir nedeni $, bir değişkenden veya $this->üyeden ayrılmanızdır . Örneğin, aşağıdakilerden biri benzer bir hata iletisine neden olur:

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

Değişken adında geçersiz karakter: $bad-variable-name

Değişken adında izin verilmeyen bir karakter kullanmaya çalışırsanız benzer ancak daha ince bir sorun ortaya çıkabilir - -alt çizgi yerine tire ( ) _yaygın bir durumdur.

Örneğin, değişken adlarında alt çizgilere izin verildiğinden bu sorun olmaz :

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

Ama bu değil:

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

Şununla aynı yorumlanacaktır:

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

Sınıf kapsamını belirtmeden sınıf sabitine başvurma

Bir sınıf sabitine başvurmak için sınıf kapsamını belirtmeniz gerekir ::, bunu kaçırırsanız PHP bir küresel hakkında konuştuğunuzu düşünecektir define().

Örneğin:

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'nin bu sürümünde tanımlı olmayan veya kurulu olmayan bir uzantıda tanımlı bir sabit kullanma

Sadece örneğin, PHP yeni sürümlerinde mod seçeneği sabitleri var bazı sistem tanımlı sabitleri vardır round()gibi PHP_ROUND_HALF_DOWNPHP 5.3 veya daha sonra mevcut sadece.

PHP 5.2'de bu özelliği kullanmaya çalıştıysanız, şunu söyleyin:

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

Bu hata mesajını alırsınız:

Tanımlanmamış sabit PHP_ROUND_HALF_DOWN kullanımı - 'PHP_ROUND_HALF_DOWN' kabul edildi Uyarı (2): round () için yanlış parametre sayısı


Paylaşım için teşekkürler. Parçayı kaçırdım self::. Şuan çalışıyor.
moreirapontocom

Kuşkusuz, bu cevap diğerlerinden daha kapsamlıdır ve en iyi cevap rozetini hak eder! Sınıf Kapsamını kaçırdım ve Nihayet Gelecek İçin Bazı Değerli Bilgiler elde ettim. Teşekkürler John!
Harish ST

6

Muhtemelen kullanmayı unuttun "".

Örneğin:

$_array[text] = $_var;

değişmek:

$_array["text"] = $_var;

3

Dizi anahtarlarınızın etrafına tek tırnak işareti koymayı kaçırdınız:

$ _POST [email]

olmalı:

$ _POST [ 'email']


$ _POST ['email'] olmalıdır;
Ibnul Rıhtımı

1

Post değişkenlerini kullanmanın doğru yolu

<?php

$department = $_POST['department'];

?>

Tek tırnak kullan (')


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

Uyarı: 3 numaralı satırdaki D: \ xampp \ htdocs \ sp \ test \ envoirnmentVariables.php dosyasında tanımlanmamış sabit test kullanımı - 'test' olduğu varsayılır


1

Tek tırnak işareti ekleyin.

Misal

$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

Herhangi bir fark olup olmadığını emin değilim kod ateşleyici kullanıyorum ve isimler için "" kullanın ve harika çalışıyor.

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

Saygılarımızla,

Jorge.


1
Bu durumda tek ve çift tırnaklar arasında fark yoktur.
Robbie Averill

1
@RobbieAverill, bu durumda aslında - tek tırnaklı dizeler bir şeyleri görüntülediğinden, çift tırnaklı dizelerin kaçış karakterlerini ayrıştıracağı ve değişkenleri değerlendireceği gibi, bu senaryoda tek tırnaklı dizeleri kullanmak iyi bir stildir.
Frankie

0

Görünüşe göre önceden tanımlanmış getirme sabitleri MySQL uzantısı ile kayboldu, bu yüzden onları ilk işlevden önce eklememiz gerekiyor ...

// önceden getirilmiş getirme sabitleri

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

Test ettim ve başardım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.