abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×

dnes 00:22 | Bezpečnostní upozornění

Společnost ZONER informuje o bezpečnostním incidentu, při kterém došlo ke zcizení a zveřejnění části přihlašovacích údajů zákazníků k elektronické poště a webhostingu CZECHIA.COM.

Ladislav Hagara | Komentářů: 0
včera 23:44 | Nová verze

Byla vydána nová stabilní verze 1.13 (1.13.1008.32) webového prohlížeče Vivaldi (Wikipedie). Z novinek vývojáři zdůrazňují možnost zobrazení otevřených i uzavřených listů pomocí ikonky Okno na postranní liště a vylepšené stahování (YouTube). Nejnovější Vivaldi je postaveno na Chromiu 62.0.3202.97.

Ladislav Hagara | Komentářů: 8
včera 20:55 | Nová verze

Byla vydána verze 2017.3 dnes již průběžně aktualizované linuxové distribuce navržené pro digitální forenzní analýzu a penetrační testování Kali Linux. Aktualizovat systém lze pomocí příkazů "apt update; apt dist-upgrade; reboot". Z novinek lze zmínit 4 nové nástroje: InSpy, CherryTree, Sublist3r a OSRFramework.

Ladislav Hagara | Komentářů: 0
včera 01:55 | Bezpečnostní upozornění

Společnost Uber potvrdila bezpečnostní incident a únik dat v roce 2016. Unikly údaje o 57 milionech cestujících (jména, emailové adresy a čísla mobilních telefonů) a 600 tisících řidičích (navíc čísla řidičských průkazů).

Ladislav Hagara | Komentářů: 1
21.11. 23:44 | Humor

Co vypíše příkaz man půl hodiny po půlnoci? Text "gimme gimme gimme". Jedná se o virtuální velikonoční vajíčko připomínající skupinu ABBA a její hit Gimme! Gimme! Gimme! (A Man After Midnight). Problém nastane, pokud gimme gimme gimme nabourá automatizované testování softwaru. To se pak příkaz man musí opravit [Bug 1515352] [reddit].

Ladislav Hagara | Komentářů: 10
21.11. 18:11 | Zajímavý článek

Mozilla.cz informuje, že Firefox na Fedoře podporuje Client Side Decorations. Firefox na Linuxu se vykresluje včetně standardního záhlaví okna, které je v případě webového prohlížeče většinou nadbytečné a ubírá drahocenné vertikální místo na obrazovce. Verze distribuovaná uživatelům Fedory však nyní obsahuje experimentální podporu pro takzvané Client Side Decorations, které umožňují vykreslování „oušek“ panelů do záhlaví okna.

Ladislav Hagara | Komentářů: 12
21.11. 05:00 | Bezpečnostní upozornění

Maxim Goryachy a Mark Ermolov ze společnosti Positive Technologies budou mít v prosinci na konferenci Black Hat Europe 2017 přednášku s názvem "Jak se nabourat do vypnutého počítače, a nebo jak v Intel Management Engine spustit vlastní nepodepsaný kód". O nalezeném bezpečnostním problému informovali společnost Intel. Ta bezpečnostní problém INTEL-SA-00086 v Intel Management Engine (ME), Intel Server Platform Services (SPS) a Intel

… více »
Ladislav Hagara | Komentářů: 41
21.11. 01:33 | Zajímavý projekt

Na Humble Bundle byla spuštěna akce Humble Book Bundle: Java. Za 1 dolar a více lze koupit 5 elektronických knih, za 8 dolarů a více 10 elektronických knih a za 15 dolarů a více 15 elektronických knih věnovaných programovacímu jazyku Java od nakladatelství O'Reilly. Peníze lze libovolně rozdělit mezi nakladatelství O'Reilly, neziskovou organizaci Code for America a Humble Bundle.

Ladislav Hagara | Komentářů: 0
21.11. 00:11 | Zajímavý projekt

Článek na OMG! Ubuntu! představuje rodinu písma IBM Plex. Jedná se o open source písmo (GitHub) navržené a uvolněné společností IBM (YouTube, Carbon Design System). Ukázka na Font Squirrel.

Ladislav Hagara | Komentářů: 13
20.11. 23:22 | Komunita

Na Humble Bundle lze získat počítačovou hru Brütal Legend (Wikipedie, YouTube) běžící také v Linuxu zdarma. Speciální akce končí ve středu v 19:00.

Ladislav Hagara | Komentářů: 0
Jak se vás potenciálně dotkne trend odstraňování analogového audio konektoru typu 3,5mm jack z „chytrých telefonů“?
 (9%)
 (1%)
 (1%)
 (1%)
 (75%)
 (14%)
Celkem 752 hlasů
 Komentářů: 37, poslední 21.11. 15:21
    Rozcestník

    Dotaz: php pdo prepare a generovany select

    3.10.2014 16:18 janci
    php pdo prepare a generovany select
    Přečteno: 305×
    Nazdar bazar.

    Ucim sa pdo a riesim problem ako urobit prepare pri zlozenom selecte. Teraz to mam zrobene tak
    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

    Odpovědi

    3.10.2014 16:38 logik
    Rozbalit Rozbalit vše Re: php pdo prepare a generovany select
    Normálně skládej select s "pojmenovanejma placeholdrama" a vedle toho pole s parametrama. Např.:

    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 :-)
    3.10.2014 16:48 Kit | skóre: 39 | Brno
    Rozbalit Rozbalit vše Re: php pdo prepare a generovany select
    Sice přesně netuším, co to má dělat, ale mohlo by to vypadat třeba nějak takhle:
    <?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ší.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    3.10.2014 17:04 logik
    Rozbalit Rozbalit vše Re: php pdo prepare a generovany select
    Rozhodně bych nepoužíval při spojování selectu nepojmenované parametry (placeholdery). Zadělává to na průšvih, že to pak pospojuje jinak a udělá z databáze guláš (teda je to select, takže tady to neni tak citlivý, ale princip je princip).

    Ale jinak Ok. :-)
    3.10.2014 17:17 Kit | skóre: 39 | Brno
    Rozbalit Rozbalit vše Re: php pdo prepare a generovany select
    Vypadalo to nějak takhle:
    <?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.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    3.10.2014 16:57 Tomáš
    Rozbalit Rozbalit vše Re: php pdo prepare a generovany select
    Nebylo by jednodušší tu konstrukci supersložitého dotazu vyřešit uvnitř uložené procedury?

    A v tom perlu nebo co to vlastně je, zavolat jen tu proceduru s příslušnou sadou parametrů
    3.10.2014 17:01 Kit | skóre: 39 | Brno
    Rozbalit Rozbalit vše Re: php pdo prepare a generovany select
    To asi nepůjde, protože počet parametrů zřejmě není konstantní.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    3.10.2014 19:05 Tomáš
    Rozbalit Rozbalit vše Re: php pdo prepare a generovany select
    Potom by jistě šlo parametry uložit do pomocné tabulky prostým insertem a uložená procedura by si to vyčetla.
    3.10.2014 19:20 Kit | skóre: 39 | Brno
    Rozbalit Rozbalit vše Re: php pdo prepare a generovany select
    To by určitě šlo, jen by to asi byl trochu overkill. To už bych raději ty atributy serializoval. Tím se obloukem opět vracím k SQL :-)
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    Josef Kufner avatar 7.10.2014 22:57 Josef Kufner | skóre: 67
    Rozbalit Rozbalit vše Re: php pdo prepare a generovany select
    To, co hledáš se jmenuje query builder. Existuje jich povícero, Google ti jich pár poradí, ale většinou jsou moc chytré. Například takové FluentPDO si generuje joiny, když se překlepneš v názvu tabulky. Takže jsem se nechal inspirovat u FluentPDO, Dibi a pár dalších a napsal Flupdo. Je dostatečně hloupý, snaží se neházet klacky pod nohy a měl by mít 100% pokrytou syntax MySQL.

    Použití takového query buileru s fluent API vypadá nějak takto:
    $q = $flupdo->select('*')->from('table');
    if ($a) {
      $q->where('t1 = ?', $a);
    }
    if ($b) {
      $q->where('t2 = ?', $b);
    }
    $result = $q->execute();
    
    Hello world ! Segmentation fault (core dumped)
    7.10.2014 23:22 Kit | skóre: 39 | Brno
    Rozbalit Rozbalit vše Re: php pdo prepare a generovany select
    Že bych si z toho udělal plugin do editoru jako off-line generátor SQL dotazů? :-)
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    Josef Kufner avatar 7.10.2014 23:33 Josef Kufner | skóre: 67
    Rozbalit Rozbalit vše Re: php pdo prepare a generovany select
    Proč off-line generátor? Tyhle věci jsou k tomu, aby SQL generovaly za běhu.
    Hello world ! Segmentation fault (core dumped)
    8.10.2014 07:04 Kit | skóre: 39 | Brno
    Rozbalit Rozbalit vše Re: php pdo prepare a generovany select
    Slepování SQL dotazů dělám tak výjimečně, že se mi vyplatí použít miniaturní skript "na míru". Viz výše.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    Josef Kufner avatar 8.10.2014 09:54 Josef Kufner | skóre: 67
    Rozbalit Rozbalit vše Re: php pdo prepare a generovany select
    Já naopak došel k tomu, že používám téměř výhradně query builder, neboť je s ním snažší umisťovat parametry (otazník a dosazovaná proměnná jsou velmi blízko v kódu) a pokud se později dotaz rozroste (byť jen o prosté podmíněné přidávání podmínky), není potřeba ho pro query builder přepisovat.
    Hello world ! Segmentation fault (core dumped)
    8.10.2014 10:29 Kit | skóre: 39 | Brno
    Rozbalit Rozbalit vše Re: php pdo prepare a generovany select
    Však v tom příspěvku to tak mám na dvanácti řádcích. Knihovnu kvůli tomu nepotřebuji. Pokud přidám podmínku, znamená to jen přidat jeden řádek v seznamu $filtr.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    Josef Kufner avatar 8.10.2014 10:56 Josef Kufner | skóre: 67
    Rozbalit Rozbalit vše Re: php pdo prepare a generovany select
    Tak malé srovnání:

    Společný kousek:
    $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.
    Hello world ! Segmentation fault (core dumped)
    8.10.2014 11:42 Kit | skóre: 39 | Brno
    Rozbalit Rozbalit vše Re: php pdo prepare a generovany select
    Čitelnost je podle mne srovnatelná, výsledek stejný. Nepotřebuji foreach. Na to, abych mohl místo "*" použít seznam výrazů s aliasy, musel bych tvoji knihovnu nastudovat. V případě SQL nemusím a mohu to napsat přímo. Netuším, jak bych v tom dělal subselecty, kombinaci AND/OR nebo třeba INSERT INTO ... SELECT ...

    Ty sis tu knihovnu napsal sám podle svých potřeb, proto ti vyhovuje víc.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    Josef Kufner avatar 8.10.2014 13:19 Josef Kufner | skóre: 67
    Rozbalit Rozbalit vše Re: php pdo prepare a generovany select
    U takto jednoduchých věcí to srovnatelné je, u komplikovanějších už je rozdíl hodně znát. Kód jako ten tvůj mi byl motivací toto vůbec dělat. Btw, místo foreach tam máš array_map, array_keys a array_values, což mi nepřijde jako moc velké zjednodušení.

    Složitější podmínky prostě napíšeš, rozsáhlé OR konstrukce jsou velmi neobvyklé a u těch malých můžeš v klidu udělat ->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).
    Hello world ! Segmentation fault (core dumped)
    8.10.2014 17:06 Kit | skóre: 39 | Brno
    Rozbalit Rozbalit vše Re: php pdo prepare a generovany select
    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šší.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    8.10.2014 17:10 Kit | skóre: 39 | Brno
    Rozbalit Rozbalit vše Re: php pdo prepare a generovany select
    ... a kruci. Samozřejmě pro select používám $_GET, pro modifikující operace zase $_POST.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    Josef Kufner avatar 8.10.2014 17:42 Josef Kufner | skóre: 67
    Rozbalit Rozbalit vše Re: php pdo prepare a generovany select
    To by měl řešit router, front controller a další kopec věcí daleko od SQL dotazu ;-)
    Hello world ! Segmentation fault (core dumped)
    8.10.2014 19:22 Kit | skóre: 39 | Brno
    Rozbalit Rozbalit vše Re: php pdo prepare a generovany select
    Však to mám důsledně oddělené. Tento kód je ve vieweru, který je volán z routeru. Třída User je v servisní vrstvě a stará se o doménu uživatelů. Do vieweru se SQL nedostane. Metody servisní vrstvy jsou volány z modelu.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    Josef Kufner avatar 8.10.2014 17:41 Josef Kufner | skóre: 67
    Rozbalit Rozbalit vše Re: php pdo prepare a generovany select
    Query builder není určen pro přímé používání z okolní aplikace. I ten má být zapouzdřen v nějakém dotazovacím objektu/metodě, které předáš filtry, podobně jak to děláš ty. Narozdíl od ORM a podobných obludností to není zamýšleno jako náhrada modelu, ale jen jako nástroj na psaní SQL dotazů uvnitř modelu.

    Tedy navenek to může vypadat tak, jak jsi právě napsal, ale uvnitř místo
    $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í.
    Hello world ! Segmentation fault (core dumped)

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.