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


193

5.4.0-3 को अपने php संस्करण को अपडेट करने के बाद मुझे एक अजीब PHP त्रुटि मिलती है।

मेरे पास यह सरणी है:

Array
(
    [host] => 127.0.0.1
    [port] => 11211
)

जब मैं इसे इस तरह एक्सेस करने की कोशिश करता हूं तो मुझे अजीब चेतावनी मिलती है

 print $memcachedConfig['host'];
 print $memcachedConfig['port'];


 Warning: Illegal string offset 'host' in ....
 Warning: Illegal string offset 'port' in ...

मैं वास्तव में सिर्फ अपने php.ini को संपादित नहीं करना चाहता और त्रुटि स्तर को फिर से सेट करता हूं।


20
जाहिर $memcachedConfigहै वह सरणी नहीं है। शोvar_dump($memcachedConfig);
ज़र्क्स 8

1
इसका मतलब है कि चाबियाँ मौजूद नहीं हैं। var_export($memcachedConfig)"प्रिंट" से ठीक पहले अपने चर की जाँच करें ।
स्कारॉल

9
अधिकांश लोग जो चूक गए, इसका मतलब यह नहीं है कि सूचकांक मौजूद नहीं है - जो "अपरिभाषित सूचकांक" संदेश का उत्पादन करता है। यह एक अलग त्रुटि है।
जुवान

5
stackoverflow.com/a/20271518/2898712 यहाँ सही उत्तर है।
वेदी

19
इस प्रश्न को देखने वाले किसी पर भी ध्यान दें: इस प्रश्न का सही उत्तर वह नहीं है जिसे चिह्नित किया गया है; सही है कजकाई का नीचे
हारून

जवाबों:


37

कृपया इस तरह से प्रयास करें .... मैंने इस कोड का परीक्षण किया है .... यह काम करता है ....

$memcachedConfig = array("host" => "127.0.0.1","port" => "11211");
print_r($memcachedConfig['host']);

1
मिल गया। आपकी सहायता के लिए धन्यवाद। var_dump ने मदद की। मैंने एक कॉन्फ़िगर फ़ाइल से सरणी लोड की, जिसमें स्ट्रेज कंटेंट इस तरह था। सरणी (2) {["होस्ट"] => स्ट्रिंग (9) "127.0.0.1" ["पोर्ट"] => स्ट्रिंग (5) "11211"} स्ट्रिंग (5) "m_prefix" PHP 5.4 अब $ xx [' मेजबान '] ने चेतावनी को सही ढंग से फेंक दिया।
थिसोनिक्स

मैं एक के बाद एक ही त्रुटि थी include_once($file);। सरणी को सही तरीके से बनाया गया है (डिबग जानकारी यह दिखाता है), हालांकि इसे PHP अवैध स्ट्रिंगऑफ़सेट चेतावनी संदेश के बिना उपयोग करने से पहले मैन्युअल रूप से किसी अन्य सरणी में कॉपी किया जाना था।
फ्रांज होल्जिंगर

$ sStartDate = date ("Ymd", strtotime ($ फ़ीड ['DTSTART'] ['मूल्य'])); $ sEndDate = दिनांक ("Ymd", strtotime ($ फ़ीड ['DTEND'] ['मूल्य'])); यहाँ एक ही त्रुटि को कैसे ठीक करें चेतावनी: अवैध स्ट्रिंग ऑफसेट
जे। शाबू

302

Illegal string offset 'whatever' in...आम तौर पर त्रुटि का अर्थ है: आप एक स्ट्रिंग को पूर्ण सरणी के रूप में उपयोग करने का प्रयास कर रहे हैं।

यह वास्तव में संभव है क्योंकि स्ट्रिंग्स को php में एकल वर्णों के सरणियों के रूप में माना जाता है। तो आप सोच रहे हैं कि $ var एक कुंजी के साथ एक सरणी है, लेकिन यह मानक संख्यात्मक कुंजियों के साथ एक स्ट्रिंग है , उदाहरण के लिए:

$fruit_counts = array('apples'=>2, 'oranges'=>5, 'pears'=>0);
echo $fruit_counts['oranges']; // echoes 5
$fruit_counts = "an unexpected string assignment";
echo $fruit_counts['oranges']; // causes illegal string offset error

आप इसे यहां देख सकते हैं: http://ideone.com/fMhmkR

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


8
मुझे यकीन है कि यह दिखाया जा सकता है यही कारण था कि मूल समस्या हुई थी। अधिकांश टिप्पणियां गलत मानती हैं कि "अपरिभाषित सूचकांक" त्रुटि थी।
अनुदान

1
थोड़ी देर के पाश में इस समस्या में भाग गया। धन्यवाद
डेविड ओकवि

कभी-कभी एक बहुआयामी सरणी के गलत नोड को पकड़ने का प्रयास करते समय यह त्रुटि हो सकती है, अर्थात "बहुत गहरा" जा रहा है, आपको इसके बजाय चयन के माता-पिता की आवश्यकता है
Zoltar

यह सही है, मैंने fetchAll(PDO::FETCH_ASSOC)इसके बजाय इस्तेमाल किया fetch(PDO::FETCH_ASSOC)और पूरी तरह से काम किया।
MNN

$variablename = [];मेरे कोड के एक अन्य भाग पर, $variablename = "test";जिस पर त्रुटि संदेश गया था, उसी समय मैं दो बार उसी का उपयोग कर रहा हूं ।
काई नोएक

77

टी एल; डॉ

यदि आप stringएक सरणी के रूप में इसे एक्सेस करने का प्रयास कर रहे हैं, तो यह एक कुंजी है stringstringयह समझ में नहीं आएगा। कोड में हम समस्या देख सकते हैं:

"hello"["hello"];
// PHP Warning:  Illegal string offset 'hello' in php shell code on line 1

"hello"[0];
// No errors.

array("hello" => "val")["hello"];
// No errors. This is *probably* what you wanted.

गहराई में

आइए देखते हैं वह त्रुटि:

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

यह क्या कहता है? यह कहता है कि हम स्ट्रिंग 'port'को स्ट्रिंग के लिए ऑफसेट के रूप में उपयोग करने का प्रयास कर रहे हैं । ऐशे ही:

$a_string = "string";

// This is ok:
echo $a_string[0]; // s
echo $a_string[1]; // t
echo $a_string[2]; // r
// ...

// !! Not good:
echo $a_string['port'];
// !! Warning: Illegal string offset 'port' in ...

इसका क्या कारण है?

किसी कारण के लिए आप एक की उम्मीद है array, लेकिन आप एक है string। सिर्फ एक मिक्स-अप। शायद आपका चर बदल गया था, शायद यह कभी नहीं था array, यह वास्तव में महत्वपूर्ण नहीं है।

क्या किया जा सकता है?

अगर हमें पता है कि हमारे पास एक होना चाहिए array, तो हमें यह निर्धारित करने के लिए कुछ बुनियादी डिबगिंग करनी चाहिए कि हमारे पास ए क्यों नहीं है array। अगर हमें नहीं पता कि हमारे पास एक है arrayया नहीं string, तो चीजें थोड़ी पेचीदा हो जाएंगी।

हम जो कर सकते हैं वह यह सुनिश्चित करने के लिए सभी प्रकार की जाँच है कि हमारे पास नोटिस और चेतावनियाँ नहीं हैं is_arrayऔर issetया जैसी चीज़ों के साथ array_key_exists:

$a_string = "string";
$an_array = array('port' => 'the_port');

if (is_array($a_string) && isset($a_string['port'])) {
    // No problem, we'll never get here.
    echo $a_string['port'];
}

if (is_array($an_array) && isset($an_array['port'])) {
    // Ok!
    echo $an_array['port']; // the_port
}

if (is_array($an_array) && isset($an_array['unset_key'])) {
    // No problem again, we won't enter.
    echo $an_array['unset_key'];
}


// Similar, but with array_key_exists
if (is_array($an_array) && array_key_exists('port', $an_array)) {
    // Ok!
    echo $an_array['port']; // the_port
}

के बीच कुछ सूक्ष्म अंतर हैं issetऔर array_key_exists। उदाहरण के लिए, यदि मान $array['key']है null, तो issetरिटर्न falsearray_key_existsबस जाँचेंगे कि, ठीक है, कुंजी मौजूद है


13

यहाँ बहुत सारे शानदार उत्तर हैं - लेकिन मैंने पाया कि मेरा मुद्दा थोड़ा अधिक सरल था।

मैं निम्नलिखित कमांड चलाने की कोशिश कर रहा था:

$x['name']   = $j['name'];

और मुझे यह illegal stringत्रुटि मिल रही थी $x['name']क्योंकि मैंने पहले सरणी को परिभाषित नहीं किया था। इसलिए मैंने चीजों को असाइन करने की कोशिश करने से पहले निम्नलिखित पंक्ति को कोड में डाल दिया $x[]:

$x = array();

और यह काम किया।


1
मुझे लगता है कि इसका जवाब होना चाहिए। यह 5.4 (और 7 से पहले) और 7.
sonnb

7

प्रश्न के लिए थोड़ा देर से, लेकिन अन्य जो खोज रहे हैं: मुझे एक गलत मान (प्रकार) के साथ प्रारंभ करके यह त्रुटि मिली:

$varName = '';
$varName["x"] = "test"; // causes: Illegal string offset

