Od soboty do úterý probíhá v Hamburku konference 39C3 (Chaos Communication Congress) věnovaná také počítačové bezpečnosti nebo hardwaru. Program (jiná verze) slibuje řadu zajímavých přednášek. Streamy a záznamy budou k dispozici na media.ccc.de.
Byl představen nový Xserver Phoenix, kompletně od nuly vyvíjený v programovacím jazyce Zig. Projekt Phoenix si klade za cíl být moderní alternativou k X.Org serveru.
XLibre Xserver byl 21. prosince vydán ve verzi 25.1.0, 'winter solstice release'. Od založení tohoto forku X.Org serveru se jedná o vůbec první novou minor verzi (inkrementovalo se to druhé číslo v číselném kódu verze).
Wayback byl vydán ve verzi 0.3. Wayback je "tak akorát Waylandu, aby fungoval Xwayland". Jedná se o kompatibilní vrstvu umožňující běh plnohodnotných X11 desktopových prostředí s využitím komponent z Waylandu. Cílem je nakonec nahradit klasický server X.Org, a tím snížit zátěž údržby aplikací X11.
Byla vydána verze 4.0.0 programovacího jazyka Ruby (Wikipedie). S Ruby Box a ZJIT. Ruby lze vyzkoušet na webové stránce TryRuby. U příležitosti 30. narozenin, první veřejná verze Ruby 0.95 byla oznámena 21. prosince 1995, proběhl redesign webových stránek.
Všem čtenářkám a čtenářům AbcLinuxu krásné Vánoce.
Byla vydána nová verze 7.0 linuxové distribuce Parrot OS (Wikipedie). S kódovým názvem Echo. Jedná se o linuxovou distribuci založenou na Debianu a zaměřenou na penetrační testování, digitální forenzní analýzu, reverzní inženýrství, hacking, anonymitu nebo kryptografii. Přehled novinek v příspěvku na blogu.
Vývojáři postmarketOS vydali verzi 25.12 tohoto před osmi lety představeného operačního systému pro chytré telefony vycházejícího z optimalizovaného a nakonfigurovaného Alpine Linuxu s vlastními balíčky. Přehled novinek v příspěvku na blogu. Na výběr jsou 4 uživatelská rozhraní: GNOME Shell on Mobile, KDE Plasma Mobile, Phosh a Sxmo.
Byla vydána nová verze 0.41.0 multimediálního přehrávače mpv (Wikipedie) vycházejícího z přehrávačů MPlayer a mplayer2. Přehled novinek, změn a oprav na GitHubu. Požadován je FFmpeg 6.1 nebo novější a také libplacebo 6.338.2 nebo novější.
Byla vydána nová verze 5.5 (novinky) skriptovacího jazyka Lua (Wikipedie). Po pěti a půl letech od vydání verze 5.4.
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: