অবৈধ স্ট্রিং অফসেট সতর্কতা পিএইচপি


193

আমার পিএইচপি সংস্করণ 5.4.0-3 এ আপডেট করার পরে আমি একটি অদ্ভুত পিএইচপি ত্রুটি পেয়েছি।

আমার এই অ্যারে আছে:

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);
zerkms 26'12

1
এর অর্থ কীগুলি বিদ্যমান নেই। var_export($memcachedConfig)"মুদ্রণের" ঠিক আগে আপনার ভেরিয়েবল পরীক্ষা করে দেখুন ।
Skrol29

9
বেশিরভাগ লোকেরা যা মিস করেছেন তার অর্থ হ'ল সূচকের অস্তিত্ব নেই - যা "অপরিজ্ঞাত সূচক" বার্তা দেয়। এটি একটি ভিন্ন ত্রুটি।
গ্র্যান্টপ্পার্ক

5
stackoverflow.com/a/20271518/2898712 এখানে সঠিক উত্তর।
wedi

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) "এম_প্রিফিক্স" পিএইচপি 5.4 এখন $ xx [' হোস্ট '] সতর্কতাটি সঠিকভাবে ছুঁড়েছে।
Thesonix

আমার পরেও একই ত্রুটি ছিল include_once($file);। অ্যারেটি সঠিকভাবে নির্মিত হয়েছে (ডিবাগ তথ্য এটি দেখায়) তবে পিএইচপি অবৈধ স্ট্রিংসফ্ট সতর্কতা বার্তা ছাড়াই ব্যবহারযোগ্য হওয়ার আগে এটি অন্য একটি অ্যারে ম্যানুয়ালি অনুলিপি করতে হয়েছিল।
ফ্রানজ হল্জিংগার

St sStartDate = তারিখ ("Ymd", স্ট্রোটোটাইম ($ ফিড ['DTSTART'] ['মান'])); ; sndndate = তারিখ ("Ymd", স্ট্রোটোটাইম ($ ফিড ['DTEND'] ['মান'])); এখানে একই ত্রুটিটি কীভাবে ঠিক করবেন সতর্কতা: অবৈধ স্ট্রিং অফসেট
জে শাবু

302

ভূল Illegal string offset 'whatever' in... সাধারণত অর্থ হয়: আপনি একটি স্ট্রিং পুরো অ্যারে হিসাবে ব্যবহার করার চেষ্টা করছেন।

স্ট্রিংগুলি পিএইচপি-তে একক অক্ষরের অ্যারে হিসাবে বিবেচনা করতে সক্ষম হওয়ায় এটি আসলে সম্ভব। সুতরাং আপনি ভাবছেন $ 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
কিছুক্ষণ লুপের মধ্যে এই সমস্যাটি ছড়িয়ে পড়ে। ধন্যবাদ
ডেভিড Okwii

কখনও কখনও এই ত্রুটিটি ঘটে যেতে পারে যখন বহুমাত্রিক অ্যারের ভুল নোডটি ধরার চেষ্টা করা হয়, অর্থাত "খুব গভীর" হয়ে যাওয়ার পরিবর্তে আপনার নির্বাচনের পিতামাতার প্রয়োজন
জোলটার

এটি সঠিক, আমি fetchAll(PDO::FETCH_ASSOC)পরিবর্তে ব্যবহার করেছি fetch(PDO::FETCH_ASSOC)এবং পুরোপুরি কাজ করেছি।
এমএনএন

অজ্ঞাতসারে আমি $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 এর মধ্যে আলাদা হতে হবে
সোনব

7

প্রশ্নটি থেকে কিছুটা দেরীতে, তবে যারা অনুসন্ধান করছেন তাদের জন্য: আমি একটি ভুল মান (প্রকার) দিয়ে শুরু করে এই ত্রুটিটি পেয়েছি:

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

সঠিক উপায়:

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

যেখানে $ varName এমন একটি মান থেকে শুরু করা হয়েছে যা অ্যারে হওয়া উচিত তবে এটি একটি খালি স্ট্রিং হতে পারে, মানকে চাপিয়ে দেওয়া এড়াতে পারে, উদাহরণস্বরূপ: $ varName = (অ্যারে) $ shouldBeArray
মার্কডহাইট

4

পিএইচপি 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

আমার ক্ষেত্রে, আমি এটি সমাধান করেছি যখন আমি ফাংশনে পরিবর্তিত হয়ে যা পরে এসকিএল কোয়েরি করে: 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 ....

এটি কারণ যা আপনি কখনই def memcachedConfig কী তা সংজ্ঞায়িত করেন না, তাই ডিফল্টরূপে অ্যারে নয় স্ট্রিং দ্বারা চিকিত্সা করা হয় ..


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

পিএইচপি জন্য

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

}

মূল্য পরীক্ষা করা খালি নয় তা পরীক্ষা করে দেখুন। সুতরাং এই উদাহরণটি পিএইচপি-র জন্য ছিল সুতরাং অন্য ভাষায় অ্যারে খালি কিনা তা পরীক্ষা করে দেখুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.