Cảnh báo chuỗi bất hợp pháp Cảnh báo PHP


193

Tôi gặp một lỗi PHP lạ sau khi cập nhật phiên bản php của mình lên 5.4.0-3.

Tôi có mảng này:

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

Khi tôi cố gắng truy cập nó như thế này, tôi nhận được những cảnh báo lạ

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


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

Tôi thực sự không muốn chỉnh sửa php.ini của mình và đặt lại mức lỗi.


20
Rõ ràng $memcachedConfigkhông phải là mảng đó. Hiển thịvar_dump($memcachedConfig);
zerkms

1
Nó có nghĩa là các khóa không tồn tại. Kiểm tra biến của bạn var_export($memcachedConfig)ngay trước khi "in".
Skrol29

9
Điều mà hầu hết mọi người bỏ lỡ là điều này không có nghĩa chính xác là chỉ mục không tồn tại - điều đó tạo ra thông báo "chỉ mục không xác định". Đây là một lỗi khác nhau.
Grantwparks

5
stackoverflow.com/a/20271518/2898712 là câu trả lời đúng ở đây.
wedi

19
Chú ý bất cứ ai xem câu hỏi này: Câu trả lời đúng cho câu hỏi này không phải là câu được đánh dấu; đúng là của Kzqai dưới đây
Aaron

Câu trả lời:


37

Vui lòng thử theo cách này .... Tôi đã kiểm tra mã này .... Nó hoạt động ....

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

1
Tìm thấy rồi. Cảm ơn bạn đã giúp đỡ. var_dump đã giúp. Tôi đã tải mảng từ một tập tin cấu hình, trong đó có nội dung mạnh mẽ như thế này. mảng (2) {["host"] => chuỗi (9) "127.0.0.1" ["port"] => chuỗi (5) "11211"} chuỗi (5) "m_prefix" PHP 5.4 bây giờ $ xx [' máy chủ '] đã ném cảnh báo chính xác.
thesonix

Tôi đã có cùng một lỗi sau một include_once($file);. Mảng đã được xây dựng chính xác (thông tin gỡ lỗi cho thấy điều này), tuy nhiên nó phải được sao chép thủ công vào một mảng khác trước khi có thể sử dụng được mà không có thông báo cảnh báo chuỗi trái phép PHP.
Franz Holzinger

$ sStartDate = ngày ("Ymd", strtotime ($ feed ['DTSTART'] ['value'])); $ sEndDate = ngày ("Ymd", strtotime ($ feed ['DTEND'] ['value'])); Cách khắc phục lỗi tương tự tại đây Cảnh báo: Bù chuỗi bất hợp pháp
J. Shabu

302

Lỗi Illegal string offset 'whatever' in... thường có nghĩa là: bạn đang cố gắng sử dụng một chuỗi như một mảng đầy đủ.

Điều đó thực sự có thể vì các chuỗi có thể được coi là mảng các ký tự đơn trong php. Vì vậy, bạn đang nghĩ $ var là một mảng có khóa, nhưng đó chỉ là một chuỗi với các khóa số tiêu chuẩn, ví dụ:

$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

Bạn có thể thấy điều này trong hành động ở đây: http://ideone.com/fMhmkR

Đối với những người đến với câu hỏi này đang cố gắng chuyển sự mơ hồ của lỗi thành một cái gì đó để làm về nó, như tôi đã làm.


8
Tôi cá rằng nó có thể được hiển thị đây là lý do vấn đề ban đầu xảy ra. Hầu hết các ý kiến ​​đều cho rằng "chỉ mục không xác định" là lỗi.
Grantwparks

1
Chạy vào vấn đề này trong một vòng lặp while. Cảm ơn
David Okwii

Đôi khi lỗi này có thể xảy ra khi cố lấy nút sai của mảng đa chiều, nghĩa là "quá sâu", thay vào đó bạn cần cha mẹ của lựa chọn
zoltar 28/03/18

Điều này là chính xác, tôi đã sử dụng fetchAll(PDO::FETCH_ASSOC)thay thế fetch(PDO::FETCH_ASSOC)và làm việc hoàn hảo.
MNN

Tình cờ tôi đã sử dụng tương tự $variablename = []; hai lần , ở một phần khác trong mã của tôi $variablename = "test";gây ra thông báo lỗi.
Kai Noack

77

TL; DR

Bạn đang cố gắng truy cập stringnhư thể đó là một mảng, với một khóa đó là a string. stringsẽ không hiểu điều đó. Trong mã chúng ta có thể thấy vấn đề:

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

Chuyên sâu

Hãy xem lỗi đó:

Cảnh báo: offset 'cổng' bất hợp pháp trong ...

Nó nói gì? Nó nói rằng chúng tôi đang cố gắng sử dụng chuỗi 'port'làm phần bù cho chuỗi. Như thế này:

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

Điều gì gây ra điều này?

