การชดเชยสตริงที่ผิดกฎหมาย PHP


193

ฉันได้รับข้อผิดพลาด PHP แปลกหลังจากอัปเดตเวอร์ชัน php เป็น 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

1
มันหมายความว่าไม่มีปุ่ม ตรวจสอบตัวแปรของคุณvar_export($memcachedConfig)ก่อน "พิมพ์"
Skrol29

9
สิ่งที่คนส่วนใหญ่พลาดคือสิ่งนี้ไม่ได้หมายความว่าไม่มีดัชนี - ที่สร้างข้อความ "ดัชนีที่ไม่ได้กำหนด" นี่เป็นข้อผิดพลาดที่แตกต่างกัน
grantwparks

5
stackoverflow.com/a/20271518/2898712เป็นคำตอบที่ถูกต้องที่นี่
wedi

19
ให้ความสนใจทุกคนที่ดูคำถามนี้: คำตอบที่ถูกต้องสำหรับคำถามนี้ไม่ใช่คำตอบที่ถูกทำเครื่องหมายไว้; ถูกต้องอยู่ด้านล่างของ Kzqai
Aaron

คำตอบ:


37

โปรดลองด้วยวิธีนี้ .... ฉันได้ทดสอบรหัสนี้ .... มันใช้งานได้

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

1
พบมัน ขอบคุณสำหรับความช่วยเหลือของคุณ. var_dump ช่วย ฉันโหลดอาร์เรย์จากไฟล์ปรับแต่งซึ่งมีเนื้อหา strage เช่นนี้ อาร์เรย์ (2) {["โฮสต์"] => สตริง (9) "127.0.0.1" ["พอร์ต"] => สตริง (5) "11211"} สตริง (5) "m_prefix" PHP 5.4 ตอนนี้ $ xx [' host '] ส่งสัญญาณเตือนอย่างถูกต้อง
thesonix

include_once($file);ผมมีข้อผิดพลาดเดียวกันหลังจากที่ อาร์เรย์ถูกสร้างขึ้นอย่างถูกต้อง (ข้อมูลการดีบักแสดงสิ่งนี้) อย่างไรก็ตามจะต้องคัดลอกด้วยตนเองไปยังอาร์เรย์อื่นก่อนที่จะสามารถใช้งานได้โดยไม่มีข้อความเตือน PHP stringoffset ที่ผิดกฎหมาย
Franz Holzinger

$ sStartDate = date ("Ymd", strtotime ($ feed ['DTSTART'] ['value'])); $ sEndDate = date ("Ymd", strtotime ($ feed ['DTEND'] ['value'])); วิธีแก้ไขข้อผิดพลาดเดียวกันได้ที่นี่คำเตือน: การชดเชยสตริงที่ผิดกฎหมาย
J. Shabu

303

ข้อผิดพลาด 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
ฉันพนันได้ว่ามันสามารถแสดงให้เห็นได้ว่านี่คือเหตุผลที่ทำให้เกิดปัญหาดั้งเดิม ความคิดเห็นส่วนใหญ่ถือว่า "ดัชนีที่ไม่ได้กำหนด" อย่างไม่ถูกต้องเป็นข้อผิดพลาด
grantwparks

1
พบปัญหานี้ในอีกสักครู่ ขอบคุณ
David Okwii

บางครั้งข้อผิดพลาดนี้อาจเกิดขึ้นเมื่อพยายามที่จะคว้าโหนดที่ไม่ถูกต้องของอาเรย์หลายมิตินั่นคือ "ลึกเกินไป" คุณจำเป็นต้องเลือกพาเรนต์ของตัวเลือกแทน
zoltar

ถูกต้องฉันใช้fetchAll(PDO::FETCH_ASSOC)แทนfetch(PDO::FETCH_ASSOC)และทำงานได้อย่างสมบูรณ์
MNN

ฉันใช้รหัสนี้ซ้ำ$variablename = [];สองครั้งในส่วนอื่นของรหัส$variablename = "test";ซึ่งทำให้เกิดข้อความแสดงข้อผิดพลาด
Kai Noack

77

TL; DR

คุณกำลังพยายามที่จะเข้าถึงราวกับว่ามันเป็นอาร์เรย์ที่มีคีย์ที่เป็น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 = (อาร์เรย์) $ 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

สิ่งนี้เกี่ยวข้องกับอาร์เรย์ ... อย่างไร
ผู้ใช้ที่ไม่ใช่ผู้ใช้คำอธิบาย


1

ในกรณีของฉันฉันเปลี่ยน mysql_fetch_assoc เป็น mysql_fetch_array และแก้ปัญหา ใช้เวลา 3 วันในการแก้ :-( และรุ่นอื่น ๆ ของ proyect ที่ฉันใช้กับดึงข้อมูล assoc


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 ....

นี่เป็นเพราะคุณไม่เคยกำหนดว่า $ memcachedConfig ดังนั้นโดยค่าเริ่มต้นจะถือว่าเป็นสตริงไม่ใช่อาร์เรย์


1

ฉันแก้ไขปัญหานี้โดยใช้ฟังก์ชัน trim () ปัญหาคือมีพื้นที่

ลองทำดู

$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

ฉันคิดว่าเหตุผลเดียวสำหรับข้อความนี้ก็คือเพราะ Array เป้าหมายเป็นจริงอาร์เรย์เช่นสตริง ฯลฯ (JSON -> {"โฮสต์": "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 เพื่อค้นหาวิธีการตรวจสอบว่าอาร์เรย์ว่างเปล่าในภาษาอื่น ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.