<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="cs">
	<title>PHP triky</title>
	<subtitle>Weblog o elegantním programování v PHP pro mírně pokročilé</subtitle>
	<link rel="self" href="https://php.vrana.cz/atom.php"/>
	<!-- <link rel="search" type="application/opensearchdescription+xml" href="https://php.vrana.cz/opensearch.php"/> -->
	<link href="https://php.vrana.cz/"/>
	<id>https://php.vrana.cz/</id>
	<updated>2026-10-19T18:03:44+02:00</updated>
	<author><name>Jakub Vrána</name><uri>https://www.vrana.cz/</uri></author>
	<icon>https://php.vrana.cz/favicon.ico</icon>
	<logo>https://php.vrana.cz/logo.gif</logo>
	<rights>(c) 2005 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í.</rights>
	<link rel="license" type="application/rdf+xml" href="https://creativecommons.org/licenses/by/2.5/rdf"/>
	
<entry>
	<title>NotORM 2.0</title>
	<link href='https://php.vrana.cz/notorm-2-0.php'/>
	<id>https://php.vrana.cz/:811</id>
	<updated>2026-10-19T18:03:44+02:00</updated>
	<published>2026-10-19T00:00:00+02:00</published>
	<category term='4' label="Seznámení s oblastí"/>
	<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>

<p><img src="https://www.notorm.com/static/classes.webp" width="380" height="308" alt="schéma tříd" class="right"> Řekl jsem si, že trochu opráším <a href="https://www.notorm.com/"><b>NotORM</b></a> a nakonec z toho bylo <abbr title="40 na notorm.com" lang="en">170</abbr> commitů. V API se přitom nic zásadního nezměnilo, většina je jen údržba:</p>
<ul>
<li>Minimální podporovaná verze PHP je 8.0. Zvažoval jsem i podporu 7.4, ale vyžadovalo by to použití ošklivých <code class="language-php">#[\ReturnTypeWillChange]</code>.</li>
<li>Třídy jsem přesunul do jmenného prostoru <code>NotORM</code>.</li>
<li>Deklaroval jsem typy a zapnul <code class="language-php">declare(strict_types=1)</code>.</li>
<li>Přejmenoval jsem metody s podtržítkem, např. na <code class="language-php_fun">insertUpdate()</code>.</li>
<li><code class="language-php_fun">fetch()</code> místo <code class="language-php">false</code> vrací <code class="language-php">null</code>. K této zpětně nekompatibilní změně jsem se odhodlal kvůli jednoduchému zápisu <code class="language-php">$app->fetch('title') ?? 'No such app'</code>.</li>
<li>Zapnul jsem verzování keše, takže stará keš nerozbije aktualizované NotORM.</li>
<li>Vytvořil jsem <a href="https://github.com/vrana/notorm/tree/main/upgrade" target="_blank">skript</a> pro převod aplikace ze staré verze.</li>
<li>Zapnul jsem <a href="https://github.com/PHPCSStandards/PHP_CodeSniffer/" target="_blank">PHP_CS</a> (+ <a href="https://github.com/slevomat/coding-standard" target="_blank">Slevomat</a>) a <a href="https://phpstan.org/" target="_blank">PHPStan</a> (+ <a href="https://github.com/phpstan/phpstan-strict-rules" target="_blank">strict</a>).</li>
<li>Na GitHubu se spouští kontroly i testy.</li>
<li>Git větev jsem přejmenoval na <em lang="en">main</em>.</li>
<li>Přidal jsem Git tagy a to i zpětně.</li>
</ul>

<h3>Nové funkce</h3>
<ul>
<li><code class="language-php_fun">fetchPairs()</code> umí vracet vícerozměrné pole.</li>
<li>Podpora vícesloupcových primárních klíčů.</li>
<li>Podpora binárních dat.</li>
<li><a href="https://github.com/vrana/notorm/tree/main/NotORM/Structure/Discovery" target="_blank"><code>NotORM\Structure\Discovery</code></a> podporuje kromě MySQL i SQLite, PostgreSQL, MS SQL a Oracle.</li>
</ul>

<p>Vyřešil jsem všechny otevřené <a href="https://github.com/vrana/notorm/issues" target="_blank"><em lang="en">issues</em></a>, <a href="https://github.com/vrana/notorm/pulls" target="_blank"><em>pull requesty</em></a> a připomínky na <a href="https://groups.google.com/g/notorm" target="_blank">fóru</a>, které jsem zavřel. Nepříjemná byla chyba schovávající řádky, pokud dotaz vracel stejnou hodnotu primárního klíče víckrát (<a href="https://github.com/vrana/notorm/issues/80" target="_blank">#80</a>) – ty se nyní vrací bez ID v klíčích.</p>
<p>Zdvojnásobil jsem počet testů na 76. Ty nyní procházejí ve všech pěti podporovaných databázových systémech. Umožnil jsem měřit <em lang="en">coverage</em>, na základě čehož jsem přidal několik testů – ty našly skutečné chyby.</p>
<p>Rozhodl jsem se nepokračovat v experimentu <em lang="en"><a href="notorm-2.php#notorm-2" class="inner">then</a></em>, který by umožnil vykonávat více dotazů při jednom <em>round-tripu</em>. <a href="https://claude.ai/" target="_blank">Claude</a> mi na to řekl, že jsem předběhl dobu.</p>

</div></content>
</entry>
<entry>
	<title>Adminer 6.1.1 – zvýrazňování výsledků hledání</title>
	<link href='https://php.vrana.cz/adminer-6-1-1.php'/>
	<id>https://php.vrana.cz/:810</id>
	<updated>2026-10-12T23:37:27+02:00</updated>
	<published>2026-09-25T00:00:00+02:00</published>
	<category term='9' label="Adminer"/>
	<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>

<p><a href="https://www.adminer.org/"><b>Adminer</b></a> 6.1.1 přináší skoro <a href="https://github.com/vrana/adminer/releases/tag/v6.1.1">50 změn</a>, nejvýraznější je zvýrazňování nalezeného textu. Nechtěl jsem, aby při hledání <code>group = 6</code> byla šestka vysvícená ve všech řádcích, proto se zvýrazňuje jen při hledání podřetězce nebo ve všech sloupcích.</p>
<p><img src="data/adminer-highlight.webp" width="1283" height="111" alt="screenshot"></p>
<p>Další zajímavé změny:</p>
<ol>
<li>Při editaci <abbr title="JavaScript Object Notation" lang="en">JSON</abbr> se zaokrouhlovala velká čísla. Funkce <code class="language-php">json_decode</code> má sice volbu <a href="https://www.php.net/manual/en/json.constants.php#constant.json-bigint-as-string"><kbd>JSON_BIGINT_AS_STRING</kbd></a>, ta je ale zase převede na řetězce. Při řešení jsem se dozvěděl o <a href="https://www.regular-expressions.info/mark.html"><code>(*SKIP)</code> a <code>(*FAIL)</code></a> v regulárech: <code class="language-php">preg_replace('~"(?:[^"\\\\]|\\\\.)*+"(*SKIP)(*FAIL)|-?\d[-+.\deE]*+~', '"\\\\u0001$0"', $json)</code> při značkování čísel přeskočí řetězce a je to rychlejší než <code class="language-php">preg_replace_callback</code>.</li>
<li>Při scrollování široké tabulky zůstane vlevo viset její editační odkaz. Obdobně název tabulky v přehledu databáze.</li>
<li>Odkazy do dokumentace byly rozeseté na náhodných místech v podobě otazníků, které se ale používají třeba i pro chybějící data. Změnil jsem je na ikonu 📖, kterou jsem přesunul do hlavičky.</li>
<li>V seznamu databází a schémat strašila systémová schémata. Přesunul jsem je do samostatné skupiny.</li>
</ol>
<h3>Ovladače</h3>
<ul>
<li>Triggery v <b>PostgreSQL</b> můžou jen volat funkci. Přidal jsem odkaz pro její editaci.</li>
<li><b>SQLite</b> pomocí <code class="language-sqlite">ATTACH</code> umožňuje vytvářet soubory. Zakázal jsem to metodou <code class="language-php">SQLite3::setAuthorizer</code>.</li>
<li><b>MS SQL</b> jsem rozchodil s extenzí <a href="https://www.php.net/manual/en/class.pdo-dblib.php">Dblib</a> a opravil v ní několik chyb.</li>
<li><b>ClickHouse</b> jsem vyzkoušel na jejich <a href="https://play.clickhouse.com/" target="_blank">pískovišti</a> a opravil několik chyb.</li>
</ul>
<h3>Pluginy</h3>
<ul>
<li><a href="https://www.adminer.org/editor/">Editor</a> odjakživa zobrazuje hodnotu cizího klíče jako první řetězcový sloupec odkazované tabulky. Plugin <b>select-foreign</b> to umožňuje i v Admineru.</li>
<li>Přidal jsem metodu <code>namePattern()</code>, kterou se dá ovlivnit výchozí způsob pojmenování vytvářených objektů. Plugin <b>name-patterns</b> to dovoluje změnit. Výchozí pojmenování <em>triggerů</em> je nově podle všech událostí (např. <code>iu</code> pro <code>INSERT OR UPDATE</code>).</li>
</ul>

</div></content>
</entry>

</feed>
