복붙노트

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

PHP

잘못된 문자열 오프셋 경고 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를 편집하고 오류 수준을 다시 설정하기를 정말로 원하지 않습니다.

해결법

  1. ==============================

    1.이 방법을 시도하십시오 ....이 코드를 테스트했습니다 .... 작동합니다 ....

    이 방법을 시도하십시오 ....이 코드를 테스트했습니다 .... 작동합니다 ....

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

    2.잘못된 문자열 오프셋 'whatever'in ... 일반적으로 문자열을 전체 배열로 사용하려고합니다.

    잘못된 문자열 오프셋 '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

    이 질문에 오는 사람들은 오류의 애매 모호함을 내가하는 것처럼 그것에 대해 할 일으로 번역하려고합니다.

  3. ==============================

    3.문자열 인 키를 사용하여 문자열 인 것처럼 배열에 액세스하려고합니다. 문자열은 그것을 이해하지 못할 것이다. 코드에서 우리는 문제를 볼 수 있습니다 :

    문자열 인 키를 사용하여 문자열 인 것처럼 배열에 액세스하려고합니다. 문자열은 그것을 이해하지 못할 것이다. 코드에서 우리는 문제를 볼 수 있습니다 :

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

    어떤 이유로 배열을 예상했지만 문자열이 있습니다. 그냥 혼란스러워. 어쩌면 변수가 변경되었을 수도 있습니다. 어쩌면 배열이 아닐 수도 있습니다. 실제로 중요하지 않습니다.

    배열을 가져야한다는 것을 알고 있다면 배열이없는 이유를 확인하기 위해 몇 가지 기본 디버깅을 수행해야합니다. 우리가 배열이나 문자열을 가질 지 모른다면 상황이 좀 더 까다로워집니다.

    우리가 할 수있는 일은 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은 false를 반환합니다. array_key_exists는 키가 있는지 확인합니다.

  4. ==============================

    4.큰 답이 많이 있습니다. 그러나 제 문제는 아주 간단합니다.

    큰 답이 많이 있습니다. 그러나 제 문제는 아주 간단합니다.

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

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

    그리고 배열을 먼저 정의하지 않았기 때문에 $ x [ 'name']에서이 잘못된 문자열 오류가 발생했습니다. 그래서 $ x []에 물건을 할당하기 전에 다음 코드를 입력하십시오 :

    $x = array();
    

    그리고 효과가있었습니다.

  5. ==============================

    5.PHP 5.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
    
  6. ==============================

    6.배열을 검사하기 전에 다음을 수행하십시오.

    배열을 검사하기 전에 다음을 수행하십시오.

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

    7.내 경우에는 mysql_fetch_assoc을 mysql_fetch_array로 변경하고 해결한다. 해결하기 위해 3 일이 걸립니다 :- (그리고 다른 proyect 버전은 fetch assoc으로 실행됩니다.

    내 경우에는 mysql_fetch_assoc을 mysql_fetch_array로 변경하고 해결한다. 해결하기 위해 3 일이 걸립니다 :- (그리고 다른 proyect 버전은 fetch assoc으로 실행됩니다.

  8. ==============================

    8.질문에 조금 늦었지만 검색중인 다른 사람들에게 : 잘못된 값 (유형)으로 초기화하여이 오류가 발생했습니다.

    질문에 조금 늦었지만 검색중인 다른 사람들에게 : 잘못된 값 (유형)으로 초기화하여이 오류가 발생했습니다.

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

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

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

    9.직렬화 된 배열을 unserialize하는 것을 잊어 버렸기 때문에 누군가에게 도움이된다면이 오류가 발생했습니다. 그것은 당신의 사건에 적용된다면 확실히 확인할 것입니다.

    직렬화 된 배열을 unserialize하는 것을 잊어 버렸기 때문에 누군가에게 도움이된다면이 오류가 발생했습니다. 그것은 당신의 사건에 적용된다면 확실히 확인할 것입니다.

  10. ==============================

    10.그것은 오래되었지만 누군가가 이것으로 혜택을 볼 수 있기를 바랍니다. 배열이 비어있는 경우에도이 오류가 발생합니다.

    그것은 오래되었지만 누군가가 이것으로 혜택을 볼 수 있기를 바랍니다. 배열이 비어있는 경우에도이 오류가 발생합니다.

    내 경우에는 내가 가지고 :

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

    11.내 경우 SQL 쿼리를 수행하는 함수를 변경했을 때이를 해결했습니다. 이후 : return json_encode ($ array) 그런 다음 : return $ array

    내 경우 SQL 쿼리를 수행하는 함수를 변경했을 때이를 해결했습니다. 이후 : return json_encode ($ array) 그런 다음 : return $ array

  12. from https://stackoverflow.com/questions/9869150/illegal-string-offset-warning-php by cc-by-sa and MIT license