Autor Zpráva
nowis
Profil
Zdravím,

potřebuji do formuláře zapsat vzorec, se kterým se pak pracuje v php kódu (v cyklu). Je to možné?

příklad vzorce: 10001+($x*10000)

Dík
juriad
Profil
Většinou je to špatný nápad.
Jak složité jsou ty vzorce, dají se rozparsovat a simulovat jejich výpočet?
Na co se odkazuje ta proměnná $x ve formuláři?

Existuje sice funkce eval, ale buď varován; sebemenší chybička v zabezpečení vstupu do této funkce a můžeš při útoku přijít o celý web i všechna data. Umožnuje spustit jakýkoli kód, nejen jednoduchý aritmetický výpočet.
nowis
Profil
juriad:
jedná se o jednoúčelovou aplikaci určenou pro mně a mé kolegy, žádné škody nehrozí. Složitost vzorců není větší, než v příkladu.
Rozparsovat vzorce - tím myslíš rozsekat je na jednotlivé části - každá bude mít svůj input?
Proměnná $x se odkazuje na proměnnou stejného názvu v kódu (omlouvám se asi nechápu otázku).

Nicméně raději bych to samozřejmě udělal nějak čistě…

Díky
juriad
Profil
nowis:
Buď inputy pro obě čísla zvlášť, nebo celý vzorec splitnout na vhodných místech:
$vstup = '10001+($x*10000)';

$vstup = preg_replace('/\s/', '', $vstup); # zahoď mezery
$pole = preg_split('/[()+*]+/', $vstup); # rozděl podle vyjmenovaných znaků

echo $pole[0], ', ', $pole[2];

Ono mi šlo o to, co se stane, pokud tam někdo omylem / ze zlomyslnosti napíše místo $x proměnnou $y.
Navíc jsem nevěděl, zda $x není odkaz na nějakou jinou proměnnou definovanou ve formuláři.
nowis
Profil
juriad:
jasně, ikdyž navrhované řešení úplně nechápu :-) . Proměnná by vždy měla být jen jedna a je to vždy jen násobič inkrementován v cyklu o 1. Takže by to možná šlo udělat i takto?

$vstup = '10001+(INCREMENT*10000)';
$vzorec= preg_replace('/INCREMENT/', '\$x', $vstup);

Je to blbost? Pokud ne, jak s tím vzorcem pak pracovat? Protože takto to asi nepůjde:

for ($x=0;$vzorec<=$max; $x++)
{blabla}

Za vzorec mi to asi nedosadí výsledek, ale jen ten vzorec jako řetězec...
Alphard
Profil
nowis:
Proměnná by vždy měla být jen jedna a je to vždy jen násobič inkrementován v cyklu o 1.
Musí to být vzorec? Nebylo by jednodušší zadat jen jednotlivé koeficienty a neblbnout s eval?

Pro obecný výpočet je správné řešení použít matematický parser. Nikdy nevíte, kam se script časem dostane.
nowis
Profil
Díky za informace, zkusím se s tím poprat

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: