O víkendu probíhá v Praze na Karlově náměstí 13 konference Installfest 2026. Na programu je celá řada zajímavých přednášek a workshopů. Vstup na konferenci je zcela zdarma, bez nutnosti registrace. Přednášky lze sledovat i online na YouTube.
Mozilla a společnost Mila oznámily strategické partnerství za účelem rozvoje open source a suverénní AI. Cílem je ukázat, že open source AI může konkurovat uzavřeným systémům. Obě organizace chtějí posílit technologickou suverenitu a snížit závislost na hrstce velkých technologických firem.
Adam Rice předvedl, že pomocí DNS lze distribuovat a spustit kompletní hru DOOM. Rozdělil WAD soubory a binárky do téměř 2000 DNS záznamů v Cloudflare zóně (jeden TXT záznam v DNS může nést okolo 2000 znaků textu). Ty pak stáhl PowerShellem, dekomprimoval a spustil přímo v paměti počítače bez nutnosti zápisu na disk, což prakticky dokazuje, že DNS může sloužit jako distribuované úložiště dat a možný kanál pro načítání kódu. Repozitář projektu je na GitHubu.
Dnes a zítra probíhají Arduino Days 2026. Na programu je řada zajímavých přednášek. Sledovat je lze od 17:00 na YouTube. Zúčastnit se lze i lokálních akcí. Dnes v Poličce v městské knihovně a zítra v Praze na Matfyzu.
Byla vydána beta verze Ubuntu 26.04 LTS s kódovým názvem Resolute Raccoon. Přehled novinek v poznámkách k vydání. Dle plánu by Ubuntu 26.04 LTS mělo vyjít 23. dubna 2026.
Byla vydána aktualizována Příručka pro začínající wikipedisty a wikipedistky (pdf).
Ubuntu plánuje v budoucích verzích nahradit tradiční nástroje pro synchronizaci času (chrony, linuxptp a gpsd) novým, v Rustu napsaným ntpd-rs, který nabídne vyšší bezpečnost a stabilitu.
Byla vydána nová verze 7.6 živé linuxové distribuce Tails (The Amnesic Incognito Live System), jež klade důraz na ochranu soukromí uživatelů a anonymitu. Správce hesel KeePassXC byl nahrazen správcem hesel GNOME Secrets. Bitcoinová peněženka Electrum byla povýšena na verzi 4.7.0. Tor Browser byl povýšen na verzi 15.0.8. Další novinky v příslušném seznamu.
Chris Down v obsáhlém článku „vyvrací mýty o zswap a zram“, vysvětluje, co vlastně dělají a jaké jsou mezi nimi rozdíly. Doporučuje vyhýbat se zram na serveru a bez OOM.
Porota v Los Angeles shledala firmy Google a Meta odpovědnými v přelomovém soudním sporu, který se týká závislosti na sociálních sítích; firmy musí zaplatit odškodné tři miliony dolarů (63,4 milionu Kč). Společnosti, které s verdiktem nesouhlasí, čelily obvinění, že své sociální sítě a platformy záměrně navrhly tak, aby si na nich děti vypěstovaly závislost. Porota došla k závěru, že technologické společnosti při navrhování a
… více »
if($a) {
$where='t1=\''.mysql_real_escape_string($_POST[a]).'\' and';
}
if($b) {
$where='t2=\''.mysql_real_escape_string($_POST[b]).'\' and';
}
if($c) {
$where='t3=\''.mysql_real_escape_string($_POST[c]).'\' and';
}
$query='SELECT * FROM table where ('.$where.' t4=\''.mysql_real_escape_string($_POST[d]).'\')';
jasne, ze tento priklad je ilustracny a v realnom kode generujem select tak o cca 300 riadkov z roznych premennych, pomocou roznych podmienok s roznymi joinami, subselectami a podobnymi hovadinami, proste salenota. Teraz to nie je problem, lebo je jasne co je sql parameter, co pouzivatelsky vstup a pod. Ale pri pdo som z toho jelen.
Dikes a zdar: janci
if($a) {
$where='t1= :a';
$args[':a'] = $_POST['a'];
}
...
$args[':d'] = $_POST['d'];
$query="SELECT * FROM table where $where AND t4= :d";
...
$sth = $dbh->prepare($query);
$sth->execute($args);
?>
Jinak v kodu nahoře nedáváš řetězce do uvozovek. Sice to projde jen s varováním, ale je to čuňačinka
<?php
$where = array();
if ($a) {
$where[] = "t1=?";
}
if ($b) {
$where[] = "t2=?";
}
if ($c) {
$where[] = "t3=?";
}
$where[] = "t4=?";
$query='SELECT * FROM table where ' . implode(' and ', $where);
Pokud to však máš skutečně na 300 řádcích, asi není vše v pořádku a bylo by vhodné se nad tím zamyslet. Kdysi jsem něco takového vyrobil, ale tvé zadání je tak podivné, že na to nepasuje. Bylo to dokonce ještě o něco kratší.
<?php
$filtr = array(
'jmeno' => 'Adam',
'boty' => '42',
'datum' => '2014/10/03',
);
$query = 'SELECT * FROM table WHERE ' . implode(' AND ',
array_map(function($field) {
return $field . "=?";
},
array_keys($filtr)));
$select = $db->prepare($query);
$select->execute(array_values($filtr));
Samozřejmě není velký problém použít pojmenované placeholdery, ale to si snad už janci dodělá za domácí úkol.
$q = $flupdo->select('*')->from('table');
if ($a) {
$q->where('t1 = ?', $a);
}
if ($b) {
$q->where('t2 = ?', $b);
}
$result = $q->execute();
$filtr.
$filtr = array(
'jmeno' => 'Adam',
'boty' => '42',
'datum' => '2014/10/03',
);
To tvoje:
$query = 'SELECT * FROM table WHERE ' . implode(' AND ',
array_map(function($field) {
return $field . "=?";
},
array_keys($filtr)));
$select = $db->prepare($query);
$select->execute(array_values($filtr));
… a totéž s použitím query builderu:
$q = $flupdo->select('*')->from('table');
foreach($filtr as $k => $v) {
$q->where("$k = ?", $v);
}
$q->execute();
A výsledný dotaz přesně jak byl vygenerován:
SELECT *
FROM table
WHERE (jmeno = ?)
AND (boty = ?)
AND (datum = ?)
Porovnej čitelnost těch dvou kousků kódu, snadnost úprav a možnosti výskytu chyb. A ten rozdíl přenásob několika desítkami SQL dotazů v trochu větší aplikaci.
Ta knihovna není žádný bumbrlíček. Dělá totéž, jen si poradí se všemi konstrukcemi.
INSERT INTO ... SELECT ...
Ty sis tu knihovnu napsal sám podle svých potřeb, proto ti vyhovuje víc.
->where('a = ? OR b = ?', $a, $b). Subselecty i insert-select by to umět mělo, nebo alespoň to bylo plánováno. A jak tak zrovna koukám, druhá možnost vypadá pravděpodobněji
Psaní SQL ta knihovna nemá nahrazovat, má ho zjednodušovat. Pokud ji použiješ, můžeš se rozhodnout, zda ten kousek budeš psát tak nebo ho necháš poskládat. Díky tomu, že se to nesnaží být nijak chytré a předávaným fragmentům SQL se to nesnaží rozumět, je chování velmi předvídatelné a snadno pochopitelné. Prostě to veme fragmenty SQL dotazu a poskládá je ve správném pořadí: $q
->select('COUNT(*) AS pocet')
->orderBy('y ASC, z DESC')
->groupBy('x')
->having('pocet < 10')
->where('(SELECT ...) > ?', $c)
Míchej to dle libosti, manuál by neměl být potřeba (úvodní tutoriál se napsat ještě chystám).
Btw, místo foreach tam máš array_map, array_keys a array_values, což mi nepřijde jako moc velké zjednodušení.Mohl bych použít i ten foreach, ale funkce array_* jsem si tak nějak zamiloval. Možná i proto, že se mi jeví o chlup rychlejší. Také mi nic nebrání část zmíněného kódu uzavřít do funkce nebo z toho udělat třídu, což obvykle dělám. Volání pak vypadá například takto:
$filtr = array(
'jmeno' => 'Adam',
'boty' => '42',
'datum' => '2014/10/03',
);
$vysledek = $model->select(new User($filtr));
Nejčastěji však to volání vypadá poněkud jednodušeji:
$vysledek = $model->select(new User($_POST));Konstruktor třídy User si pak funkcí array_intersect_key() vybere jen takové parametry, které se mu líbí. Pokud bych takových proměnlivých SQL dotazů psal víc, tak bych možná nad podobnou knihovnou uvažoval, ale mám jich velmi málo. Fixní SQL dotazy v mých aplikacích převažují. Jak vidíš, tak mám volání takových dotazů ještě jednodušší.
$_GET, pro modifikující operace zase $_POST.
$pdo->query('SELECT ... WHERE ... = ?', [ ... ]) bude $flupdo->select('...')->where('... = ?', ...).
Když bude filtrů pár, přínos oproti poli s WHERE podmínkami nebude velký, ale když pak chceš přidávat pro některé podmínky joiny, začnou se dít věci. To pak potřebuješ těch polí několik a udržet správně spárované parametry není vůbec jednoduché. Kdežto takový query builder už tohle všechno má v sobě a napíšeš jen:
if (isset($_POST['x'])) {
$q->where('t1.x = ?', $_POST['x']);
$q->leftJoin('table2 as t2 ON t2.x = t1.x AND t2.y = ?', $y);
}
Zrovna nedávno jsem sestavoval filtrovací nástroj právě pro takovéto případy. Už mne nebavilo pořád psát ty samé skoro stejné dotazy pro jen trochu jiné entity. Je to taková pěkná bestie, kde je 130 řádků dokumentace na 150 řádků kódu. Bez query builderu by to bylo celkem utrpení.
Tiskni
Sdílej: