Přeskočit na hlavní obsah

URL, kterou vyhledávání nenašlo: kde se schovávalo pět let staré rozhodnutí

| Alaudae.JP

Pokaždé, když jsem přegeneroval mapu stránek, vrátila se s ní adresa, která už neexistuje.

Trvalo to nějakou dobu. Spustím crawler a je to tam zase: cesta ke stránce produktu, kterou jsem před čtyřmi lety zrušil, pokaždé úhledně nalezená.

Vypadala takhle: /materia/fortuna15/... , stará struktura. Žádná taková stránka na webu dnes není.


Nejdřív jsem hledal na obvyklých místech

Podezření padlo na text článků. Někde jsem starý odkaz vepsal do článku a zapomněl na něj. Taková byla teorie.

Nic tam nebylo.

Pak menu, moduly, nastavení šablony. Všude prázdno.

Jako poslední možnost jsem tedy prohledal celou databázi. phpMyAdmin umí hledat řetězec napříč všemi tabulkami najednou. Když se to neukáže tam, aspoň to není v databázi.

Nula výsledků.

A byl jsem v koncích. Není to v databázi. Není to v článku ani v menu. A crawler tu adresu přesto pokaždé najde.

Někde být musela. Já ji jen svým způsobem hledání nenacházel.


Příčinou bylo jedno lomítko

Odpověď rovnou na začátek.

Ta hodnota byla v databázi uložená jako JSON. A v JSONu se lomítko někdy zapisuje se zpětným lomítkem takto: \/

Řetězec, který v databázi doopravdy ležel, tedy vypadal takhle:

    materia\/fortuna15\/

Do vyhledávacího pole jsem psal materia/fortuna15 . Bez zpětných lomítek. Takže se to neshodovalo.

Bylo to tam. Jen se to při hledání neukázalo.

Tohle není specialita Joomly. Kterýkoli CMS, který ukládá hodnoty vlastních polí nebo nastavení pluginů jako JSON, se může chovat stejně. To, že něco nenajdete hledáním v databázi, neznamená, že to tam není.


Viníkem jsem byl já v roce 2021

Změnil jsem postup, stáhl si dump databáze a prošel ho ručně.

Zdrojem byl jediný článek publikovaný v březnu 2021. Abych do stránek jednotlivých materiálů dostal seznam, vytvořil jsem tehdy vlastní pole typu subform.

Obsahovalo odkazy pro padesát tři barev, a to ve třech šířkách: 6 mm, 15 mm a 21 mm. Tři pole, sto padesát devět záznamů.

A co hůř, tytéž záznamy existovaly ještě jednou v překladové tabulce pro anglickou verzi webu. Dalších sto padesát devět. Celkem tři sta osmnáct odkazů, všechny stále mířící do struktury staré pět let.

Web jsem přestavoval víckrát. Změnil jsem strukturu adres. Návštěvník vidí současnou podobu.
A ty absolutní cesty zapsané uvnitř pole to všechno přežily nedotčené.

Na obrazovce se nikde neobjeví, takže nebylo jak si jich všimnout. Jediný, kdo si jich všiml, byl crawler.


Před samotnou náhradou číhala past

Oprava sama o sobě je jednoduchá. Vyměnit starou cestu za novou.

Jenže v tu chvíli jsem si všiml něčeho nebezpečného.

V anglické překladové tabulce byl řádek, v jehož textu se vyskytovalo obyčejné anglické slovo material. Kdybych spustil hromadnou náhradu jen nad řetězcem materia, chytila by i tohle slovo a rozbila ho.

Čím kratší řetězec zadáte, tím je hromadná náhrada nebezpečnější. Tady bylo správné zadat celou cestu.

    materia\/fortuna15\/  se změní na  perla\/15mm-width\/

Nahradit to celé, i s escapovanými lomítky. Pak se anglického slova material nic nedotkne.

Práci jsem rozdělil do tří kroků. Před náhradou spočítat řádky pomocí SELECT. Spustit UPDATE. Pak dalším SELECT ověřit, že staré cesty klesly na nulu a nových je tolik, kolik má být.

Výsledek: nula starých cest a padesát tři nových v každém ze tří polí. Anglická strana seděla stejně a slovo material, které to málem odneslo, zůstalo neporušené.


Když to čtu jako otázku návrhu

Vypadá to jako historka o údržbě, ale já to považuju za historku o návrhu.

V roce 2021 jsem odkazy zapsal přímo do pole, protože to tehdy byla nejrychlejší cesta. A fungovalo to.

Potíž je v tom, že ta hodnota se pak propadla někam, kam není vidět. Text článku máte přímo v editoru. Položka menu je v seznamu v administraci. Ale sto padesát devět odkazů pohřbených v subformu už vám nikdy nepadne do oka, pokud každý z nich neotevřete a nezkontrolujete.

Kde odkaz uchováváte, není otázka vzhledu. Je to otázka, jestli to půjde později opravit.

Dnes bych místo toho odkazoval na ID článku, nebo bych aspoň nechal odkaz relativní, aby změna struktury adres nestrhla odkazy s sebou.

Když web přestavujeme, opravujeme to, co vidíme. Co nevidíme, opravit nemůžeme.
Takže otázka, kterou si má člověk klást už při stavbě, zní: bude na tohle za čas ještě vidět?


Praktické shrnutí

  • Když hledání napříč databází nic nevrátí, neznamená to, že tam hodnota není
  • Hodnoty uložené jako JSON mohou mít lomítka escapovaná jako \/
  • Když něco nemůžete najít, je rychlejší stáhnout dump a číst ho přímo
  • Čím kratší řetězec u hromadné náhrady, tím větší riziko. Zadejte něco dlouhého a jednoznačného, třeba celou cestu
  • Před náhradou i po ní pusťte SELECT a zkontrolujte počty

Stálo mě to čas, hledat něco, co se odmítalo ukázat, ale jakmile byla příčina jasná, nebylo to vůbec nic. Snad to pomůže někomu, kdo uvázl na stejném místě.