3D software Blender byl vydán ve verzi 5.2 s prodlouženou podporou. Videopředstavení na YouTube.
SketchForge 3D (GitHub, reddit) je open source 3D editor / CAD běžící ve webovém prohlížeči bez nutnosti účtu nebo cloudového úložiště. Inspirovaný byl Tinkercadem. Doporučena je lokální instalace.
Byla vydána nová verze 11.9 webového prohlížeče Midori (Wikipedie, GitHub). S novým centrem ovládání, pokročilejším blokováním reklam, optimalizací výkonu…
Na Crowd Supply běží kampaň na podporu open source čtečky elektronických knih Open Book Touch. Postavena je na ESP32-S3. Má 4,26palcový dotykový e-papírový displej s rozlišením 480×800 pixelů, podsvícení, slot na microSD kartu. Cena je 149 dolarů a poštovné 12 dolarů. Dodání je plánováno na duben 2027.
Na Humble Bundle běží akce Linux: All the Things by O'Reilly a Picos, HATs, and More by Raspberry Pi Press. Elektronické knihy lze koupit se slevou a současně podpořit organizace Code for America a Raspberry Pi Foundation.
FreeCAD (Wikipedie), tj. svobodný multiplatformní parametrický 3D CAD, má nový vtipný a současně užitečný doplněk Banana For Scale (GitHub). Aktuálně umožňuje do výkresu vložit banán nebo plechovku pro porovnání a určení měřítka.
Blender Studio nedávno oznámilo plán vytvořit svůj první otevřený (open source) celovečerní film. Film by se měl jmenovat Overgrown (YouTube). Film vznikne, pokud se zajistí financování. Prvním krokem je získat 7 000 předplatitelů Blender Studia. Cena je od 11,50 eur měsíčně. Aktuálně počet předplatitelů je 5 289. Předplatné pokryje 20 % nákladů. Zbytek, 80 % nákladů, má být financován externími producenty nebo distributory.
Byl vydán Debian 13.6, tj. šestá opravná verze Debianu 13 s kódovým názvem Trixie a Debian 12.15, tj. poslední patnáctá opravná verze Debianu 12 s kódovým názvem Bookworm, k dispozici je LTS. Řešeny jsou především bezpečnostní problémy, ale také několik vážných chyb. Instalační média Debianu 13 a Debianu 12 lze samozřejmě nadále k instalaci používat. Po instalaci stačí systém aktualizovat.
V jádře Linux byla nalezena a v upstreamu již byla opravena kritická zranitelnost GhostLock aneb CVE-2026-43499. Lokálnímu uživateli umožňuje získat práva roota a také obejít kontejnerovou izolaci. Zranitelnost existovala v Linuxu 15 let, tj. od roku 2011, od Linuxu verze 2.6.39.
Evropská komise předběžně shledala, že návykový design aplikací Instagram a Facebook od americké společnosti Meta porušuje unijní nařízení o digitálních službách (DSA). Návykový design zahrnuje například takzvané nekonečné posouvání, automatické přehrávání videí, tzv. push notifikace, kdy aplikace uživatele vybízí k návratu do jejího prostředí, či vysoce personalizovaný algoritmus, který rychle pozná, co uživatele baví a snaží
… 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: