source

잘못된 문자열 오프셋 경고 PHP

gigabyte 2022. 9. 18. 10:13
반응형

잘못된 문자열 오프셋 경고 PHP

php 버전을 5.4.0-3으로 업데이트한 후 이상한 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를 편집하고 오류 수준을 재설정하고 싶지 않습니다.

「」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 에서 동작하고 있는 것을 확인할 수 있습니다.

이 질문을 받으러 온 분들을 위해 저처럼 오류의 모호성을 뭔가로 바꾸려고 하는 분들을 위해.

합니다.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상황이 좀 더 까다로워진다.

다음과 같은 알림, 경고 또는 오류가 없는지 확인하기 위해 모든 종류의 검사를 수행할 수 있습니다.

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

와 사이에는 몇 가지 미묘한 차이가 있습니다.예를 들어, 의 값이$array['key']null,issetfalsearray_key_exists열쇠가 존재하는지 확인할 겁니다

이렇게 해보세요...이 코드를 테스트했습니다.동작하고 있습니다.

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

여기에는 훌륭한 답변들이 많이 있습니다. 하지만 저는 제 문제가 훨씬 더 간단하다는 것을 알았습니다.

다음 명령을 실행하려고 했습니다.

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

는 이것을 .illegal string$x['name']어레이를 먼저 정의하지 않았기 때문입니다.한줄 '아까보다'에.$x[]:

$x = array();

그리고 그것은 성공하였다.

질문에는 조금 늦었지만 검색 중인 다른 사용자:잘못된 값(타입)으로 초기화하면 다음 오류가 발생하였습니다.

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

올바른 방법은 다음과 같습니다.

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

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

이렇게 하면 데이터 유형 불일치로 인해 잘못된 오프셋 경고가 생성됩니다.이 문제를 해결하려면 다음 명령을 사용합니다.

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

어레이를 체크하기 전에 다음 작업을 수행합니다.

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

제 경우 mysql_fetch_assoc를 mysql_fetch_array로 변경하여 해결합니다.:-( 및 다른 버전의 proyect는 fetch assoc에서 실행됩니다.

내 경우, 다음 이후에 sql 쿼리를 수행하는 기능을 변경했을 때 해결했습니다.return json_encode($array)그 후, 다음과 같이 합니다.return $array

효과가 있습니다.

테스트 코드:

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

출력:55

얘들아, 확인해봐.감사합니다.

그냥 사용하다

$memcachedConfig = array();

전에

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


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

이는 $memcachedConfig가 무엇인지 정의하지 않기 때문에 기본적으로 배열이 아닌 문자열로 처리되기 때문입니다.

trim() 함수를 사용하여 이 문제를 해결했습니다.문제는 공간이었다.

그러니까 한번 해보자

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

이것이 당신에게 도움이 되길 바랍니다.

이 메시지가 표시되는 유일한 이유는 타겟 어레이가 실제로는 어레이와 같은 문자열 등(JSON -> {"host": "127.0.0.1") 변수이기 때문이라고 생각합니다.

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용이므로 다른 언어로 배열이 비어 있는지 확인하는 방법을 알아봅니다.

내 경우: 데이터베이스 레코드를 가져오는 동안result_array();대신row();또는row_array();

혹시 모르니까 시리얼 어레이의 시리얼 해제를 잊어버렸기 때문에 이 에러가 발생하고 있었습니다.그것은 당신의 경우에 해당되는지 확실히 확인하고 싶습니다.

오래된 건데 혹시나 이거로 이득을 볼 수 있을까 봐.어레이가 비어 있는 경우에도 이 오류가 발생합니다.

제 경우, 다음과 같은 일이 있었습니다.

$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';
}

언급URL : https://stackoverflow.com/questions/9869150/illegal-string-offset-warning-php

반응형