PHP त्रुटि संदेश "सूचना: अपरिभाषित स्थिर का उपयोग" का क्या अर्थ है?


163

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

इसका क्या मतलब है और मैं इसे क्यों देख रहा हूं?

जवाबों:


217

आपको अपनी सरणी कुंजियाँ उद्धृत करनी चाहिए:

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

है, यह स्थिरांक कहा जाता है के लिए देख रहा था department, name, email, message, आदि जब यह इस तरह के एक निरंतर नहीं मिल रहा है, पीएचपी (बिज़ारेलि) यह एक स्ट्रिंग ( 'विभाग', आदि) के रूप में व्याख्या करता है। जाहिर है, यह आसानी से टूट सकता है यदि आप इस तरह के एक निरंतर बाद में परिभाषित करते हैं (हालांकि यह निचले-मामले के स्थिरांक की खराब शैली है)।


क्या यह $ _POST चर का जिक्र है?
निक

3
@Col। Shrapnel, मैंने कब कहा कि केवल सरणी कुंजियों को उद्धृत करने की आवश्यकता है? उसे चाबियों को उद्धृत करने की आवश्यकता है, लेकिन न केवल उन्हें।
मैथ्यू फ्लैशेन

1
अच्छी तरह से मेरा मतलब है कि सरणी कुंजियों को उद्धृत करने की कोई आवश्यकता नहीं है । किसी को स्ट्रिंग्स को उद्धृत करना है, न कि एरे कीज़ को। एक कुंजी को किसी विशेष उद्धरण की आवश्यकता नहीं होती है।
आपका कॉमन सेंस

4
यह "विचित्र" नहीं है ... यह "पिछड़ा संगत" है। PHP मूल रूप से अनुमति दी और यहां तक ​​कि चाबी के रूप में बिना तार के उपयोग से प्रचारित किया गया। (ठीक है, शायद यह अभी भी "विचित्र" है। :-)
ब्रायन व्हाइट

1
@BriWhite मजेदार तथ्य, जब इस कार्यक्षमता को चित्रित करने का प्रस्ताव है, तो मुझे कोई सबूत नहीं मिला कि यह आधिकारिक तौर पर प्रोत्साहित किया गया था, और केवल PHP 3.0 के बीटा रिलीज़ में बिना नोटिस के व्यवहार शामिल था, इसलिए यह एक विशेषता के पीछे पीछे की ओर प्रतीत होता है। कभी रिलीज नहीं हुई। वैसे भी, यह PHP 8.0 में चला जाएगा, जब भी साथ आता है।
IMSoP

77

त्रुटि संदेश दुर्भाग्यपूर्ण तथ्य के कारण है कि 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

एक और कारण आपको यह त्रुटि संदेश दिखाई दे सकता है यदि आप $किसी चर से, या $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();
}

वर्ग गुंजाइश निर्दिष्ट किए बिना एक वर्ग निरंतर का जिक्र

एक वर्ग स्थिरांक को संदर्भित करने के लिए आपको कक्षा के दायरे को निर्दिष्ट करने की आवश्यकता होती है ::, यदि आपको यह याद आती है तो पीएचपी सोचेंगे कि आप एक वैश्विक के बारे में बात कर रहे हैं 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 के नए संस्करणों में मौजूद हैं, उदाहरण के लिए मोड विकल्प स्थिरांक round()जैसे कि PHP_ROUND_HALF_DOWNकेवल PHP 5.3 या बाद में मौजूद हैं।

तो अगर आप PHP 5.2 में इस सुविधा का उपयोग करने की कोशिश करते हैं, तो कहें:

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

आपको यह त्रुटि संदेश मिलेगा:

अपरिभाषित स्थिर PHP_ROUND_HALF_DOWN का उपयोग - ग्रहण 'PHP_ROUND_HALF_DOWN' चेतावनी (2): दौर के लिए गलत पैरामीटर गणना ()


बांटने के लिए धन्यवाद। मैं self::भाग छूटा । अब यह काम कर रहा है।
moreirapontocom

किसी भी संदेह के बिना, यह उत्तर दूसरों की तुलना में अधिक व्यापक है और सबसे अच्छा जवाब बिल्ला के योग्य है! मैं भी भविष्य के लिए कुछ मूल्यवान जानकारी प्राप्त करने के लिए क्लास स्कोप एंड एंड अप से चूक गया था। धन्यवाद, जॉन!
हरीश एसटी

6

आप शायद इस्तेमाल करना भूल गए ""

उदाहरण के तौर पर:

$_array[text] = $_var;

में बदलो:

$_array["text"] = $_var;


1

पोस्ट वेरिएबल का उपयोग करने का सही तरीका है

<?php

$department = $_POST['department'];

?>

एकल उद्धरण (') का प्रयोग करें


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

सूचना: अनिर्धारित निरंतर परीक्षण का उपयोग - D: \ xampp \ htdocs \ sp \ test \ envoirnmentVariables.php पर लाइन 3 परीक्षण की जानकारी में 'परीक्षण'


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

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

सादर,

जॉर्ज।


1
इस मामले में सिंगल और डबल कोट्स में कोई अंतर नहीं है।
रोबी एवेरिल

1
@RobbieAverill जबकि इस मामले में वास्तव में ऐसा नहीं है - जैसा कि एकल उद्धृत स्ट्रिंग्स चीजों को प्रदर्शित करता है -जैसे कि डबल उद्धरण स्ट्रिंग्स वर्णों से बच जाएगा और इस परिदृश्य में एकल उद्धृत तारों का उपयोग करने के लिए अच्छी शैली का मूल्यांकन करता है।
फ्रेंकी

0

लगता है कि पूर्वनिर्धारित भ्रूण स्थिरांक MySQL एक्सटेंशन के साथ चले गए, इसलिए हमें पहले फ़ंक्शन से पहले उन्हें जोड़ना होगा ...

// पूर्वनिर्धारित भ्रूण स्थिरांक

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

मैंने परीक्षण किया और सफल रहा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.