संदर्भ - इस त्रुटि का PHP में क्या अर्थ है?


1137

यह क्या है?

यह चेतावनियों, त्रुटियों और नोटिसों के बारे में कई उत्तर हैं जो आपको PHP की प्रोग्रामिंग करते समय सामना कर सकते हैं और उन्हें ठीक करने का कोई सुराग नहीं है। यह एक सामुदायिक विकी भी है, इसलिए सभी को इस सूची में शामिल होने और बनाए रखने के लिए आमंत्रित किया जाता है।

ऐसा क्यों है?

"हेडर्स पहले से ही भेजे गए" या "गैर-ऑब्जेक्ट के एक सदस्य को कॉलिंग " जैसे प्रश्न स्टैक ओवरफ्लो पर अक्सर पॉप अप करते हैं। उन प्रश्नों का मूल कारण हमेशा एक ही होता है। तो उन सवालों के जवाब आम तौर पर उन्हें दोहराते हैं और फिर ओपी को दिखाते हैं कि उनके विशेष मामले में किस लाइन को बदलना है। ये उत्तर साइट के लिए कोई मूल्य नहीं जोड़ते हैं क्योंकि वे केवल ओपी के विशेष कोड पर लागू होते हैं। समान त्रुटि वाले अन्य उपयोगकर्ता इसके समाधान को आसानी से नहीं पढ़ सकते क्योंकि वे बहुत अधिक स्थानीय हैं। यह दुखद है क्योंकि एक बार जब आप मूल कारण को समझ गए, तो त्रुटि को ठीक करना तुच्छ है। इसलिए, यह सूची लागू करने के लिए सामान्य तरीके से समाधान की व्याख्या करने की कोशिश करती है।

मुझे यहां क्या करना चाहिए?

यदि आपके प्रश्न को इस के डुप्लिकेट के रूप में चिह्नित किया गया है, तो कृपया नीचे अपना त्रुटि संदेश ढूंढें और अपने कोड में सुधार लागू करें। आम तौर पर अकेले सामान्य उत्तर से स्पष्ट नहीं होने की स्थिति में जांच के लिए उत्तर में आगे के लिंक होते हैं।

यदि आप योगदान करना चाहते हैं, तो कृपया अपना "पसंदीदा" त्रुटि संदेश, चेतावनी या नोटिस, प्रति उत्तर, एक संक्षिप्त विवरण जोड़ें, इसका क्या अर्थ है (भले ही यह उनके मैनुअल पृष्ठ पर केवल हाइलाइटिंग शब्द हो), एक संभावित समाधान या डिबगिंग दृष्टिकोण और मौजूदा क्यू एंड ए की एक सूची जो मूल्य के हैं। इसके अलावा, किसी भी मौजूदा उत्तर को बेहतर बनाने के लिए स्वतंत्र महसूस करें।

सूचि

और देखें:


7
इसके अलावा, चर्चा को टिप्पणियों से बाहर करने के लिए, कृपया इस मेटा प्रश्न पर जाएँ
अर्लज़



जवाबों:


275

चेतावनी: शीर्ष लेख की सूचना को संशोधित नहीं किया जा सकता - हेडर पहले ही भेजे जा चुके हैं

तब होता है जब आपकी स्क्रिप्ट क्लाइंट को एक HTTP हेडर भेजने की कोशिश करती है, लेकिन पहले से ही आउटपुट था, जिसके परिणामस्वरूप हेडर क्लाइंट को पहले ही भेज दिए गए थे।

यह एक है E_WARNINGऔर यह स्क्रिप्ट को नहीं रोकेगा।

एक विशिष्ट उदाहरण इस तरह एक टेम्पलेट फ़ाइल होगा:

<html>
    <?php session_start(); ?>
    <head><title>My Page</title>
</html>
...

session_start()समारोह ग्राहक के लिए सत्र कुकी के साथ हेडर भेजने के लिए कोशिश करेंगे। लेकिन PHP ने हेडर पहले ही भेज दिया था जब उसने <html>आउटपुट स्ट्रीम को तत्व लिखा था । आपको session_start()शीर्ष पर जाना होगा।

आप चेतावनी को ट्रिगर करने वाले कोड से पहले लाइनों के माध्यम से जाकर इसे हल कर सकते हैं और जांच कर सकते हैं कि यह आउटपुट कहाँ है। उस कोड से पहले किसी भी हेडर कोड को स्थानांतरित करें।

PHP के बंद होने के बाद अक्सर एक अनदेखी उत्पादन नई लाइनें है ?>?>फ़ाइल में अंतिम चीज़ होने पर इसे छोड़ देना एक मानक अभ्यास माना जाता है । इसी तरह, इस चेतावनी के लिए एक और सामान्य कारण यह है कि उद्घाटन से <?phpपहले एक खाली स्थान, रेखा या अदृश्य चरित्र होता है, जिससे वेब सर्वर हेडर और व्हाट्सएप / न्यूलाइन भेज सकता है, जब पीएचपी शुरू होता है तो सबमिट नहीं किया जा सकेगा। कोई हेडर।

यदि आपकी फ़ाइल में एक से अधिक <?php ... ?>कोड ब्लॉक हैं, तो आपको उनके बीच में कोई स्थान नहीं होना चाहिए। (नोट: यदि आपके पास स्वचालित रूप से निर्मित कोड था तो आपके पास कई ब्लॉक हो सकते हैं)

यह भी सुनिश्चित करें कि आपके पास अपने कोड में कोई बाइट ऑर्डर मार्क्स नहीं हैं, उदाहरण के लिए जब स्क्रिप्ट का एन्कोडिंग UTF-8 BOM के साथ है।

संबंधित सवाल:


2
यदि आप वर्डप्रेस का उपयोग कर रहे हैं, तो थीम फ़ाइलों की जांच करें। जब मैंने साइट को वर्डप्रेस के नए संस्करण में अपग्रेड किया, तो मैं थीम को अपडेट करने में असमर्थ था क्योंकि यह कई वर्षों में अपडेट नहीं किया गया है। यह समस्या फसली हुई। यह पता चला कि functions.php फ़ाइल में एक से अधिक <था? ?> बीच में रिक्त स्थान के साथ ब्लॉक करें।
रॉय लेबनान

2
@RoyLeban "यदि आपकी फ़ाइल में एक से अधिक ब्लॉक हैं ..." मुझे यकीन नहीं है कि इसका क्या मतलब है। एक "ब्लॉक" क्या है? क्या एक ब्लॉक से मिलकर <?php ?>बनेगा और इसलिए "एक से अधिक ब्लॉक" होंगे <?php ?> <?php ?>?
एंड्रयू फॉक्स

2
कृपया यदि संभव हो तो PHP.ini कॉन्फ़िगरेशन फ़ाइल में 'आउटपुट बफ़रिंग' सुविधा चालू करें। इसका उपयोग इस समस्या को हल करने के लिए किया जाता है। यह HTML फ़ाइल आउटपुट बफर में सहेजा जाता है और क्लाइंट को स्क्रिप्ट बंद होने के बाद ही भेजा जाता है, इसलिए यदि दो हेडर अलग-अलग स्थान पर जारी किए जाते हैं फिर पुराने हेडर को नए हेडर से बदल दिया जाएगा।
निधि डेविड

191

घातक त्रुटि: किसी गैर-ऑब्जेक्ट पर एक सदस्य फ़ंक्शन को कॉल करें ...

कोड के साथ होता है xyz->method()जहां xyzएक वस्तु नहीं है और इसलिए methodइसे नहीं बुलाया जा सकता है।

यह एक घातक त्रुटि है जो स्क्रिप्ट को रोक देगी (आगे संगतता नोटिस: यह PHP 7 के साथ शुरू होने वाली एक त्रुटिजनक त्रुटि बन जाएगी)।

अक्सर यह एक संकेत है कि कोड में त्रुटि की स्थिति के लिए लापता चेक हैं। मान्य करें कि वास्तव में एक वस्तु अपने तरीकों को कॉल करने से पहले एक वस्तु है।

एक विशिष्ट उदाहरण होगा

// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);

उपरोक्त उदाहरण में, क्वेरी तैयार नहीं हो सकता है और prepare()आवंटित करेगा falseकरने के लिए $statementexecute()विधि को कॉल करने की कोशिश करने पर परिणाम घातक त्रुटि का कारण होगा क्योंकि false"गैर-वस्तु" है क्योंकि मूल्य एक बूलियन है।

पता लगाएँ कि आपके फ़ंक्शन ने ऑब्जेक्ट के बजाय एक बूलियन क्यों लौटाया। उदाहरण के लिए, $pdoअंतिम त्रुटि के लिए ऑब्जेक्ट की जाँच करें । डिबग कैसे करें, इस पर विवरण इस बात पर निर्भर करेगा कि किसी विशेष फ़ंक्शन / ऑब्जेक्ट / क्लास के लिए त्रुटियों को कैसे संभाला जाता है।

अगर ->prepareअसफल भी हो रहा है, तो आपके $pdoडेटाबेस हैंडल ऑब्जेक्ट को वर्तमान दायरे में पारित नहीं किया गया है । इसे परिभाषित करें कि कहां मिला। फिर इसे एक पैरामीटर के रूप में पास करें, इसे संपत्ति के रूप में संग्रहीत करें, या इसे वैश्विक दायरे के माध्यम से साझा करें।

एक अन्य समस्या सशर्त रूप से एक ऑब्जेक्ट बना सकती है और फिर उस सशर्त ब्लॉक के बाहर एक विधि को कॉल करने की कोशिश कर सकती है। उदाहरण के लिए

if ($someCondition) {
    $myObj = new MyObj();
}
// ...
$myObj->someMethod();

सशर्त ब्लॉक के बाहर विधि को निष्पादित करने का प्रयास करके, आपकी वस्तु को परिभाषित नहीं किया जा सकता है।

संबंधित सवाल:


115

कुछ भी दिखाई नहीं पड़ता। पेज खाली और सफेद है।

जिसे मौत के व्हाइट पेज या मौत के व्हाइट स्क्रीन के रूप में भी जाना जाता है । यह तब होता है जब त्रुटि रिपोर्टिंग बंद हो जाती है और एक घातक त्रुटि (अक्सर सिंटैक्स त्रुटि) होती है।

यदि आपके पास त्रुटि लॉगिंग सक्षम है, तो आपको अपनी त्रुटि लॉग में ठोस त्रुटि संदेश मिलेगा। यह आमतौर पर "php_errors.log" नामक एक फ़ाइल में होगा, या तो एक केंद्रीय स्थान में (जैसे /var/log/apache2कई लिनक्स वातावरण पर) या स्क्रिप्ट की निर्देशिका में ही (कभी-कभी एक साझा होस्टिंग वातावरण में उपयोग किया जाता है)।

कभी-कभी त्रुटियों के प्रदर्शन को अस्थायी रूप से सक्षम करने के लिए यह अधिक सीधा हो सकता है। फिर सफेद पृष्ठ त्रुटि संदेश प्रदर्शित करेगा। ध्यान रखें क्योंकि ये त्रुटियां वेबसाइट पर आने वाले हर व्यक्ति को दिखाई देती हैं।

इसे निम्न PHP कोड स्क्रिप्ट के शीर्ष पर जोड़कर आसानी से किया जा सकता है:

ini_set('display_errors', 1); error_reporting(~0);

कोड त्रुटियों के प्रदर्शन को चालू करेगा और रिपोर्टिंग को उच्चतम स्तर पर सेट करेगा।

चूंकि ini_set()रनटाइम पर निष्पादित किया जाता है, इसका पार्सिंग / वाक्यविन्यास त्रुटियों पर कोई प्रभाव नहीं पड़ता है। वे त्रुटियां लॉग में दिखाई देंगी। यदि आप उन्हें आउटपुट में प्रदर्शित करना चाहते हैं (जैसे ब्राउज़र में) तो आपको display_startup_errorsनिर्देश सेट करना होगा true। इसे या तो php.iniया में .htaccessया किसी अन्य विधि से करें जो रनटाइम से पहले कॉन्फ़िगरेशन को प्रभावित करता है

अपने लॉग फ़ाइल स्थान को चुनने के लिए आप log_errors और error_log निर्देशों को सेट करने के लिए समान विधियों का उपयोग कर सकते हैं ।

लॉग में देख रहे हैं या डिस्प्ले का उपयोग कर रहे हैं, तो आपको एक बहुत बेहतर त्रुटि संदेश और कोड की लाइन मिल जाएगी जहां आपकी स्क्रिप्ट रुकने के लिए आती है।

संबंधित सवाल:

संबंधित त्रुटियाँ:


3
error_reporting(~0);क्यों नहीं -1? यही वह है जो ~0मूल्यांकन करता है, और बहुत कम गूढ़ है।
फेब्रीको मट्टे

3
मुझे लगता है कि दोनों समान रूप से गुप्त हैं। ~0अधिक स्पष्ट IMO है: खाली बिट सेट को नकारें, अर्थात सभी झंडे सक्षम करें । -1 का मतलब सी में स्टॉप () की तरह «नहीं मिला» के लिए खड़ा है, लेकिन सभी झंडे सेट के साथ एक बिटसेट के रूप में, क्योंकि -1 बाइनरी 1111'1111'1111'1111(32 बिट्स के लिए) है।
nalply

2
ओह, 1111'1111'1111'1111वास्तव में 16 बिट्स है, लेकिन मुझे आशा है कि आप समझते हैं कि मेरा क्या मतलब है।
nalply

3
5.4 से पहले के संस्करणों के लिए @IvanSolntsev, क्षमा करें नहीं, E_STRICTमें शामिल नहीं है E_ALLphp.net/manual/en/errorfunc.constants.php और नीचे स्क्रॉल करें E_STRICT
12'14

102

सूचना: अनिर्धारित सूचकांक

तब होता है जब आप किसी ऐसी सरणी को किसी कुंजी द्वारा एक्सेस करने का प्रयास करते हैं जो सरणी में मौजूद नहीं होती है।

का एक विशिष्ट उदाहरण Undefined Indexनोटिस होगा ( डेमो )

$data = array('foo' => '42', 'bar');
echo $data['spinach'];
echo $data[1];

दोनों spinach और 1सरणी में मौजूद नहीं हैं, जिससे E_NOTICEट्रिगर हो सकता है।

समाधान यह सुनिश्चित करने के लिए है कि सूचकांक या ऑफसेट उस सूचकांक तक पहुंचने से पहले मौजूद हैं। इसका मतलब यह हो सकता है कि आपको यह सुनिश्चित करने के लिए अपने कार्यक्रम में एक बग को ठीक करने की आवश्यकता है कि जब आप उनसे अपेक्षा करते हैं तो वे सूचकांक मौजूद हों। या इसका मतलब यह हो सकता है कि आपको परीक्षण करने की आवश्यकता है कि क्या सूचकांक का उपयोग करना मौजूद हैarray_key_exists या isset:

$data = array('foo' => '42', 'bar');
if (array_key_exists('spinach', $data)) {
    echo $data['spinach'];
}
else {
    echo 'No key spinach in the array';
}

यदि आपके पास कोड है:

<?php echo $_POST['message']; ?>
<form method="post" action="">
    <input type="text" name="message">
    ...

फिर $_POST['message'] सेट नहीं किया जाएगा जब यह पृष्ठ पहली बार लोड हो जाएगा और आपको उपरोक्त त्रुटि मिलेगी। केवल जब फॉर्म जमा किया जाता है और यह कोड दूसरी बार चलाया जाता है तो सरणी इंडेक्स मौजूद होगा। आप आमतौर पर इसके लिए जाँच करते हैं:

if ($_POST)  ..  // if the $_POST array is not empty
// or
if ($_SERVER['REQUEST_METHOD'] == 'POST') ..  // page was requested with POST

संबंधित सवाल:


मैं उपयोग करता हूँif(!empty($_POST['message'])){ //do stuff }
kurdtpage

85

चेतावनी: mysql_fetch_array () पैरामीटर 1 को संसाधन, बूलियन दिए जाने की अपेक्षा करता है

सबसे पहले:

कृपया, mysql_*नए कोड में कार्यों का उपयोग न करें । वे अब बनाए नहीं हैं और आधिकारिक तौर पर पदावनत हैंलाल बॉक्स देखें? इसके बजाय तैयार किए गए कथनों के बारे में जानें, और PDO या MySQLi का उपयोग करें- यह लेख आपको यह तय करने में मदद करेगा कि कौन सा। यदि आप पीडीओ चुनते हैं, तो यहां एक अच्छा ट्यूटोरियल है


यह तब होता है जब आप परिणाम प्राप्त करने का प्रयास करते हैं, mysql_queryलेकिन क्वेरी विफल रही।

यह एक चेतावनी है और स्क्रिप्ट को बंद नहीं करेगा, लेकिन आपके कार्यक्रम को गलत बना देगा।

आपको द्वारा दिए mysql_queryगए परिणाम की जांच करने की आवश्यकता है

$res = mysql_query($sql);
if (!$res) {
   die(mysql_error());
}
// after checking, do the fetch

संबंधित सवाल:

संबंधित त्रुटियाँ:

अन्य mysql*कार्य जो एक पैरामीटर के रूप में एक MySQL परिणाम संसाधन की अपेक्षा करते हैं, वही कारण के लिए एक ही त्रुटि का उत्पादन करेंगे।


5
सिर्फ एक नोट। यदि mysql_queryयह बहुत बुरा नहीं है, तो or dieइसके ऊपर जोड़ना चोट के लिए अपमान जोड़ रहा है।
मदारा का भूत

मेरे द्वारा सामना की गई समस्या $res = mysql_query($query)1 रिटर्न है यदि क्वेरी सफल है तो इसे सच माना जाता है। इसलिए जब का परिणाम गुजर mysql_query करने के लिए mysql_fetch_array() नोटिस से पता चलता है।
16

@ का चयन करें, SHOW, DESCRIBE, EXPLAIN और अन्य विवरणी परिणाम देने वाले, mysql_query () सफलता पर एक संसाधन, या त्रुटि पर FALSE देता है। अन्य प्रकार के SQL स्टेटमेंट्स के लिए, INSERT, UPDATE, DELETE, DROP, आदि, mysql_query () सफलता पर TRUE या त्रुटि पर FALSE देता है।
xdazz

@xdazz वह समस्या है जिसका मुझे सामना करना पड़ रहा है, अपडेट रिटर्न डालें, इसलिए मुझे इस त्रुटि से छुटकारा नहीं मिल सकता है mysql_fetch_array() expects parameter 1 to be resource, boolean given in select कृपया देखें - gist.github.com/romelemperado/93af4cdbd44ebf3a07cbb0e3fc539d7 इस त्रुटि से छुटकारा पाने के लिए कोई सुझाव?
एमवाय

2
@mboy mysql_fetch_array()चयन क्वेरी के लिए है, डालने और अद्यतन के लिए, आपको परिणाम सेट प्राप्त करने की आवश्यकता नहीं है (और कोई परिणाम सेट नहीं है जो आपको लाने दें)।
xdazz

79

घातक त्रुटि: वस्तु संदर्भ में नहीं होने पर $ का उपयोग करना

$thisPHP में एक विशेष चर है जिसे असाइन नहीं किया जा सकता है। यदि इसे ऐसे संदर्भ में एक्सेस किया जाता है जहां यह मौजूद नहीं है, तो यह घातक त्रुटि दी गई है।

यह त्रुटि हो सकती है:

  1. यदि एक गैर-स्थैतिक विधि को सांख्यिकीय रूप से कहा जाता है। उदाहरण:

    class Foo {
       protected $var;
       public function __construct($var) {
           $this->var = $var;
       }
    
       public static function bar () {
           // ^^^^^^
           echo $this->var;
           //   ^^^^^
       }
    }
    
    Foo::bar();

    कैसे ठीक करें: अपने कोड की फिर से समीक्षा करें,$thisकेवल एक ऑब्जेक्ट संदर्भ में उपयोग किया जा सकता है, और इसे कभी भी स्थिर विधि में उपयोग नहीं किया जाना चाहिए। इसके अलावा, एक स्थैतिक विधि को गैर-स्थैतिक संपत्ति तक नहीं जाना चाहिए। self::$static_propertyस्थिर संपत्ति तक पहुँचने के लिए उपयोगकरें।

  2. यदि किसी क्लास विधि से कोड को एक सामान्य फ़ंक्शन या केवल वैश्विक दायरे में और$this विशेष चर को रखते हुए कॉपी किया गया है ।
    कैसे ठीक करें : कोड की समीक्षा करें और $thisएक अलग प्रतिस्थापन चर के साथ बदलें ।

संबंधित सवाल:

  1. गैर-स्थिर विधि को स्थिर के रूप में कॉल करें: PHP घातक त्रुटि: ऑब्जेक्ट संदर्भ में नहीं होने पर $ का उपयोग करना
  2. कोड पर कॉपी करें: घातक त्रुटि: ऑब्जेक्ट संदर्भ में नहीं होने पर $ का उपयोग करना
  3. Stackoverflow पर सभी "ऑब्जेक्ट संदर्भ में नहीं होने पर $ का उपयोग करना"

2
आप यह भी उल्लेख करना चाह सकते हैं कि यह कैसे काम करता है w / क्लोजर (यहां तक ​​कि गैर-स्थिर तरीकों में) और यह 5.4 में "तय" कैसे है।
केंडल हॉपकिंस

2
@ खाक मैं एक क्लोजर के अंदर एक स्थिर कॉल के बारे में बात कर रहा था। की तरह $closure = function() { self::method(); }
केंडल हॉपकिंस

2
@KendallHopkins: यह एक अलग त्रुटि है: "घातक त्रुटि: स्वयं का उपयोग नहीं कर सकता है :: जब कोई वर्ग गुंजाइश सक्रिय नहीं है" हालाँकि आपके साथ $this$closure = function() { $this->method(); };
bespoken

75

घातक त्रुटि: अपरिभाषित फ़ंक्शन को कॉल करें XXX

तब होता है जब आप एक फ़ंक्शन को कॉल करने का प्रयास करते हैं जो अभी तक परिभाषित नहीं है। सामान्य कारणों में लापता एक्सटेंशन और शामिल हैं, सशर्त फ़ंक्शन घोषणा, फ़ंक्शन घोषणा में फ़ंक्शन या सरल टाइपोस शामिल हैं।

उदाहरण 1 - सशर्त समारोह घोषणा

$someCondition = false;
if ($someCondition === true) {
    function fn() {
        return 1;
    }
}
echo fn(); // triggers error

इस मामले में, fn()कभी भी घोषित नहीं किया जाएगा क्योंकि $someConditionयह सच नहीं है।

उदाहरण 2 - समारोह घोषणा में कार्य

function createFn() 
{
    function fn() {
        return 1;
    }
}
echo fn(); // triggers error

इस मामले में, fnकेवल एक बार createFn()बुलाया जाएगा घोषित किया जाएगा । ध्यान दें कि बाद में कॉल createFn()एक मौजूदा फ़ंक्शन के Redeclaration के बारे में एक त्रुटि को ट्रिगर करेगा।

आप इसे एक PHP में निर्मित फ़ंक्शन के लिए भी देख सकते हैं। आधिकारिक मैनुअल में फ़ंक्शन की खोज करने का प्रयास करें , और जांचें कि यह "एक्सटेंशन" (PHP मॉड्यूल) क्या है और PHP के कौन से संस्करण इसका समर्थन करते हैं।

गुम एक्सटेंशन के मामले में, उस एक्सटेंशन को इंस्टॉल करें और इसे php.ini में सक्षम करें। अपने फ़ंक्शन के विस्तार के लिए PHP मैनुअल में इंस्टॉलेशन निर्देशों का संदर्भ लें। आप अपने पैकेज मैनेजर (जैसे aptडेबियन या उबंटू में, yumRed Hat या CentOS में), या एक कंट्रोल पैनल का उपयोग करके एक्सटेंशन को सक्षम या स्थापित करने में सक्षम हो सकते हैं। एक साझा होस्टिंग वातावरण में।

यदि फ़ंक्शन PHP के एक नए संस्करण में पेश किया गया था जो आप उपयोग कर रहे हैं, तो आप मैन्युअल या इसके टिप्पणी अनुभाग में वैकल्पिक कार्यान्वयन के लिंक पा सकते हैं। यदि इसे PHP से हटा दिया गया है, तो इसके बारे में जानकारी के लिए देखें, क्योंकि यह अब आवश्यक नहीं हो सकता है।

लापता होने के मामले में, फ़ंक्शन को कॉल करने से पहले फ़ंक्शन की घोषणा करने वाली फ़ाइल को शामिल करना सुनिश्चित करें।

टाइपो के मामले में, टाइपो को ठीक करें।

संबंधित सवाल:


73

पार्स त्रुटि: सिंटैक्स त्रुटि, अप्रत्याशित T_XXX

तब होता है जब आप अप्रत्याशित स्थान पर T_XXXटोकन रखते हैं , असंतुलित (शानदार) कोष्ठक, php.ini में इसे सक्रिय किए बिना लघु टैग का उपयोग, और बहुत कुछ।

संबंधित सवाल:

आगे की मदद के लिए देखें:

  • http://phpcodechecker.com/ - जो आपके सिंटैक्स संकटों पर कुछ अधिक उपयोगी स्पष्टीकरण प्रदान करता है।

70

घातक त्रुटि: लेखन संदर्भ में फ़ंक्शन रिटर्न मान का उपयोग नहीं कर सकते

यह आमतौर पर तब होता है जब किसी फ़ंक्शन का सीधे उपयोग किया जाता है empty

उदाहरण:

if (empty(is_null(null))) {
  echo 'empty';
}

ऐसा इसलिए है क्योंकि emptyयह एक भाषा निर्माण है और एक फ़ंक्शन नहीं है, इसे 5.5 से पहले PHP संस्करणों में इसके तर्क के रूप में एक अभिव्यक्ति के साथ नहीं कहा जा सकता है। PHP 5.5 से पहले, तर्क को empty()एक परिवर्तनशील होना चाहिए , लेकिन एक मनमाना अभिव्यक्ति (जैसे कि किसी फ़ंक्शन का रिटर्न मान) PHP 5.5+ में स्वीकार्य है।

emptyइसके नाम के बावजूद, वास्तव में यह जांच नहीं करता है कि क्या एक चर "खाली" है। इसके बजाय, यह जाँचता है कि एक चर मौजूद नहीं है, या == false। अभिव्यक्तियों ( is_null(null)उदाहरण में) को हमेशा अस्तित्व में माना जाएगा, इसलिए यहां emptyकेवल यह जांचना है कि क्या यह झूठे के बराबर है। आप empty()यहां से बदल सकते हैं !, जैसे if (!is_null(null)), या स्पष्ट रूप से झूठ की तुलना करना, जैसे if (is_null(null) == false)

संबंधित सवाल:


64

MySQL: आपके SQL सिंटैक्स में एक त्रुटि है; लाइन पर पास ... का उपयोग करने के लिए सही सिंटैक्स के लिए अपने MySQL सर्वर संस्करण से मेल खाने वाले मैनुअल की जाँच करें ...

यह त्रुटि अक्सर इसलिए होती है क्योंकि आप MySQL क्वेरी में दिए गए डेटा को ठीक से बचाना भूल गए।

क्या नहीं करना है ("खराब विचार") का एक उदाहरण :

$query = "UPDATE `posts` SET my_text='{$_POST['text']}' WHERE id={$_GET['id']}";
mysqli_query($db, $query);

इस कोड को सबमिट करने के लिए एक फॉर्म के साथ पृष्ठ में शामिल किया जा सकता है, जैसे URL के साथ http://example.com/edit.php?id=10 (पोस्ट n ° 10 संपादित करने के लिए)

यदि प्रस्तुत पाठ में एकल उद्धरण हैं तो क्या होगा? $queryके साथ समाप्त हो जाएगा:

$query = "UPDATE `posts` SET my_text='I'm a PHP newbie' WHERE id=10';

और जब यह क्वेरी MySQL को भेजी जाती है, तो यह शिकायत करेगी कि वाक्यविन्यास गलत है, क्योंकि बीच में एक अतिरिक्त एकल उद्धरण है।

ऐसी त्रुटियों से बचने के लिए, आपको क्वेरी में उपयोग करने से पहले डेटा को हमेशा बचाना चाहिए

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

प्रलेखन:


3
इसके अलावा, यदि आप अपनी साइट को बॉट्स द्वारा स्वचालित रूप से हैक नहीं करेंगे
अप्सरा

2
@gladoscc "संपादित करें" पर क्लिक करें और उत्तर को संशोधित करें। मुझे पता है कि इसमें सुधार किया जा सकता है।
जोकलिन

2
या एक तैयार sql क्वेरी का उपयोग करें।
मेटेज

53

घातक त्रुटि: XXX बाइट्स की अनुमत मेमोरी का आकार समाप्त हो गया (XXX बाइट्स आवंटित करने की कोशिश की गई)

आपकी स्क्रिप्ट को चलाने के लिए पर्याप्त मेमोरी नहीं है। PHP मेमोरी सीमा तक पहुंच गई है और इसे निष्पादित करना बंद कर देती है। यह त्रुटि घातक है, स्क्रिप्ट बंद हो जाती है। मेमोरी सीमा का मान php.iniफ़ाइल में या ini_set('memory_limit', '128 M');स्क्रिप्ट में उपयोग करके कॉन्फ़िगर किया जा सकता है (जो परिभाषित मूल्य को ओवरराइट कर देगा php.ini)। मेमोरी सीमा का उद्देश्य एकल PHP स्क्रिप्ट को सभी उपलब्ध मेमोरी को बंद करने और पूरे वेब सर्वर को नीचे लाने से रोकना है।

पहली बात यह है कि आपकी स्क्रिप्ट की ज़रूरतों की मात्रा को कम से कम करना है। उदाहरण के लिए, यदि आप एक बड़ी फ़ाइल को एक चर में पढ़ रहे हैं या एक डेटाबेस से कई रिकॉर्ड ला रहे हैं और उन सभी को एक सरणी में संग्रहीत कर रहे हैं, तो यह बहुत सारी मेमोरी का उपयोग कर सकता है। इसके बजाय अपने कोड को बदलें लाइन फ़ाइल लाइन पढ़ने के लिए या डेटाबेस डेटाबेस रिकॉर्ड्स को एक बार में उन सभी को मेमोरी में स्टोर किए बिना। इसके लिए दृश्यों के पीछे क्या चल रहा है और कब डेटा बनाम मेमोरी में कहीं और रखा जाता है, इसके बारे में एक वैचारिक जागरूकता की आवश्यकता है।

यदि यह त्रुटि तब हुई जब आपकी स्क्रिप्ट मेमोरी-इंटेंसिव कार्य नहीं कर रही थी, तो आपको यह देखने के लिए कि क्या कोई मेमोरी लीक है, यह देखने के लिए आपको अपने कोड की जाँच करने की आवश्यकता है। memory_get_usageसमारोह अपने दोस्त है।

संबंधित सवाल:


53

पार्स त्रुटि: सिंटैक्स त्रुटि, अप्रत्याशित T_ENCAPSED_AND_WHITESPACE

यह त्रुटि सबसे अधिक बार सामने आती है जब पूरे जटिल चर निर्माण में संलग्न नहीं होने पर दोहरे-उद्धृत स्ट्रिंग के अंदर प्रक्षेप के लिए एक उद्धृत मूल्य के साथ एक सरणी मान को संदर्भित करने का प्रयास किया जाता है {}

त्रुटि मामला:

यह परिणाम होगा Unexpected T_ENCAPSED_AND_WHITESPACE:

echo "This is a double-quoted string with a quoted array key in $array['key']";
//---------------------------------------------------------------------^^^^^

संभावित सुधार:

एक डबल-उद्धृत स्ट्रिंग में, PHP सरणी कुंजी स्ट्रिंग्स को निर्विवाद रूप से उपयोग करने की अनुमति देगा , और जारी नहीं करेगा E_NOTICE। तो ऊपर लिखा जा सकता है:

echo "This is a double-quoted string with an un-quoted array key in $array[key]";
//------------------------------------------------------------------------^^^^^

संपूर्ण जटिल सरणी चर और कुंजी (एस) को संलग्न किया जा सकता है {}, जिस स्थिति में उन्हें बचने के लिए उद्धृत किया जाना चाहिए E_NOTICEपीएचपी दस्तावेज जटिल चरों के लिए इस सिंटैक्स की सिफारिश करता है।

echo "This is a double-quoted string with a quoted array key in {$array['key']}";
//--------------------------------------------------------------^^^^^^^^^^^^^^^
// Or a complex array property of an object:
echo "This is a a double-quoted string with a complex {$object->property->array['key']}";

बेशक, उपरोक्त में से किसी एक का विकल्प इसे प्रक्षेपित करने के बजाय सरणी चर को बदलना है:

echo "This is a double-quoted string with an array variable". $array['key'] . " concatenated inside.";
//----------------------------------------------------------^^^^^^^^^^^^^^^^^^^^^

संदर्भ के लिए, PHP स्ट्रिंग्स मैनुअल पेज में चर पार्सिंग पर अनुभाग देखें


45

चेतावनी: [फ़ंक्शन] : स्ट्रीम खोलने में विफल: [कारण]

यह तब होता है जब आप किसी फ़ाइल को आमतौर पर include, requireयाfopen PHP फ़ाइल को नहीं ढूंढ पाता है या फ़ाइल लोड करने के लिए पर्याप्त अनुमति नहीं होती है।

यह कई कारणों से हो सकता है:

  • फ़ाइल पथ गलत है
  • फ़ाइल पथ सापेक्ष है
  • रास्ता शामिल करना गलत है
  • अनुमतियाँ बहुत अधिक प्रतिबंधात्मक हैं
  • SELinux लागू है
  • और बहुत सारे ...

एक सामान्य गलती निरपेक्ष पथ का उपयोग नहीं करना है। यह आसानी से एक पूर्ण पथ या का उपयोग करके हल किया जा सकता जादू स्थिरांक की तरह __DIR__या dirname(__FILE__):

include __DIR__ . '/inc/globals.inc.php';

या:

require dirname(__FILE__) . '/inc/globals.inc.php';

यह सुनिश्चित करने के लिए कि इन मुद्दों का निवारण करने के लिए सही मार्ग का उपयोग किया जाता है, यह गैर-मौजूदा फ़ाइलों से संबंधित हो सकता है, फाइल सिस्टम के अधिकार जो PHP द्वारा स्वयं के उपयोग या खुले आधार प्रतिबंधों को रोकते हैं।

इस समस्या को जल्दी से हल करने का सबसे अच्छा तरीका नीचे समस्या निवारण चेकलिस्ट का पालन करना है।

संबंधित सवाल:

संबंधित त्रुटियाँ:


44

पार्स त्रुटि: सिंटैक्स त्रुटि, अप्रत्याशित T_PAAMAYIM_NEKUDOTAYIM

स्कोप रिज़ॉल्यूशन ऑपरेटर को हिब्रू से "पैमायम नेकुदोटयिम" भी कहा जाता है। जिसका अर्थ है "डबल कोलन"।

यह त्रुटि आमतौर पर तब होती है जब आप अनजाने में डालते हैं :: में अपने कोड में ।

संबंधित सवाल:

प्रलेखन:


इस त्रुटि को ट्रिगर करने का सबसे आसान तरीका चल रहा है a()::b;या $a=::;
इस्माइल मिगुएल

43

सूचना: अपरिभाषित स्थिर XXX का उपयोग - 'XXX' मान लिया गया

या, PHP 7.2 या बाद में:

चेतावनी: अपरिभाषित स्थिर XXX का उपयोग - 'XXX' (यह PHP के भविष्य के संस्करण में एक त्रुटि फेंक देगा)

यह नोटिस तब होता है जब कोड में एक टोकन का उपयोग किया जाता है और एक स्थिर प्रतीत होता है, लेकिन उस नाम से एक स्थिरांक परिभाषित नहीं होता है।

इस नोटिस के सबसे सामान्य कारणों में से एक एक साहचर्य सरणी कुंजी के रूप में उपयोग किए जाने वाले स्ट्रिंग को उद्धृत करने में विफलता है।

उदाहरण के लिए:

// Wrong
echo $array[key];

// Right
echo $array['key'];

एक अन्य सामान्य कारण $एक चर नाम के सामने एक लापता (डॉलर) चिन्ह है:

// Wrong
echo varName;

// Right
echo $varName;

या शायद आपने कुछ अन्य स्थिरांक या कीवर्ड को छोड़ दिया है:

// Wrong
$foo = fasle;

// Right
$foo = false;

यह एक संकेत भी हो सकता है कि जब आप उस लाइब्रेरी द्वारा परिभाषित निरंतर उपयोग करने की कोशिश करते हैं, तो एक आवश्यक PHP एक्सटेंशन या लाइब्रेरी गायब है।

संबंधित सवाल:


2
मैं कहूंगा कि सबसे आम कारण एक चर के सामने $ भूल रहा है, न कि सरणियाँ।
ओवरव्यू

42

घातक त्रुटि: वर्ग को पुनर्वितरित नहीं कर सकता [वर्ग का नाम]

घातक त्रुटि: रिक्लेयर नहीं कर सकता [फ़ंक्शन का नाम]

इसका मतलब है आप या तो दो बार एक ही समारोह / वर्ग के नाम का उपयोग कर रहे हैं और उनमें से एक का नाम बदलने की जरूरत है, या यह है, क्योंकि आप का इस्तेमाल किया है requireया includeजहां का उपयोग करना चाहिए require_onceया include_once

जब PHP में एक वर्ग या फ़ंक्शन घोषित किया जाता है, तो यह अपरिवर्तनीय होता है, और बाद में एक नए मूल्य के साथ घोषित नहीं किया जा सकता है।

निम्नलिखित कोड पर विचार करें:

class.php

<?php

class MyClass
{
    public function doSomething()
    {
        // do stuff here
    }
}

index.php

<?php

function do_stuff()
{
   require 'class.php';
   $obj = new MyClass;
   $obj->doSomething();
}

do_stuff();
do_stuff();

दूसरी कॉल do_stuff()उपरोक्त त्रुटि उत्पन्न करेगी। परिवर्तित करने से requireकरने के लिए require_once, हम निश्चित हो सकते हैं फ़ाइल है कि की परिभाषा में शामिल है MyClassकेवल एक बार लोड किया जाएगा, और त्रुटि से परहेज किया जाना होगा।


3
क्या यह ऑटोलॉडिंग का उपयोग करने के लायक है, और पीएसआर -4 या अब भी पदावनत किए गए पीएसआर -० जैसे मानक आपको आवश्यकता से अधिक बचत करने से बचाते हैं / खुद को शामिल करना / (कुछ विचित्र मामलों को बार करना)।
डैनियल

39

सूचना: अपरिभाषित चर

तब होता है जब आप एक चर का उपयोग करने की कोशिश करते हैं जो पहले परिभाषित नहीं था।

एक विशिष्ट उदाहरण होगा

foreach ($items as $item) {
    // do something with item
    $counter++;
}

यदि आपने $counterपहले परिभाषित नहीं किया है , तो ऊपर दिया गया कोड नोटिस को ट्रिगर करेगा।

इसका उपयोग करने से पहले चर को सेट करने का सही तरीका होगा, भले ही यह एक खाली स्ट्रिंग की तरह हो

$counter = 0;
foreach ($items as $item) {
    // do something with item
    $counter++;
}

सूचना: अपरिभाषित संपत्ति

इस त्रुटि का अर्थ बहुत ही समान है, लेकिन किसी वस्तु की संपत्ति को संदर्भित करता है। उपरोक्त उदाहरण का उपयोग करते हुए, यह कोड त्रुटि को ट्रिगर करेगा क्योंकि counterसंपत्ति सेट नहीं की गई है।

$obj = new stdclass;
$obj->property = 2342;
foreach ($items as $item) {
    // do something with item
    $obj->counter++;
}

संबंधित सवाल:


35

पार्स त्रुटि: सिंटैक्स त्रुटि, अप्रत्याशित T_VARIABLE

संभव परिदृश्य

मुझे यह पता नहीं लग सकता है कि मेरा कोड कहां गलत हो गया है। यहाँ मेरी पूरी त्रुटि है:

पार्स त्रुटि: सिंटैक्स त्रुटि, लाइन x पर अनपेक्षित T_VARIABLE

मैं क्या कोशिश कर रहा हूं

$sql = 'SELECT * FROM dealer WHERE id="'$id.'"';

उत्तर

पार्स त्रुटि: आपके प्रोग्राम के सिंटैक्स के साथ एक समस्या, जैसे कि स्टेटमेंट के अंत में अर्धविराम को छोड़ना या ऊपर के मामले की तरह, .ऑपरेटर को याद नहीं करना । जब यह एक पार्स त्रुटि का सामना करता है तो दुभाषिया आपका कार्यक्रम चलाना बंद कर देता है।

सरल शब्दों में यह एक वाक्यविन्यास त्रुटि है, जिसका अर्थ है कि आपके कोड में कुछ है जो इसे सही ढंग से पार्स होने से रोक रहा है और इसलिए चल रहा है।

आपको क्या करना चाहिए ध्यान से लाइनों पर जाँच करें जहाँ त्रुटि किसी भी साधारण गलतियों के लिए है।

उस त्रुटि संदेश का मतलब है कि फ़ाइल के लाइन एक्स में, PHP दुभाषिया एक खुले कोष्ठक को देखने की उम्मीद कर रहा था, लेकिन इसके बजाय, इसे कुछ नामक सामना करना पड़ा T_VARIABLE। उस T_VARIABLEचीज को a कहा जाता है token। यह प्रोग्राम्स के विभिन्न मूलभूत भागों को व्यक्त करने का PHP दुभाषिया तरीका है। जब दुभाषिया एक कार्यक्रम में पढ़ता है, तो यह अनुवाद करता है कि आपने टोकन की सूची में क्या लिखा है। जहाँ भी आप अपने कार्यक्रम में एक चर डालते हैं, T_VARIABLEदुभाषिया की सूची में एक टोकन होता है ।

अच्छा पढ़ा: पार्सर टोकन की सूची

इसलिए सुनिश्चित करें कि आप कम से कम E_PARSEअपने में सक्षम हैंphp.ini । उत्पादन लिपियों में पार्स त्रुटियों का अस्तित्व नहीं होना चाहिए।

मैंने हमेशा निम्न कथन जोड़ने की सिफारिश की, जबकि कोडिंग:

error_reporting(E_ALL);

PHP त्रुटि रिपोर्टिंग

इसके अलावा, एक आईडीई का उपयोग करने का एक अच्छा विचार है जो आपको टाइप करते समय पार्स त्रुटियों को बताएगा। आप उपयोग कर सकते हैं:

  1. NetBeans (सुंदरता का एक अच्छा टुकड़ा, मुफ्त सॉफ्टवेयर) (मेरी राय में सबसे अच्छा)
  2. PhpStorm (चाचा गॉर्डन इसे प्यार करते हैं: पी, भुगतान योजना, मालिकाना और मुफ्त सॉफ्टवेयर शामिल हैं)
  3. ग्रहण (सौंदर्य और जानवर, मुफ्त सॉफ्टवेयर)

संबंधित सवाल:


34

सूचना: Uninitialized स्ट्रिंग ऑफ़सेट: *

जैसा कि नाम से संकेत मिलता है, इस प्रकार की त्रुटि तब होती है, जब आप किसी गैर-मौजूदा कुंजी के साथ किसी सरणी से अधिक मान प्राप्त करने की कोशिश कर रहे होते हैं या एक मान पाते हैं।

आप पर विचार करें, हर पत्र को दिखाने की कोशिश कर रहे हैं $string

$string = 'ABCD'; 
for ($i=0, $len = strlen($string); $i <= $len; $i++){
    echo "$string[$i] \n"; 
}

उपरोक्त उदाहरण उत्पन्न करेगा ( ऑनलाइन डेमो ):

A
B
C
D
Notice: Uninitialized string offset: 4 in XXX on line X

और, जैसे ही स्क्रिप्ट की गूंज खत्म Dहो जाती है, आपको त्रुटि मिल जाएगी, क्योंकि for()लूप के अंदर , आपने PHP को बताया है कि आपको पहली से पांचवीं स्ट्रिंग कैरेक्टर को दिखाना है, जिसमें से 'ABCD'मौजूद है, लेकिन जब से लूप की गिनती 0और गूँज शुरू होती है। Dजब तक यह पहुंचता है 4, तब तक यह एक ऑफसेट त्रुटि को फेंक देगा।

समान त्रुटियां:


32

सूचना: गैर-ऑब्जेक्ट त्रुटि की संपत्ति प्राप्त करने की कोशिश करना

तब होता है जब आप किसी वस्तु की संपत्ति तक पहुँचने की कोशिश करते हैं जबकि कोई वस्तु नहीं होती है।

एक गैर-वस्तु नोटिस के लिए एक विशिष्ट उदाहरण होगा

$users = json_decode('[{"name": "hakre"}]');
echo $users->name; # Notice: Trying to get property of non-object

इस मामले में, $usersएक सरणी है (इसलिए एक वस्तु नहीं) और इसमें कोई गुण नहीं है।

यह एक गैर-मौजूदा सूचकांक या किसी सरणी की कुंजी तक पहुँचने के समान है (देखें नोटिस: अपरिभाषित सूचकांक )।

यह उदाहरण बहुत सरल है। अक्सर ऐसी सूचना अनियंत्रित रिटर्न वैल्यू का संकेत देती है, जैसे जब NULLकोई ऑब्जेक्ट वापस नहीं आता है या एक अप्रत्याशित गैर-ऑब्जेक्ट वैल्यू (जैसे Xpath रिजल्ट में, JSON स्ट्रक्चर अनपेक्षित फॉर्मेट के साथ, एक्सएमएल अनपेक्षित फॉर्मेट आदि के साथ) तो एक लाइब्रेरी लौटाता है । लेकिन कोड ऐसी स्थिति के लिए जाँच नहीं करता है।

जैसा कि उन गैर-वस्तुओं को अक्सर आगे संसाधित किया जाता है, अक्सर गैर-ऑब्जेक्ट पर ऑब्जेक्ट विधि को कॉल करने पर अगली बार एक घातक-त्रुटि होती है (देखें: घातक त्रुटि: किसी सदस्य पर कॉल करें ... गैर-ऑब्जेक्ट पर ... ) रोकना स्क्रिप्ट।

त्रुटि स्थितियों और / या कि एक चर एक अपेक्षा से मेल खाता है के लिए जाँच करके इसे आसानी से रोका जा सकता है। यहाँ DOMXPath उदाहरण के साथ इस तरह के एक नोटिस :

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$divText = $result->item(0)->nodeValue; # Notice: Trying to get property of non-object

समस्या nodeValueपहले आइटम की संपत्ति (फ़ील्ड) तक पहुंच रही है, जबकि यह जाँच नहीं की गई है कि यह $resultसंग्रह में मौजूद है या नहीं । इसके बजाय यह उन कोड को अधिक स्पष्ट करने के लिए भुगतान करता है जिन पर कोड संचालित होता है।

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$div     = $result->item(0);
$divText = "-/-";
if (is_object($div)) {
    $divText = $div->nodeValue;
}
echo $divText;

संबंधित त्रुटियाँ:


1
json_decodeअब stdclassडिफ़ॉल्ट रूप से एक उदाहरण देता है , इसलिए उदाहरण कोड वास्तव में काम करेगा
ह्यूगो जिंक

@HugoZink: यह वास्तव में करता है (और हमेशा किया) उस उदाहरण के लिए एक सरणी लौटाते हैं : 3v4l.org/SUDe0 - क्या आप कृपया अपने लेखन के लिए संदर्भ प्रदान कर सकते हैं कि " json_decodeअब stdclassडिफ़ॉल्ट रूप से एक उदाहरण देता है " ? मुझे नहीं लगता कि चैंज में।
हकरे

Json_decode पर PHP मैनुअल के पेज के अनुसार , डिफ़ॉल्ट रूप से, assocपैरामीटर गलत पर सेट है। यह पैरामीटर तय करता है कि फ़ंक्शन stdclassसाहचर्य सरणी के बजाय वापस आता है या नहीं ।
ह्यूगो जिंक

json_decode('[{"name": "hakre"}]', true)एक सरणी लौटाएगा, अन्यथा एक stdclassवस्तु
झंवर

29

चेतावनी: प्रभाव में open_basedir प्रतिबंध

यह चेतावनी विभिन्न कार्यों के साथ दिखाई दे सकती है जो फ़ाइल और निर्देशिका पहुंच से संबंधित हैं। यह कॉन्फ़िगरेशन समस्या के बारे में चेतावनी देता है।

जब यह प्रकट होता है, तो इसका मतलब है कि कुछ फ़ाइलों तक पहुंच निषिद्ध है।

चेतावनी स्वयं कुछ भी नहीं तोड़ती है, लेकिन अगर फ़ाइल-एक्सेस को रोका जाता है तो अधिकतर स्क्रिप्ट ठीक से काम नहीं करती है।

PHP कॉन्फ़िगरेशन को बदलने के लिए सामान्य रूप से फिक्स है , संबंधित सेटिंग को कहा जाता हैopen_basedir

कभी-कभी गलत फ़ाइल या निर्देशिका नामों का उपयोग किया जाता है, तो फ़िक्स सही लोगों का उपयोग करने के लिए होता है।

संबंधित सवाल:


1
यह एक साझा होस्ट पर सबसे अधिक बार होता है, लोग आमतौर पर खुद को निर्देशिकाओं से बाहर नहीं
निकालते हैं

28

पार्स त्रुटि: वाक्यविन्यास त्रुटि, अप्रत्याशित '['

यह त्रुटि दो वैरिएंट में आती है:

भिन्नता १

$arr = [1, 2, 3];

यह सरणी इनिशियलाइज़र सिंटैक्स केवल PHP 5.4 में पेश किया गया था; इससे पहले के संस्करणों पर एक पार्सर त्रुटि को बढ़ाएगा। यदि संभव हो, तो अपनी स्थापना को अपग्रेड करें या पुराने सिंटैक्स का उपयोग करें:

$arr = array(1, 2, 3);

इस उदाहरण को मैनुअल से भी देखें ।

भिन्नता २

$suffix = explode(',', 'foo,bar')[1];

PHP 5.4 में एरे डीफ्रेंसिंग फ़ंक्शन परिणाम भी पेश किए गए थे। यदि यह अपग्रेड करना संभव नहीं है, तो आपको (अस्थायी) चर का उपयोग करने की आवश्यकता है:

$parts = explode(',', 'foo,bar');
$suffix = $parts[1];

इस उदाहरण को मैनुअल से भी देखें ।


23

चेतावनी: [फ़ंक्शन] पैरामीटर 1 को संसाधन, बूलियन दिए जाने की उम्मीद करता है

( चेतावनी का एक और अधिक सामान्य रूपांतर : mysql_fetch_array (पैरामीटर 1, संसाधन, बीनियन होने की उम्मीद करता है )

संसाधन PHP में एक प्रकार हैं (जैसे तार, पूर्णांक या ऑब्जेक्ट)। एक संसाधन एक अपारदर्शी बूँद है जिसका कोई अंतर्निहित अर्थ नहीं है। PHP फ़ंक्शंस या एक्सटेंशन के एक निश्चित सेट से एक संसाधन विशिष्ट और परिभाषित होता है। उदाहरण के लिए, मैसकल एक्सटेंशन दो संसाधन प्रकारों को परिभाषित करता है :

MySQL मॉड्यूल में दो संसाधन प्रकारों का उपयोग किया जाता है। पहला एक डेटाबेस कनेक्शन के लिए लिंक पहचानकर्ता है, दूसरा एक संसाधन जो एक क्वेरी का परिणाम रखता है।

CURL एक्सटेंशन एक और दो संसाधन प्रकारों को परिभाषित करता है :

... एक curl संभाल और एक curl बहु संभाल।

जब var_dumpएड, मान इस तरह दिखते हैं:

$resource = curl_init();
var_dump($resource);

resource(1) of type (curl)

यह सभी सबसे अधिक संसाधन हैं, (1)एक निश्चित प्रकार का एक संख्यात्मक पहचानकर्ता ( )(curl) ) का )।

आप इन संसाधनों को इधर-उधर ले जाते हैं और उन्हें विभिन्न कार्यों के लिए पास कर देते हैं, जिसके लिए ऐसे संसाधन का अर्थ है। आमतौर पर ये फ़ंक्शन पृष्ठभूमि में कुछ डेटा आवंटित करते हैं और एक संसाधन केवल एक संदर्भ है जो वे आंतरिक रूप से इस डेटा का ट्रैक रखने के लिए उपयोग करते हैं।


" ... उम्मीद करता है कि पैरामीटर 1 संसाधन है, बूलियन दिया " त्रुटि आमतौर पर एक अनियंत्रित ऑपरेशन का परिणाम है जो संसाधन बनाने के लिए माना जाता था, लेकिन falseइसके बजाय वापस आ गया। उदाहरण के लिए, fopenफ़ंक्शन में यह विवरण है:

वापसी मान

सफलता पर, या FALSEत्रुटि पर एक फ़ाइल पॉइंटर संसाधन लौटाता है ।

इस कोड में तो, $fpया तो एक हो जाएगा resource(x) of type (stream)या false:

$fp = fopen(...);

यदि आप जांच नहीं करते हैं कि fopenऑपरेशन सफल हुआ या विफल रहा है और इसलिए क्या $fpएक वैध संसाधन है या किसी अन्य फ़ंक्शन से falseगुजरता $fpहै जो एक संसाधन की अपेक्षा करता है, तो आपको उपरोक्त त्रुटि मिल सकती है:

$fp   = fopen(...);
$data = fread($fp, 1024);

Warning: fread() expects parameter 1 to be resource, boolean given

आपको हमेशा उन कार्यों के रिटर्न मूल्य की जांच करने की आवश्यकता है जो एक संसाधन आवंटित करने की कोशिश कर रहे हैं और विफल हो सकते हैं :

$fp = fopen(...);

if (!$fp) {
    trigger_error('Failed to allocate resource');
    exit;
}

$data = fread($fp, 1024);

संबंधित त्रुटियाँ:


22

चेतावनी: अवैध स्ट्रिंग ऑफसेट 'XXX'

यह तब होता है जब आप एक वर्ग तत्व को वर्ग ब्रैकेट सिंटैक्स के साथ एक्सेस करने का प्रयास करते हैं, लेकिन आप इसे एक स्ट्रिंग पर कर रहे हैं, और एक सरणी पर नहीं, इसलिए ऑपरेशन स्पष्ट रूप से समझ में नहीं आता है

उदाहरण:

$var = "test";
echo $var["a_key"];

यदि आपको लगता है कि चर एक सरणी होना चाहिए, तो देखें कि यह कहाँ से आता है और समस्या को ठीक करता है।


20

कोड नहीं चलता / क्या दिखता है जैसे मेरे PHP कोड के कुछ भाग आउटपुट हैं