Đối với một số lý do bạn mong đợi một array, nhưng bạn có một string. Chỉ là một hỗn hợp. Có thể biến của bạn đã được thay đổi, có thể nó không bao giờ là mộtarray , nó thực sự không quan trọng.

Những gì có thể được thực hiện?

Nếu chúng ta biết chúng ta nên có một array, chúng ta nên thực hiện một số gỡ lỗi cơ bản để xác định lý do tại sao chúng ta không có array. Nếu chúng ta không biết liệu chúng ta có arrayhay không string, mọi thứ trở nên phức tạp hơn một chút.

Những gì chúng ta có thể làm là tất cả các loại kiểm tra để đảm bảo chúng ta không có thông báo, cảnh báo hoặc lỗi với những thứ như is_arrayisset hay 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
}

Có một số khác biệt tinh tế giữa issetarray_key_exists. Ví dụ, nếu giá trị của $array['key']null, issettrả về false. array_key_existssẽ chỉ kiểm tra xem, tốt, chìa khóa tồn tại .


13

Có rất nhiều câu trả lời tuyệt vời ở đây - nhưng tôi thấy vấn đề của mình đơn giản hơn một chút.

Tôi đã cố chạy lệnh sau:

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

và tôi đã nhận được illegal stringlỗi này $x['name']vì tôi đã không xác định mảng đầu tiên. Vì vậy, tôi đặt dòng mã sau vào trước khi cố gắng gán mọi thứ cho $x[]:

$x = array();

va no đa hoạt động.


1
Tôi nghĩ rằng đây nên là câu trả lời. Đây phải là khác nhau giữa 5,4 (và trước 7) và 7.
sonnb

7

Một chút muộn cho câu hỏi, nhưng đối với những người khác đang tìm kiếm: Tôi đã gặp lỗi này bằng cách khởi tạo với một giá trị (loại) sai:

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

Cách đúng là:

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

Trong đó $ varName được khởi tạo từ một giá trị phải là một mảng nhưng có thể là một chuỗi rỗng, việc ép buộc giá trị có thể tránh điều này, ví dụ: $ varName = (mảng) $ nênBeArray
markdwhite

4

Từ PHP 5.4, chúng ta cần truyền cùng một giá trị kiểu dữ liệu mà hàm mong đợi. Ví dụ:

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

Khi gọi hàm này, nếu một giá trị chuỗi được cung cấp như thế này:

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

Điều này sẽ tạo ra một cảnh báo bù trừ bất hợp pháp vì không khớp kiểu dữ liệu. Để giải quyết vấn đề này, bạn có thể sử dụng settype:

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

Làm thế nào điều này có liên quan đến mảng ...?
một số người dùng không mô tả

2

Trước khi kiểm tra mảng, hãy làm điều này:

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

1

Trong trường hợp của tôi, tôi thay đổi mysql_fetch_assoc thành mysql_fetch_array và giải quyết. Phải mất 3 ngày để giải quyết :-( và các phiên bản khác của proyect của tôi chạy với PGS.


1

Trong trường hợp của tôi, tôi đã giải quyết nó khi tôi thay đổi chức năng truy vấn sql sau: return json_encode($array) then:return $array


1

Nó hoạt động với tôi:

Mã kiểm tra của tôi:

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

Đầu ra: 55

Kiểm tra đi các bạn. Cảm ơn


1

chỉ dùng

$memcachedConfig = array();

trước

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


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

điều này là do bạn không bao giờ định nghĩa $ memcachedConfig là gì, do đó theo mặc định được xử lý bởi chuỗi không phải là mảng ..


1

Tôi đã giải quyết vấn đề này bằng cách sử dụng hàm trim (). vấn đề là với không gian.

vì vậy hãy cố gắng

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

Tôi hy vọng điều này sẽ giúp bạn.


0

Chỉ cần nó giúp bất cứ ai, tôi đã nhận được lỗi này vì tôi quên không xác nhận một mảng được tuần tự hóa. Đó chắc chắn là điều tôi sẽ kiểm tra nếu nó áp dụng cho trường hợp của bạn.


0

Đó là một cái cũ nhưng trong trường hợp ai đó có thể được hưởng lợi từ điều này. Bạn cũng sẽ gặp lỗi này nếu mảng của bạn trống.

Trong trường hợp của tôi, tôi đã có:

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

mà tôi đã đổi thành:

$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

Tôi nghĩ lý do duy nhất cho thông báo này là vì Mảng mục tiêu thực sự là một mảng như chuỗi v.v (JSON -> {"host": "127.0.0.1"})


0

Đối với 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']);

}

Chỉ cần đảm bảo kiểm tra xem giá trị trả về không trống. Vì vậy, ví dụ này là dành cho PHP, vì vậy hãy tìm hiểu cách kiểm tra xem một mảng có trống trong các ngôn ngữ khác không.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.