Nedávno jsem narazil na problém při zpracování obrázkových dat získaných z databáze. Hodnota obrázku byla někdy prázdná nebo neplatná, což způsobovalo chyby při pokusu zobrazit obrázek. Tady je, jak jsem to vyřešil.
Problém
Když data obsahují prázdný nebo neplatný blob obrázku, PHP funkce getimagesizefromstring
vyhodí chybu. Potřeboval jsem robustní způsob, jak zjistit, zda data skutečně obsahují platný obrázek, a pokud ne, zobrazit zástupný obrázek.
Řešení
Přidal jsem několik kontrolních podmínek, které zajistí, že data obrázku nejsou prázdná nebo null
, než je budu zpracovávat. Také jsem použil @
před getimagesizefromstring
, abych potlačil případné chyby, které tato funkce může vyhodit, když data nejsou platným obrázkem.
Zde je upravený kód:
error suppression operator @
protected function assocFormImage(array $data, string $id): string
{
if (!empty($data['value']) && $data['value'] !== null && @getimagesizefromstring($data['value'])) {
$base64 = base64_encode($data['value']);
return "<td><a href='data:image/jpeg;base64,$base64' data-lightbox='image-$id'><img src='data:image/jpeg;base64,$base64' alt='Image' style='height: 50px'></a></td>";
} else {
return "<td><img src='" . (new Server_path())->server_url()['public'] . "assets/img/image_placeholder.jpg' alt='Image' style='height: 60px'></td>";
}
}
exception handling construct try-catch
protected function assocFormImage(array $data, string $id): string
{
try {
if (!empty($data['value']) && getimagesizefromstring($data['value'])) {
$base64 = base64_encode($data['value']);
return "<td><a href='data:image/jpeg;base64,$base64' data-lightbox='image-$id'><img src='data:image/jpeg;base64,$base64' alt='Image' style='height: 50px'></a></td>";
} else {
return "<td><img src='" . (new Server_path())->server_url()['public'] . "assets/img/image_placeholder.jpg' alt='Image' style='height: 60px'></td>";
}
} catch (Exception $e) {
if (DEBUGGER) {
error_log("Exception caught while processing image: " . $e->getMessage());
}
return "<td><img src='" . (new Server_path())->server_url()['public'] . "assets/img/image_placeholder.jpg' alt='Image' style='height: 60px'></td>";
}
}
Vysvětlení
- Kontrola prázdných a
null
hodnot: Použil jsem podmínku !empty($data[‚value‘]) && getimagesizefromstring($data[‚value‘]), abych se ujistil, že hodnota není prázdná nebonull
. Tím zabráním zpracování neplatných dat. - Potlačení chyb pomocí
@
: Funkcegetimagesizefromstring
může vyhodit chybu, pokud data nejsou platný obrázek. Použití@
před funkcí potlačí tyto chyby. Tímto způsobem se vyhneme nežádoucím chybovým hlášením v produkčním prostředí. - Návrat hodnoty: Pokud jsou data obrázku platná, převedu je na base64 zakódovaný řetězec a zobrazím je jako obrázek v tabulce. Pokud nejsou platná, zobrazím místo nich zástupný obrázek.
Výsledek
Tento přístup zajistí, že se vždy zobrazí buď platný obrázek, nebo zástupný symbol, pokud jsou data neplatná nebo prázdná. Tento způsob také zabraňuje chybám při zpracování neplatných dat.
Tímto způsobem jsem vyřešil problém s prázdnými nebo neplatnými blob daty obrázků a zajistil, že můj kód je robustnější a odolnější proti chybám.
Použití try-catch
Blok try-catch
je struktura pro správu výjimek v PHP. Umožňuje zachytit specifické chyby a reagovat na ně odpovídajícím způsobem.
Výhody:
- Přesná kontrola: Umožňuje přesně definovat, které chyby chcete zachytit a jak na ně reagovat.
- Lepší správa chyb: Poskytuje lepší možnosti pro logování chyb a jejich následnou analýzu.
- Specifické zpracování: Můžete definovat konkrétní akce pro různé typy výjimek.
Nevýhody:
- Složitost: Je složitější a vyžaduje více kódu než použití
@
. - Výkon: Může být náročnější na výkon v porovnání s
@
.
Kdy použít @
vs try-catch
- Použití
@
: Je vhodné pro jednoduché potlačení chyb, které nepovažujete za kritické, a kde víte, že potlačení chyby nezpůsobí větší problémy. - Použití
try-catch
: Je lepší pro robustní aplikace, kde je důležité mít přesnou kontrolu nad chybami a jejich zpracováním. Doporučuje se použíttry-catch
, pokud chcete zachytit specifické výjimky a reagovat na ně.
To je všechno k dnešnímu záznamu. Tento přístup mi pomohl zlepšit spolehlivost mého kódu a snížit množství chyb při zpracování obrázků. Pokud máte podobný problém, doufám, že vám tento příspěvek pomůže.
Napsat komentář