Po zaktualizowaniu mojej wersji php do 5.4.0-3 pojawia się dziwny błąd PHP.
Mam tę tablicę:
Array
(
[host] => 127.0.0.1
[port] => 11211
)
Gdy próbuję uzyskać do niego dostęp w ten sposób, otrzymuję dziwne ostrzeżenia
print $memcachedConfig['host'];
print $memcachedConfig['port'];
Warning: Illegal string offset 'host' in ....
Warning: Illegal string offset 'port' in ...
Naprawdę nie chcę po prostu edytować pliku php.ini i ponownie ustawiać poziomu błędu.
$memcachedConfig
nie jest to tablica. Showvar_dump($memcachedConfig);
var_export($memcachedConfig)
tuż przed „print”.Odpowiedzi:
Spróbuj tego w ten sposób .... Przetestowałem ten kod .... Działa ....
źródło
include_once($file);
. Tablica została poprawnie zbudowana (pokazuje to informacja o debugowaniu), jednak musiała zostać skopiowana ręcznie do innej tablicy, zanim mogła zostać użyta bez komunikatu ostrzegającego o nielegalnym przesunięciu łańcucha PHP.Błąd
Illegal string offset 'whatever' in...
ogólnie oznacza: próbujesz użyć łańcucha jako pełnej tablicy.Jest to faktycznie możliwe, ponieważ ciągi znaków mogą być traktowane jako tablice pojedynczych znaków w php. Więc myślisz, że $ var jest tablicą z kluczem, ale to tylko ciąg znaków ze standardowymi klawiszami numerycznymi, na przykład:
Możesz to zobaczyć w akcji tutaj: http://ideone.com/fMhmkR
Dla tych, którzy przychodzą na to pytanie, próbując przełożyć niejasność błędu na coś, co mam z tym zrobić, tak jak ja.
źródło
fetchAll(PDO::FETCH_ASSOC)
zamiast tegofetch(PDO::FETCH_ASSOC)
i działało idealnie.$variablename = [];
dwa razy, w innej części mojego kodu,$variablename = "test";
która spowodowała komunikat o błędzie.TL; DR
Próbujesz uzyskać dostęp do
string
tablicy, jakby to była tablica, z kluczem, który jeststring
.string
nie zrozumie tego. W kodzie możemy zobaczyć problem:Dogłębnie
Zobaczmy ten błąd:
Co to mówi? Mówi, że próbujemy użyć łańcucha
'port'
jako przesunięcia łańcucha. Lubię to:Co to powoduje?
Z jakiegoś powodu spodziewałeś się
array
, ale maszstring
. Po prostu pomyłka. Może twoja zmienna została zmieniona, może nigdy nie byłaarray
, to naprawdę nie jest ważne.Co można zrobić?
Jeśli wiemy, że powinniśmy mieć
array
, powinniśmy wykonać podstawowe debugowanie, aby ustalić, dlaczego nie mamyarray
. Jeśli nie wiemy, czy będziemy mieli,array
lubstring
, sytuacja stanie się nieco trudniejsza.Co nam może zrobić, to wszelkiego rodzaju kontroli w celu zapewnienia, że nie mamy Zawiadomienia, ostrzeżenia lub błędy z rzeczy, jak
is_array
iisset
alboarray_key_exists
:Istnieją pewne subtelne różnice między
isset
iarray_key_exists
. Na przykład, jeśli wartość$array['key']
wynosinull
,isset
zwracafalse
.array_key_exists
po prostu sprawdzi, czy klucz istnieje .źródło
Jest tu wiele świetnych odpowiedzi - ale mój problem był nieco prostszy.
Próbowałem uruchomić następujące polecenie:
i pojawiał się ten
illegal string
błąd,$x['name']
ponieważ najpierw nie zdefiniowałem tablicy. Więc wstawiam następujący wiersz kodu przed próbą przypisania rzeczy do$x[]
:i zadziałało.
źródło
Trochę za późno na pytanie, ale dla innych, którzy szukają: Ten błąd wystąpił, inicjując z niepoprawną wartością (typ):
Właściwy sposób to:
źródło
Począwszy od PHP 5.4 musimy przekazać tę samą wartość typu danych, jakiej oczekuje funkcja. Na przykład:
Podczas wywoływania tej funkcji, jeśli podana jest wartość ciągu:
Wygeneruje to ostrzeżenie o nielegalnym przesunięciu z powodu niedopasowania typu danych. Aby rozwiązać ten problem, możesz użyć
settype
:źródło
Przed sprawdzeniem tablicy wykonaj następujące czynności:
źródło
W moim przypadku zmieniam mysql_fetch_assoc na mysql_fetch_array i rozwiązuję. Rozwiązanie zajmuje 3 dni :-( a inne wersje mojego proyecta działają z programem assoc download.
źródło
W moim przypadku rozwiązałem to, gdy zmieniłem funkcję, która wykonuje zapytanie SQL po:
return json_encode($array)
następnie:return $array
źródło
Działa mi to:
Mój testowy kod:
Wynik:
55
Sprawdźcie chłopaki. Dzięki
źródło
po prostu użyj
przed
dzieje się tak, ponieważ nigdy nie definiujesz, co to jest $ memcachedConfig, więc domyślnie są traktowane ciągiem znaków, a nie tablicami.
źródło
Rozwiązałem ten problem za pomocą funkcji trim (). problem dotyczył miejsca.
więc spróbujmy
Mam nadzieję, że to Ci pomoże.
źródło
Wystarczy, że to pomoże komukolwiek, otrzymywałem ten błąd, ponieważ zapomniałem odserializować serializowaną tablicę. To zdecydowanie coś, co sprawdziłbym, czy dotyczy twojej sprawy.
źródło
Jest stary, ale na wypadek, gdyby ktoś mógł z tego skorzystać. Ten błąd pojawi się również, jeśli tablica jest pusta.
W moim przypadku miałem:
który zmieniłem na:
źródło
myślę, że jedynym powodem tego komunikatu jest to, że tablica docelowa jest w rzeczywistości tablicą podobną do łańcucha itp. (JSON -> {„host”: „127.0.0.1”}))
źródło
Dla PHP
Upewnij się tylko, że zwracana wartość nie jest pusta. Ten przykład dotyczy PHP, więc dowiedz się, jak sprawdzić, czy tablica jest pusta w innych językach.
źródło