Funkce unserialize vracející false

Školení, která pořádám

Funkce unserialize může vrátit false ve dvou případech. Jednak v případě chyby a jednak při obnovování hodnoty false. Možná si řeknete, proč funkce nevrací hodnotu, která kolidovat nemůže. Důvod je ten, že funkce serialize je schopná uchovat v podstatě cokoliv, třeba i hodnotu null. Pro reportování chyb v této funkci by se báječně hodily výjimky, funkce se ale drží tradičního konceptu a vrací chybu typu E_NOTICE. Tuto chybu jde ošetřit několika způsoby:

<?php
// využití proměnné $php_errormsg
ini_set("track_errors", true); // povolení proměnné $php_errormsg
$php_errormsg = ""; // vymazání případné předchozí chyby
$original = unserialize($serialized);
if ($php_errormsg) {
    // ošetření chyby
}

// použití funkce set_error_handler
function error_handler($errno, $errstr) {
    // ošetření chyby
}
set_error_handler('error_handler');
$original = unserialize($serialized);
restore_error_handler();

// šalamounské řešení
$original = unserialize($serialized);
if (false === $original && $serialized !== serialize(false)) {
    // ošetření chyby
}
?>
Jakub Vrána, Výuka, 9.9.2005, diskuse: 3 (nové: 0)

Diskuse

ikona dgx:

v šalamounském řešení by mělo být !== namísto != jinak bude podmínka splněna i tehdy, pokud $serialized = 0;

ikona Jakub Vrána OpenID:

Díky za upozornění, opravil jsem to.

Mordae:

Hmm, jako řešení pro možné hodnoty FALSE je to v pořádku, ale pokud bychom to používali ve "vlastní" deserializační metodě, bylo by to neúměrně náročné.

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2018 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.