Jaki jest najlepszy sposób określenia, czy wynikiem działania serialize()
funkcji jest ciąg znaków ?
źródło
Jaki jest najlepszy sposób określenia, czy wynikiem działania serialize()
funkcji jest ciąg znaków ?
Powiedziałbym, spróbuj unserialize
;-)
Cytując instrukcję:
W przypadku, gdy przekazany ciąg nie nadaje się do serializacji, zwracany jest FALSE i wysyłany jest E_NOTICE.
Musisz więc sprawdzić, czy wartość zwracana jest, false
czy nie (z ===
lub !==
, aby upewnić się, że nie masz żadnego problemu z 0
lub null
lub czymkolwiek, co jest równe false
, powiedziałbym) .
Po prostu uważaj na uwagę: możesz chcieć / potrzebować użyć operatora @ .
Na przykład :
$str = 'hjkl';
$data = @unserialize($str);
if ($data !== false) {
echo "ok";
} else {
echo "not ok";
}
Dostaniesz:
not ok
EDYCJA: Aha, i tak jak powiedział @Peter (dzięki niemu!), Możesz napotkać kłopoty, jeśli próbujesz odserializować reprezentację logicznego fałszu :-(
Zatem sprawdzenie, czy serializowany ciąg nie jest równy „ b:0;
”, może być również pomocne; coś takiego powinno załatwić sprawę, jak sądzę:
$data = @unserialize($str);
if ($str === 'b:0;' || $data !== false) {
echo "ok";
} else {
echo "not ok";
}
testowanie tego specjalnego przypadku przed próbą odserializacji byłoby optymalizacją - ale prawdopodobnie nie jest to użyteczne, jeśli nie masz często fałszywych wartości serializowanych.
Nie napisałem tego kodu, właściwie pochodzi z WordPressa. Pomyślałem, że dołączę to dla wszystkich zainteresowanych, może to przesada, ale działa :)
źródło
^([adObis]:|N;)
Optymalizacja odpowiedzi Pascala MARTINA
źródło
Jeśli ciąg $ jest zserializowaną
false
wartością, tj.$string = 'b:0;'
Funkcja SoN9ne zwracafalse
, jest błędnawięc funkcja byłaby
źródło
In case the passed string is not unserializeable, FALSE is returned and E_NOTICE is issued.
Nie możemy złapać błędu E_NOTICE, ponieważ nie jest to wyrzucony wyjątek.Pomimo doskonałej odpowiedzi Pascala MARTINA, byłem ciekawy, czy możesz podejść do tego inaczej, więc zrobiłem to jako ćwiczenie umysłowe
I faktycznie działa. Jedynym zastrzeżeniem jest to, że prawdopodobnie zepsuje się, jeśli masz zarejestrowaną procedurę obsługi błędów z powodu działania $ php_errormsg .
źródło
$a
a deserializacją$b
, co nie jest praktycznym projektem aplikacji.Prawidłowo obsługuje przypadek
serialize(false)
. :)źródło
wbudować w funkcję
źródło
a:
(lubb:
itp.) Występuje gdzieś wewnątrz $ value, a nie na początku. I^
tutaj nie oznacza początku łańcucha. To całkowicie mylące.Jest rozwiązanie WordPress: (szczegóły tutaj)
źródło
źródło
U mnie to działa dobrze
źródło
Wolę to robić w ten sposób:
źródło