Autor Zpráva
Daidalos
Profil
Ahoj všeci.
Potřeboval bych pomoci, musím udělat kalkulačku v PHP, tak abych vždy kliknul na číslo a ono se mi hned pod tím zobrazilo, kliknu na další a přičte se k tomu původnímu, dokud prostě nekliknu na operátor.
No prostě jednoduše řešeno, jako je to v klasické kalkulačce ve windowsu, ne že zadáte dvě čísla, operátor a kliknete spočítat a ono vás to přesměruje na další stránku. Musí to být na jedné stránce, nebo více, ale ta další musí includovat tu původní. Musím to mít v PHP a ne v Javascriptu, to je asi ten největší problém. V javascriptu jsem toho našel na netu hafo, ale v PHP ani jeden příklad..
Vůbec nevím jak na to, stačilo by kdyby mě někdo aspoň nakopnul správným směrem kde hledat, samozřejmně nějaký konkrétní příklad by neškodil..
Jinak děkuju všem za čas..
Lopata
Profil
Daidalos:
Nakopnutí:

Nemůžeme-li použít js, musíme při každém kliku, který mění stav znovu načíst stránku.

Hovoříte o "kalkulačce jako ve windowsech". Ta ale umožňuje příklad napsat i do textového pole. Chcete-li tuto funkcionalitu, nemáte na výběr a celá kalkulačka musí být velký formulář. Jestli jí nechcete, dalo by se uvažovat o tlačítek ve formě odkazů, ale formulář je obecně lepší řešení.

Tady dochází k lámání chleba. Musíte se rozhodnout, jestli máte rád funkci eval()... :-P :-D

Musíte se rozhodnout...
Daidalos
Profil
Ano s tím načtením stránky počítám. Já už jsem něco sesmolil, ale vždy když kliknu na tlačítko tak se zobrazí, bohužel když kliknu na další předešlé zmizí. Dělal jsem to pomocí formuláře, a každé tlačítko bylo submit a normálně getem jsem to získával..
Ano s tou kalkulačkou jako ve windowsech jsem se spletl, to zapisování do řádku tam být nemusí.
My to máme mít právě do školy a skoro nikdo neví. Učitel nám radil, že máme udělat neviditelné pole do kterého by se to ukládalo.
O funkci eval slyším poprvé, mohl by jste mi jí prosím stručně zhrnout?
Lopata
Profil
Daidalos:
Funkce eval() přijímá jako argument řetězec kódu a ten vykoná.
 eval('echo "foo"') 
by vypsalo 'foo'. Užití této funkce je ale obrovské bezpečnostní riziko, dáváte li do ní data, která poslal uživatel -> každý by vám na serveru mohl spustit jakýkoliv kód.

Ulehčilo by vám to práci v tom smyslu, že by šlo udělat něco jako
$res = eval('1+(1-9)*2')
. Vy byste pak jen vytvářel ten řetězec. Je to ale návrhově velmi nepěkné a nebezpečné. Šlo by sice regulárními výrazy striktně ověřovat vše, ale i tak.
Joker
Profil
Daidalos:
…ne že zadáte dvě čísla, operátor a kliknete spočítat a ono vás to přesměruje na další stránku. Musí to být na jedné stránce…

Ano s tím načtením stránky počítám.
Tak jak vlastně?

bohužel když kliknu na další předešlé zmizí
Musí se někde (neviditelné pole, cookie nebo tak) sestavovat celý výraz.

Nicméně tahle koncepce mi připadá velmi nepohodlná a neefektivní. Když si představím, že chci vypočítat třeba "1337+42"
1. Kliknu na 1, stránka se odešle na server, server zkopíruje hodnotu "1" do políčka pro "displej" a vrátí zase stránku s kalkulačkou
2. Kliknu na 3, stránka se odešle na server, server připojí "3" k políčku pro "displej" a vrátí zase stránku s kalkulačkou
3. Kliknu na 3, stránka se odešle na server, server připojí "3" k políčku pro "displej" a vrátí zase stránku s kalkulačkou
4. Kliknu na 7, stránka se odešle na server, server připojí "7" k políčku pro "displej" a vrátí zase stránku s kalkulačkou
5. Kliknu na +, stránka se odešle na server, server připojí "+" k políčku pro "displej" a vrátí zase stránku s kalkulačkou
6. Kliknu na 4, stránka se odešle na server, server připojí "4" k políčku pro "displej" a vrátí zase stránku s kalkulačkou
7. Kliknu na 2, stránka se odešle na server, server připojí "2" k políčku pro "displej" a vrátí zase stránku s kalkulačkou
8. Kliknu na =, stránka se odešle na server, server zpracuje příklad, výsledek zapíše do políčka pro "displej" a vrátí stránku s kalkulačkou.

V krocích 1-7 se stránka posílá sem a tam mezi serverem a klientem jen kvůli tomu, aby server zkopíroval znak na displej.
Ostatně i v tom konečném výpočtu mě nenapadá matematická funkce, kterou by musel dělat server.
Daidalos
Profil
No stránka se může načíst znova a znova, ale nesmí se něco zadat a přesmérovat na jinou která rovnou vypíše výsledek...
Evalem to tedy nepůjde, a jak píše Joker ten jeho příklad je dost složitý.
Tak jak tedy na to?
Nox
Profil
Zní mi to spíše jako školní příklad, je to tak?
Pak by tedy „V krocích 1-7 se stránka posílá sem a tam mezi serverem a klientem jen kvůli tomu, aby server zkopíroval znak na displej.“ nevidím jako problém, na praxi s tím stejně nedojde, natož na větší využití

Zlepšení tedy pokud to nesmí nijak používat JS tak prostě dát uživateli možnost zadat číslo až výraz celý
Daidalos
Profil
Je to školní příklad, JS tam být nesmí a uživatel nic zadávat nemůže, jen klikat na číslo/znamínko.
Nox
Profil
Pak tedy viz Joker, průběžný stav si úkladej do cookie/session/neviditelného pole/souboru....
Daidalos
Profil
Řeknete mi prosím jakou funkci na ukládání třeba do cookie nebo neviditelného, na souboru znám, ale to mi příjde trochu nepraktické..
A jinak dík moc všem ;)
Joker
Profil
Nox:
Zní mi to spíše jako školní příklad
Jasně, jen je škoda, že zadání příkladu je řešit nějaký problém prostředky, které jsou pro jeho řešení naprosto nevhodné (což souvisí i s tím poznatkem z prvního příspěvku: „V javascriptu jsem toho našel na netu hafo, ale v PHP ani jeden příklad“ ...nikdo to tak nedělá, protože jsou prostě lepší způsoby).

Daidalos:
Řeknete mi prosím jakou funkci na ukládání třeba do cookie nebo neviditelného
setcookie a echo

Příklad:
echo('<input type="hidden" name="vyraz" value="'.$vyraz.'">');
Daidalos
Profil
To je pravda, i druhý učitel řikal, že je to mnohem lepší dělat v JS, tak jako tak ten mi neumíme..
Co je podle vás lepší? Dělat to neviditelným polem nebo pomocí cookies?
Chro
Profil
Daidalos:
Do tvého problému jsem se trochu ponořil. Možná by to šlo viz kód, ale nevím si (taky) rady jak vypočítat řetězec, příklad 200+100+50 na 350.
<?php
if (isset($_COOKIE["kalk"]))
{ $kalk = $_COOKIE["kalk"]; }
else
{ $kalk = "";
setcookie("kalk", "", strtotime("+1 year")); }
if (isset($_POST["akce"]))
{ $akce = $_POST["akce"];
if ($akce == "0" || $akce == "1" || $akce == "2" || $akce == "3" || $akce == "4" || $akce == "5" || $akce == "6" || $akce == "7" || $akce == "8" || $akce == "9" || $akce == "+")
{ $kalk.= $akce;
setcookie("kalk", $kalk, strtotime("+1 year")); }
if ($akce == "=")
{
//tady nevím jak vypočítat řetězec s čísly a plusky a do cookie uložit výsledek
setcookie("kalk", $kalk, strtotime("+1 year")); } }
echo $kalk;
?>
<form action="kalkulator.php" method="post">
<button type="submit" name="akce" value="0">0</button>
<button type="submit" name="akce" value="1">1</button>
<button type="submit" name="akce" value="2">2</button>
<button type="submit" name="akce" value="3">3</button>
<button type="submit" name="akce" value="4">4</button>
<button type="submit" name="akce" value="5">5</button>
<button type="submit" name="akce" value="6">6</button>
<button type="submit" name="akce" value="7">7</button>
<button type="submit" name="akce" value="8">8</button>
<button type="submit" name="akce" value="9">9</button>
<button type="submit" name="akce" value="+">+</button>
<button type="submit" name="akce" value="=">=</button>
</form>
Nox
Profil
Joker:
Proto jsem odhalil že to je školní příklad :) pro které je charakteristické, že je zadání nesmyslné nebo jsou vynucena nesmyslná kritéria (resp. spíš naopak - pro danou probíranou technologii zvoleno špatné zadání)
Daidalos
Profil
Chro:
Vypadá to velice zajímavě dík, jen škoda že to není dodělané :-D já vim chtěl bych toho moc. Jen jsem moc nepobral, proč tam je current year +1.
Joker
Profil
Daidalos:
Jen jsem moc nepobral, proč tam je current year +1.
To je platnost cookie, viz manuál (stačí v kódu kliknout na název funkce)

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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

0