यदि आप अपने PHP कोड से कोई परिणाम नहीं देखते हैं और / या आप वेबपेज में अपने शाब्दिक PHP स्रोत कोड आउटपुट के कुछ हिस्सों को देख रहे हैं, तो आप यह सुनिश्चित कर सकते हैं कि आपका PHP वास्तव में निष्पादित नहीं हो रहा है। यदि आप अपने ब्राउज़र में View Source का उपयोग करते हैं, तो आप संभवतः पूरे PHP स्रोत कोड फ़ाइल को देख रहे हैं। चूंकि PHP कोड <?php ?>टैग में अंतर्निहित है , इसलिए ब्राउज़र HTML टैग के रूप में उन लोगों की व्याख्या करने की कोशिश करेगा और परिणाम कुछ उलझन में लग सकता है।

वास्तव में अपनी PHP स्क्रिप्ट चलाने के लिए, आपको आवश्यकता है:

  • एक वेब सर्वर जो आपकी स्क्रिप्ट निष्पादित करता है
  • फ़ाइल एक्सटेंशन को .php पर सेट करने के लिए, अन्यथा वेब सर्वर इसे इस तरह से व्याख्या नहीं करेगा *
  • वेब सर्वर के माध्यम से अपने .php फ़ाइल तक पहुँचने के लिए

* जब तक आप इसे पुनः कॉन्फ़िगर नहीं करते, तब तक सब कुछ कॉन्फ़िगर किया जा सकता है।

यह अंतिम विशेष रूप से महत्वपूर्ण है। फ़ाइल को डबल क्लिक करने से संभवतः आपके ब्राउज़र में इसे एक पते का उपयोग करके खोल दिया जाएगा जैसे:

file://C:/path/to/my/file.php

यह आपके द्वारा चलाए जा रहे किसी भी वेब सर्वर को पूरी तरह से दरकिनार कर देता है और फ़ाइल की व्याख्या नहीं हो रही है। आपको अपने वेब सर्वर पर फ़ाइल के URL पर जाने की आवश्यकता है, जैसे कि कुछ:

http://localhost/my/file.php

आप यह भी जांचना चाहेंगे कि क्या आप <?इसके बजाय छोटे खुले टैग का उपयोग कर रहे हैं<?php और आपके PHP कॉन्फ़िगरेशन ने छोटे खुले टैग बंद कर दिए हैं।

यह भी देखें कि PHP कोड को निष्पादित नहीं किया जा रहा है, इसके बजाय पृष्ठ पर कोड दिखाता है


18

चेतावनी: mysql_connect (): उपयोगकर्ता के नाम '@' होस्ट के लिए पहुँच अस्वीकृत

यह चेतावनी तब दिखाई देती है जब आप MySQL / MariaDB सर्वर से अमान्य या गुम क्रेडेंशियल (उपयोगकर्ता नाम / पासवर्ड) के साथ जुड़ते हैं। तो यह आमतौर पर एक कोड समस्या नहीं है, लेकिन एक सर्वर कॉन्फ़िगरेशन समस्या है।

  • mysql_connect("localhost", "user", "pw")उदाहरण के लिए मैनुअल पेज देखें ।

  • जाँच करें कि आप वास्तव में एक प्रयोग किया जाता है $usernameऔर $password

    • यह असामान्य है कि आप बिना किसी पासवर्ड का उपयोग किए पहुंच प्राप्त करते हैं - जो कि चेतावनी के समय हुआ है (using password: NO)
    • केवल स्थानीय परीक्षण सर्वर आमतौर पर उपयोगकर्ता नाम root, कोई पासवर्ड और testडेटाबेस नाम से जुड़ने की अनुमति देता है ।

    • यदि आप कमांड लाइन क्लाइंट का उपयोग करके वास्तव में सही हैं तो आप परीक्षण कर सकते हैं :
      mysql --user="username" --password="password" testdb

    • उपयोगकर्ता नाम और पासवर्ड केस-संवेदी हैं और व्हाट्सएप को अनदेखा नहीं किया गया है। यदि आपके पासवर्ड में मेटा वर्ण हैं $, जैसे उन्हें छोड़ें, या एकल उद्धरणों में पासवर्ड डालें ।

    • अधिकांश साझा होस्टिंग प्रदाता यूनिक्स उपयोगकर्ता खाते (कभी-कभी सिर्फ उपसर्ग या अतिरिक्त संख्यात्मक प्रत्यय) के संबंध में mysql खातों को पूर्वनिर्धारित करते हैं। एक पैटर्न या प्रलेखन के लिए डॉक्स देखें, और CPanel या पासवर्ड सेट करने के लिए जो भी इंटरफ़ेस है।

    • कमांड लाइन का उपयोग करके उपयोगकर्ता खातों को जोड़ने पर MySQL मैनुअल देखें । व्यवस्थापक उपयोगकर्ता के रूप में कनेक्ट होने पर आप एक क्वेरी जारी कर सकते हैं जैसे:
      CREATE USER 'username'@'localhost' IDENTIFIED BY 'newpassword';

    • या का उपयोग Adminer या कार्यक्षेत्र बनाने के लिए, चेक या सही खाते के विवरण या किसी अन्य ग्राफिकल टूल।

    • यदि आप अपने क्रेडेंशियल्स को ठीक नहीं कर सकते हैं, तो इंटरनेट से "कृपया मदद" करने के लिए कहने से कोई प्रभाव नहीं पड़ेगा। केवल आप और आपके होस्टिंग प्रदाता के पास चीजों के निदान और उन्हें ठीक करने के लिए अनुमति और पर्याप्त पहुंच है।

  • सत्यापित करें कि आप अपने प्रदाता द्वारा दिए गए होस्ट नाम का उपयोग करके डेटाबेस सर्वर तक पहुंच सकते हैं :
    ping dbserver.hoster.example.net

    • इसे सीधे अपने वेबसर्वर पर SSH कंसोल से जांचें। अपने साझा होस्टिंग सर्वर के लिए अपने स्थानीय विकास ग्राहक से परीक्षण शायद ही सार्थक है।

    • अक्सर आप बस सर्वर का नाम चाहते हैं "localhost", जो आम तौर पर उपलब्ध होने पर एक स्थानीय सॉकेट नाम का उपयोग करता है। अन्य शर्तें जिन्हें आप कमबैक के "127.0.0.1"रूप में आज़मा सकते हैं ।

    • क्या आपके MySQL / MariaDB सर्वर को एक अलग पोर्ट पर सुनना चाहिए, तब उपयोग करें "servername:3306"

    • यदि वह विफल रहता है, तो शायद एक फ़ायरवॉल समस्या है। (ऑफ-टॉपिक, प्रोग्रामिंग सवाल नहीं। कोई दूरस्थ अनुमान-मदद संभव नहीं।)

  • जैसे जैसे स्थिरांक का उपयोग करते समय DB_USERया DB_PASSWORD, जांचें कि वे वास्तव में परिभाषित हैं

    • यदि आपको ए "Warning: Access defined for 'DB_USER'@'host'"और ए मिलता है "Notice: use of undefined constant 'DB_PASS'", तो यह आपकी समस्या है।

    • सत्यापित करें कि आपका उदाहरण xy/db-config.phpवास्तव में शामिल था और क्या था।

  • GRANTअनुमतियों को सही ढंग से सेट करने के लिए जाँच करें ।

    • यह username+ passwordजोड़ी रखने के लिए पर्याप्त नहीं है ।

    • प्रत्येक MySQL / MariaDB खाते में अनुमतियों का संलग्न सेट हो सकता है।

    • वे उन डेटाबेस को प्रतिबंधित कर सकते हैं जिन्हें आप से कनेक्ट करने की अनुमति है, जिस क्लाइंट / सर्वर से कनेक्शन की उत्पत्ति हो सकती है और कौन से प्रश्नों की अनुमति है।

    • "एक्सेस अस्वीकृत" चेतावनी इस प्रकार mysql_queryकॉल के लिए भी दिखाई दे सकती है , यदि आपके पास SELECTकिसी विशिष्ट तालिका, या INSERT/ UPDATEऔर अधिक सामान्यतः DELETEकुछ भी करने की अनुमति नहीं है ।

    • जब आप क्वेरी के साथ व्यवस्थापक खाते का उपयोग करके कमांड लाइन क्लाइंट से जुड़े होते हैं तो आप खाता अनुमतियों को अनुकूलित कर सकते हैं:
      GRANT ALL ON yourdb.* TO 'username'@'localhost';

  • यदि चेतावनी पहले दिखाई देती है Warning: mysql_query(): Access denied for user ''@'localhost'तो आपके पास एक php.ini-preconfigured खाता / पासवर्ड जोड़ी हो सकती है

    • उस की जाँच करें mysql.default_user=और mysql.default_password=सार्थक मूल्य हैं।

    • अक्सर यह एक प्रदाता-विन्यास है। इसलिए बेमेल के लिए उनके समर्थन से संपर्क करें।

  • अपने साझा होस्टिंग प्रदाता का दस्तावेज़ीकरण ढूंढें:

  • ध्यान दें कि आपने उपलब्ध कनेक्शन पूल को समाप्त कर दिया होगा । आपको बहुत अधिक समवर्ती कनेक्शनों के लिए पहुँच अस्वीकृत चेतावनियाँ मिलेंगी। (आपको सेटअप की जांच करनी होगी। यह एक ऑफ-टॉपिक सर्वर कॉन्फ़िगरेशन समस्या है, प्रोग्रामिंग प्रश्न नहीं है।)

  • आपका libmysql क्लाइंट संस्करण डेटाबेस सर्वर के साथ संगत नहीं हो सकता है। आम तौर पर MySQL और MariaDB सर्वर को ड्राइवर में संकलित PHPs के साथ पहुँचा जा सकता है। यदि आपके पास एक कस्टम सेटअप है, या एक पुराना PHP संस्करण है, और एक बहुत ही नया डेटाबेस सर्वर है, या महत्वपूर्ण रूप से पुराना है - तो संस्करण बेमेल कनेक्शन को रोक सकता है। (नहीं, आपको अपनी जांच करनी होगी। कोई भी आपके सेटअप का अनुमान नहीं लगा सकता है)।

अधिक संदर्भ:

Btw, आप शायद mysql_*कार्यों का उपयोग नहीं करना चाहते हैं । नवागंतुक अक्सर माइस्क्ली में प्रवास करते हैं , जो हालांकि थकाऊ है। इसके बजाय पीडीओ और तैयार बयानों पर पढ़ें ।
$db = new PDO("mysql:host=localhost;dbname=testdb", "username", "password");


2
mysql php-ini सेटिंग्स के माध्यम से ऑटो-कनेक्ट करने की अनुमति देता है, फिर एक ही त्रुटि संदेश अलग-अलग कमांड के साथ दिया जाता है, जैसे " पूर्व चेतावनी: mysql_query (): उपयोगकर्ता के लिए प्रवेश निषेध '' @ 'लोकलहोस्ट' (पासवर्ड का उपयोग करके: NO)। .. ” - बस ध्यान दे रहा है।
हकर्रे

हा, पूरी तरह से उस के बारे में भूल गया! (शायद PHP3 या तो .. के साथ आखिरी बार इस्तेमाल किया गया था)
mario

18

सूचना: स्ट्रिंग रूपांतरण के लिए सरणी

यह केवल तब होता है जब आप किसी सरणी को स्ट्रिंग के रूप में मानने का प्रयास करते हैं:

$arr = array('foo', 'bar');

echo $arr;  // Notice: Array to string conversion
$str = 'Something, ' . $arr;  // Notice: Array to string conversion

एक सरणी को केवल echoएक स्ट्रिंग के साथ घ या संक्षिप्त नहीं किया जा सकता है , क्योंकि परिणाम अच्छी तरह से परिभाषित नहीं है। PHP सरणी के स्थान पर स्ट्रिंग "ऐरे" का उपयोग करेगी, और नोटिस को ट्रिगर करके यह बताएगी कि शायद ऐसा नहीं था कि आप क्या चाहते थे और आपको यहां अपना कोड जांचना चाहिए। आप शायद इसके बजाय ऐसा कुछ चाहते हैं:

echo $arr[0];  // displays foo
$str = 'Something ' . join(', ', $arr); //displays Something, foo, bar

या सरणी को लूप करें:

foreach($arr as $key => $value) {
    echo "array $key = $value";
    // displays first: array 0 = foo
    // displays next:  array 1 = bar
}

यदि यह सूचना कहीं दिखाई देती है तो आप इसकी उम्मीद नहीं करते हैं, इसका मतलब है कि एक चर जो आपने सोचा था कि एक स्ट्रिंग है वास्तव में एक सरणी है। इसका मतलब है कि आपके पास अपने कोड में एक बग है जो इस चर को आपके द्वारा अपेक्षित स्ट्रिंग के बजाय एक सरणी बनाता है।


12

चेतावनी: शून्य से विभाजन

चेतावनी संदेश 'डिवीजन बाय जीरो' नए PHP डेवलपर्स के बीच सबसे अधिक पूछे जाने वाले प्रश्नों में से एक है। यह त्रुटि अपवाद का कारण नहीं बनेगी, इसलिए, कुछ डेवलपर्स अभिव्यक्ति के पहले कभी-कभी त्रुटि दमन ऑपरेटर @ को जोड़कर चेतावनी को दबा देंगे। उदाहरण के लिए:

$value = @(2 / 0);

लेकिन, किसी भी चेतावनी के साथ, सबसे अच्छा तरीका यह होगा कि चेतावनी के कारण को ट्रैक किया जाए और इसे हल किया जाए। चेतावनी का कारण किसी भी उदाहरण से आने वाला है जहां आप 0 से विभाजित करने का प्रयास करते हैं, एक चर 0 के बराबर है, या एक चर जिसे असाइन नहीं किया गया है (क्योंकि NULL == 0) क्योंकि परिणाम 'अपरिभाषित' होगा।

इस चेतावनी को ठीक करने के लिए, आपको अपनी अभिव्यक्ति को फिर से लिखना चाहिए कि यह मानने के लिए 0 नहीं है, अगर ऐसा है, तो कुछ और करें। यदि मान शून्य है तो आपको या तो विभाजित नहीं करना चाहिए, या आपको मान को 1 में बदलना चाहिए और फिर विभाजित करना होगा ताकि विभाजन केवल अतिरिक्त चर द्वारा विभाजित होने के बराबर हो।

if ( $var1 == 0 ) { // check if var1 equals zero
    $var1 = 1; // var1 equaled zero so change var1 to equal one instead
    $var3 = ($var2 / $var1); // divide var1/var2 ie. 1/1
} else {
    $var3 = ($var2 / $var1); // if var1 does not equal zero, divide
}

संबंधित सवाल:


अगर यह 0 था, तो 1 को सेट करना त्रुटि को रोक देगा, लेकिन क्या यह वास्तव में आपके द्वारा कहे गए दमन से बेहतर है जिसका उपयोग नहीं किया जाना चाहिए (जिसे मैं सहमत हूं)? मैं सबसे अधिक बार यह सुझाव दूंगा कि कुछ अन्य संदेश या मूल्य वापस आ जाएगा।
जेम्स

इस उदाहरण के लिए, यदि $var1== 0 तो करता है तुम सिर्फ सेट कर सकते हैं $var3करने के लिए $var2। अगर ऐसा नहीं भी कर रहे हैं, तो भी दूसरे की जरूरत नहीं है क्योंकि असाइनमेंट दोनों मामलों में समान है इसलिए कोई और नहीं और बाहर असाइन करेंif
James

8

सख्त मानक: गैर-स्थैतिक विधि [<वर्ग> :: <विधि>] को सांख्यिकीय रूप से नहीं कहा जाना चाहिए

तब होता है जब आप किसी वर्ग पर एक गैर-स्थिर पद्धति को कॉल करने का प्रयास करते हैं क्योंकि यह स्थिर था, और E_STRICTआपकी error_reporting()सेटिंग में ध्वज भी होता है ।

उदाहरण :

class HTML {
   public function br() {
      echo '<br>';
   }
}

HTML::br() या $html::br()

आप वास्तव में नहीं जोड़कर इस त्रुटि से बचने कर सकते हैं E_STRICTकरने के लिए error_reporting(), जैसे

error_reporting(E_ALL & ~E_STRICT);

चूंकि PHP 5.4.0 और इसके बाद के संस्करण के लिए, [ रेफ ] E_STRICTमें शामिल है । लेकिन यह उचित नहीं है। समाधान अपने इच्छित स्थिर कार्य को वास्तविक रूप में परिभाषित करना है :E_ALLstatic

public static function br() {
  echo '<br>';
}

या फ़ंक्शन को पारंपरिक रूप से कॉल करें:

$html = new HTML();
$html->br();

संबंधित सवाल :


7

पदावनत: घुंघराले ब्रेस के साथ ऐरे और स्ट्रिंग ऑफसेट एक्सेस सिंटैक्स को हटा दिया जाता है

स्ट्रिंग ऑफसेट और सरणी तत्वों {}को PHP 7.4.0 से पहले घुंघराले ब्रेसिज़ द्वारा एक्सेस किया जा सकता है :

$string = 'abc';
echo $string{0};  // a

$array = [1, 2, 3];
echo $array{0};  // 1

यह PHP 7.4.0 के बाद से हटा दिया गया है और एक चेतावनी उत्पन्न करता है:

पदावनत: घुंघराले ब्रेस के साथ ऐरे और स्ट्रिंग ऑफसेट एक्सेस सिंटैक्स को हटा दिया जाता है

[]स्ट्रिंग ऑफ़सेट्स और एरे तत्वों तक पहुँचने के लिए आपको चौकोर कोष्ठक का उपयोग करना चाहिए :

$string = 'abc';
echo $string[0];  // a

$array = [1, 2, 3];
echo $array[0];  // 1

इस बदलाव के लिए आरएफसी एक PHP के लिए लिंक स्क्रिप्ट जो प्रयास इस यंत्रवत् ठीक करने के लिए।

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