Stejný algoritmus pro PHP a JavaScript rubrika: Programování: PHP
Má někdo zkušenosti s vytvářením něčeho takového? tj. pravděpodobně s nějakým sw/službou, která buď přeloží JavaScript do PHP nebo naopak anebo udělá překlad do obojího na základě nějakého výchozího metakódu?
Je mi jasné, že takovýto duální kód trochu zavání špatným návrhem proto uvedu důvod. V mém konkrétním případě mám nějaké povnořované PHP pole / JS objekt, který uživatel edituje v browseru pomocí JS. V prvcích tohoto pole jsou různé parametry selectovacího SQL dotazu (výstupní sloupce, vstupní tabulky atd...). Uživateli chci samozřejmě zobrazovat výsledný dotaz a pak jej chci spustit na serveru. Je to součast nějakého api.
Normální by samozřejmě bylo složit dotaz na klientovi (na jednom místě) v JS a na server poslat jen výsledek - to by ale byla samozřejmě ohromná bezpečnostní díra.
Druhý způsob - skládat dotaz jen na serveru a tahat ho přes na ajax do klienta po stisku kdejaké klávesy mi taky nepřijde zrovna optimální.
Ale algoritmus skládání pole do stringu (s kontrolama atd) chci samozřejmě psát jen na jednom místě.
Doplněno - ukázka části vstupního pole (klíč WHERE), bráno přímo z $_POST
$SQL[Where][Type] = 'Formula';
$SQL[Where][Function] = 'OR';
$SQL[Where][0][Type] = 'Formula';
$SQL[Where][0][Function] = '=';
$SQL[Where][0][0][Type] = 'Column';
$SQL[Where][0][0][Table] = 'katalog';
$SQL[Where][0][0][Column] = 'doprodej';
$SQL[Where][0][1][Type] = 'Value';
$SQL[Where][0][1][Value] = '1';
$SQL[Where][1][Type] = 'Formula';
$SQL[Where][1][Function] = 'AND';
$SQL[Where][1][0][Type] = 'Formula';
$SQL[Where][1][0][Function] = '>';
$SQL[Where][1][0][0][Type] = 'Column';
$SQL[Where][1][0][0][Table] = 'katalog';
$SQL[Where][1][0][0][Column] = 'cena';
$SQL[Where][1][0][1][Type] = 'Value';
$SQL[Where][1][0][1][Value] = '10';
$SQL[Where][1][1][Type] = 'Formula';
$SQL[Where][1][1][Function] = '<';
$SQL[Where][1][1][0][Type] = 'Column';
$SQL[Where][1][1][0][Table] = 'katalog';
$SQL[Where][1][1][0][Column] = 'cena';
$SQL[Where][1][1][1][Type] = 'Value';
$SQL[Where][1][1][1][Value] = '20';
Výsledkem je: WHERE (katalog
.doprodej
= "1") OR ((katalog
.cena
> "10") AND (katalog
.cena
< "20"))
Algoritmus vpodstatě jenom rekurzivně skládá to pole a ošetřuje SQL injection v jménech db objektů, konstant a kontroluje "povolené" operátory a funkce. Žadná velká věda. Ale tak nějak tuším, že občas přijde změna typu: přidat nějakou další funkci a rád bych aby obě verze kódu fakt dělaly to samé.
Jestli tomu rozumím dobře, buduješ aplikaci, která ti umožní skládat si dotazy do API. To je interaktivní činnost, která se nejpříjemněji dělá, když uživatel vidí výsledky průběžně - tzn. bude pořád online - takže není nutné duplikovat kód mezi klientem a serverem.
Tam bych při každé změně, která dává smysl, odpálil 2 AJAXové requesty:
- vrať mi SQL pro parametry
- rovnou vykonej SQL a pošli výsledek (nebo aspoň náhled výsledku)
První bude zpět velmi rychle (bude to stejně jen nějaké str_replace a pár podmínek, které přilepí do dotazu JOINy, ne?), druhé může a nemusí (možná bych přidával nějaký LIMIT 30, pracoval bych s indexy na tabulkách).
Pro zobrazení všech 5 odpovědí se prosím přihlaste:
Nebo se přihlaste jménem a heslem:
Komentáře