सही तरीका है:

 $varName = array();
 $varName["x"] = "test"; // works

जहाँ $ varName को ऐसे मान से आरम्भ किया जाता है जो एक सरणी होना चाहिए लेकिन एक खाली स्ट्रिंग हो सकता है, मान को ज़बरदस्ती रखने से इससे बचा जा सकता है, जैसे: $ varName = (array) $ shouldBeArray
markdwhite

4

PHP 5.4 से, हमें उसी डेटाटाइप मान को पारित करने की आवश्यकता है जो एक फ़ंक्शन की अपेक्षा करता है। उदाहरण के लिए:

function testimonial($id); // This function expects $id as an integer

इस फ़ंक्शन को लागू करते समय, यदि एक स्ट्रिंग मान इस तरह प्रदान किया जाता है:

$id = $array['id']; // $id is of string type
testimonial($id); // illegal offset warning

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

$id = settype($array['id'],"integer"); // $id now contains an integer instead of a string
testimonial($id); // now running smoothly

यह सरणियों के साथ कैसे करना है ...?
कुछ गैर-गैर-

2

सरणी की जांच करने से पहले, यह करें:

if(!is_array($memcachedConfig))
     $memcachedConfig = array();

1

मेरे मामले में मैं mysql_fetch_assoc को mysql_fetch_array में बदलता हूं और हल करता हूं। इसे हल करने में 3 दिन लगते हैं :-( और मेरे प्रोसीक के दूसरे संस्करण भ्रूण के परखने के साथ चलते हैं।


1

मेरे मामले में, मैंने इसे हल किया जब मैं फ़ंक्शन में बदल गया जो कि sql क्वेरी करता है : return json_encode($array) उसके बाद:return $array


1

यह मेरे लिए काम करता है:

परीक्षण कोड मेरा:

$var2['data'] = array ('a'=>'21','b'=>'32','c'=>'55','d'=>'66','e'=>'77');
foreach($var2 as $result)
{  
    $test = $result['c'];
}
print_r($test);

आउटपुट: 55

इसे लोग चेक करें। धन्यवाद


1

महज प्रयोग करें

$memcachedConfig = array();

इससे पहले

 print $memcachedConfig['host'];
 print $memcachedConfig['port'];


 Warning: Illegal string offset 'host' in ....
 Warning: Illegal string offset 'port' in ....

इसका कारण यह है कि आप कभी भी परिभाषित नहीं करते हैं कि $ मेमेकैडकैफिग क्या है, इसलिए डिफ़ॉल्ट रूप से स्ट्रिंग नहीं एरे द्वारा इलाज किया जाता है ..


1

मैंने ट्रिम () फ़ंक्शन का उपयोग करके इस समस्या को हल किया। मुद्दा जगह के साथ था।

तो चलो कोशिश करें

$unit_size = []; //please declare the variable type 
$unit_size = exolode("x", $unit_size);
$width  = trim ($unit_size[1] );
$height = trim ($unit_size[2] );

उम्मीद है इससे आपको मदद मिलेगी।


0

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


0

यह एक पुराना है लेकिन अगर कोई इससे लाभान्वित हो सकता है। यदि आपकी सरणी खाली है तो आपको यह त्रुटि भी मिलेगी।

मेरे मामले में मेरे पास था:

$buyers_array = array();
$buyers_array = tep_get_buyers_info($this_buyer_id); // returns an array
...
echo $buyers_array['firstname'] . ' ' . $buyers_array['lastname']; 

जिसे मैंने बदल दिया:

$buyers_array = array();
$buyers_array = tep_get_buyers_info($this_buyer_id); // returns an array
...
if(is_array($buyers_array)) {
   echo $buyers_array['firstname'] . ' ' . $buyers_array['lastname']; 
} else {
   echo 'Buyers id ' . $this_buyer_id . ' not found';
}

0

मुझे लगता है कि इस संदेश का एकमात्र कारण है क्योंकि लक्ष्य एरे वास्तव में स्ट्रिंग आदि जैसे एक सरणी है (JSON -> {"host": "127.0.0.1"}) चर


0

PHP के लिए

//Setup Array like so
$memcachedConfig = array(
  "host" => "127.0.0.1",
  "port" => "11211"
);

//Always a good practice to check if empty

if(isset($memcachedConfig['host']) && isset($memcachedConfig['port'])){

    //Some codes

    print_r ($memcachedConfig['host']);
    print_r ($memcachedConfig['port']);

}

बस यह जांचना सुनिश्चित करें कि मूल्य वापसी खाली नहीं है। तो यह उदाहरण PHP के लिए था इसलिए यह पता करें कि अन्य भाषाओं में कोई सरणी खाली है या नहीं।

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