Stejný algoritmus pro PHP a JavaScript rubrika: Programování: PHP

8 rmaslo
položil/-a 15.9.2014

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é.

odkaz Vyřešeno
10 jiri.knesl
odpověděl/-a 14.9.2014

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).

Komentáře

  • rmaslo : Není to str_replace je to transformace pole/JS objektu na string. Ukázku vstupu jsem přidal nahoru k tématu. Uživatel ten dotaz buduje interaktivně postupně, napřed třeba jednu stranu podmínky a pak druhou - tím, že volí v nějakých kombech případně vyplní nějakou hodnotu. Chtěl bych aby toto budování viděl průběžně na tom vytvářeném SQL dotazu, ale je podle mě zbytečné, aby se po každém kliku ten zatím nehotový SQL dotaz posílal na server (nehotový dotaz data vrátit nemůže) jenom proto aby se složil a zobrazil. 15.9.2014
  • jiri.knesl : Ale je to str_replace. foreach($sql['where'] as $row) { validateRow($row); $sqlText .= str_replace("`%table`.`%column` %operator %value", array($row['table'], $row['column'] ...);}. Nehotový SQL - pro budování nehotových bych to přenesl do JS, protože to na serveru nepotřebuješ a stáhl bys při loadu stránky, které tabulky máš, v tabulkách jaké jsou sloupce, jakého jsou typu - k typům povolené operátory - a k typům i povolené hodnoty (pokud je číselník, bral bych ještě omezující pravidlo, jaké hodnoty jsou dovolené). 15.9.2014
  • rmaslo : @jiri.knesl: Větou "pro budování nehotových bych to přenesl do JS" myslíš přenesení algoritmu co to slepuje do JS? ¶ Názvy tabulek, sloupců, povolené operátory a funkce stahuju při loadu stránky - souhlas. 15.9.2014
  • jiri.knesl : do bych přenesl přidávání jednotlivých řádek pomocí GUI. tzn. v JS bych naklikal řádku, to by šlo na server, ten by vygeneroval SQL a rovnou ho i vykonal. už jsem takovou věc napsal v Angularu a je to tak na 150 řádek vcelku znovupoužitelného kódu. 16.9.2014

Pro zobrazení všech 5 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.