Byl představen skládací telefon Commodore Callback 8020. Ani hloupý, ani chytrý. Pro fanoušky Commodore a digitálního minimalismu. Bez webového prohlížeče a sociálních sítí. S předinstalovaným WhatsAppem. S operačním systémem Sailfish OS.
V OpenBSD byla objevena 27 let stará chyba v ppp pomocí níž lze vzdáleně obejít autentifikaci. Chyba byla nahlášena 12.6. a 14.6. byla opravena. Bližší info v článku A 27-Year-Old Authentication Bypass in OpenBSD's PPP Stack.
Odpověď Evropské komise (pdf) k evropské občanské iniciativě Stop Destroying Videogames, jež je součástí hnutí Stop Killing Games: "Komise se domnívá, že v této fázi nemůže navrhnout právní povinnost zachovat hratelnost videoher poté, co přestaly být poskytovány komerčně. Důvodem jsou i stávající práva duševního vlastnictví. Podle autorského práva EU mají nositelé práv výlučná práva ke svým výtvorům. Kromě autorských práv mohou být
… více »Byl vydán Mozilla Firefox 152.0. Přehled novinek v poznámkách k vydání a poznámkách k vydání pro vývojáře. Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 152 bude brzy k dispozici také na Flathubu a Snapcraftu.
Desktopové prostředí KDE Plasma bylo vydáno ve verzi 6.7 (Mastodon). Přehled novinek i s videi a se snímky obrazovek v oficiálním oznámení. Podrobný přehled v seznamu změn.
Hříčka xsnow, která na ploše spustí sněžení, je protestware. Pokud jste v Rusku (LANG=ru), zobrazuje ukrajinské vlajky.
UBports, nadace a komunita kolem Ubuntu pro telefony a tablety Ubuntu Touch, vydala beta verzi Ubuntu Touch 24.04-2.0. Nová verze již počítá s výřezy pro fotoaparát (notch) a zaoblenými rohy displeje. Webový prohlížeče Morph přešel z Chromia 87 na Chromium 134. Do shellu Lomiri byl přidán editor snímků obrazovky.
V Praze probíhá Flock 2026, tj. konference pro přispěvatele a příznivce Fedory. Přednášky lze sledovat také na YouTube.
Node-RED (Wikipedie, GitHub), webová aplikace postavená na Node.js pro vizuální programování a propojování hardwarových zařízení, API a online služeb, byl vydán ve verzi 5.0. Přehled novinek v příspěvku na blogu.
Byla vydána nová verze 3.27.0 FreeRDP, tj. svobodné implementace protokolu RDP (Remote Desktop Protocol). Opraveno bylo 5 zranitelností.
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: