Byla vydána nová verze 255 správce systému a služeb systemd (GitHub, NEWS). Z novinek lze vypíchnout například novou službu systemd-bsod.service.
Google představil Gemini, svůj největší a nejschopnější model umělé inteligence.
openSUSE komunita vybírá nová loga. Jedním z cílů je odlišit se od SUSE. Aktuálně probíhá hlasování o logu openSUSE a čtyř distribucí Tumbleweed, Leap, Slowroll a Kalpa.
Raspberry Pi OS, oficiální operační systém pro Raspberry Pi, byl vydán v nové verzi 2023-12-05. Přehled novinek v příspěvku na blogu a poznámkách k vydání. Nově jej lze používat také s tmavým tématem.
Dnes je to 10 let, co byla vytvořena decentralizovaná kryptoměna Dogecoin. Autoři Billy Markus a Jackson Palmer ji původně zamýšleli jako vtip. Znakem kryptoměny je pes Shiba-Inu známý z internetových memů.
Google Chrome 120 byl prohlášen za stabilní. Nejnovější stabilní verze 120.0.6099.62 přináší řadu oprav a vylepšení (YouTube). Opraveno bylo 10 bezpečnostních chyb. Vylepšeny byly také nástroje pro vývojáře (YouTube).
Byla vydána nová verze 2023.4 linuxové distribuce navržené pro digitální forenzní analýzu a penetrační testování Kali Linux (Wikipedie). Přehled novinek se seznamem nových nástrojů v oficiálním oznámení. Vypíchnout lze podporu Cloud ARM64, Vagrant Hyper-V a Raspberry Pi 5.
Společnosti IBM, Meta a dalších vice než 50 zakládajících členů (bez Microsoftu a OpenAI) vytvořili mezinárodní alianci AI Alliance pro spolupráci na vývoji a rozvoji otevřené, bezpečné a odpovědné umělé inteligence.
Služba pro hlídání uniklých hesel Have I Been Pwned oslavila 10. výročí. Troy Hunt ji spustil 4. prosince 2013 (Twitter).
Programovací jazyk HTML.
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 $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: