Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php] Działania w ciągu liczb? (kalkulator)
konri24
post
Post #1





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 21.11.2007

Ostrzeżenie: (0%)
-----


Witam!
Heh, trudno mi jakoś zdefiniować temat... :/
Prosiłbym o pomoc w napisaniu skryptu liczącego (kalkulator).
Chodzi o to, żeby do jedengo inputa wprowadzić ciąg znaków "2+3*4-2", a skrypt php to obliczył.
Podkreślam to ma być w jednym inpucie.
Próbowałem tak:
  1. <?php
  2. $liczby="2+3*4-2";
  3. $wynik=(int)$liczby;
  4. ?>

ale nie wychodzi.
PS. To działanie w pierwszej fazie musi być string'iem... .
Z góry dzięki. Pozdrawiam.

Ten post edytował batman 5.05.2008, 20:35:43
Powód edycji: Przenoszę na przedszkole
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




manual - eval()


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
szawel
post
Post #3





Grupa: Zarejestrowani
Postów: 59
Pomógł: 1
Dołączył: 7.06.2007
Skąd: torun

Ostrzeżenie: (0%)
-----


wprowadzasz poprostu tego stringa

$wynik=eval($string);
Go to the top of the page
+Quote Post
konri24
post
Post #4





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 21.11.2007

Ostrzeżenie: (0%)
-----


OK, już wszystko wiem.
THX, za szybką odpowiedź.
Go to the top of the page
+Quote Post
l0ud
post
Post #5





Grupa: Zarejestrowani
Postów: 1 387
Pomógł: 273
Dołączył: 18.02.2008

Ostrzeżenie: (0%)
-----


hmm... A co jeżeli w pole formularza wpiszę np. coś takiego:
Kod
unlink('skrypt.php');


Zapewne skrypt zwróci w wyniku 1 i już więcej nie uruchomi? Tak więc raczej ta metoda bezpieczna nie jest...


--------------------
XMPP: l0ud@chrome.pl
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




@l0ud to ze dane najpierw trzea przefiltrowac to chyba oczywiste, nieprawdaż? A jesli ktos o tym nie wiedzial to juz wie smile.gif
Tak wiec metoda sama w sobie jest ok, pod warunkiem ze najpierw dane zostaną zwalidowane.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
l0ud
post
Post #7





Grupa: Zarejestrowani
Postów: 1 387
Pomógł: 273
Dołączył: 18.02.2008

Ostrzeżenie: (0%)
-----


Wg. mnie jednak nie jest to dobry sposób do osiągnięcia tego celu.

Na razie załóżmy że podstawowe filtrowanie już jest - zezwalamy tylko na cyfry, + - * i /

  1. <?php
  2.  
  3. $liczby = '1+1';
  4. $wynik = eval($liczby);
  5.  
  6. echo $wynik;
  7.  
  8. ?>

Niestety, nie jest to takie proste (parse error) - więc kombinujemy:
  1. <?php
  2.  
  3. $liczby = '1+1';
  4. eval('$wynik = '.$liczby.';');
  5.  
  6. echo $wynik;
  7.  
  8. ?>

Wygląda na to, że działa... Ale zbyt pewne nie jest:
  1. <?php
  2.  
  3. $liczby = '1++1';
  4. eval('$wynik = '.$liczby.';');
  5.  
  6. echo $wynik;
  7.  
  8. ?>

Parse error. Nie mam pomysłu na proste sprawdzenie czy wyrażenie jest prawidłowe. Nawet zwykłe dzielenie przez 0 zwróci warning...


--------------------
XMPP: l0ud@chrome.pl
Go to the top of the page
+Quote Post
Cezar708
post
Post #8





Grupa: Zarejestrowani
Postów: 1 116
Pomógł: 119
Dołączył: 10.05.2005
Skąd: Poznań

Ostrzeżenie: (0%)
-----


na początek można zabezpieczyć się w ten sposób:

  1. <?php
  2. $liczby = "2+ 2 *2/0";
  3. if ( !preg_match('/[a-zA-Z]/', $liczby) ){
  4. eval("$wynik = $liczby;");
  5. $err = error_get_last();
  6. if ( $err['message'] == 'Division by zero' ){
  7. echo "nie dziel cholero przez zero";
  8. } else {
  9. echo $wynik;
  10. }
  11. } else {
  12. echo "nie zaakceptowany input";
  13. }
  14. ?>


Ten post edytował Cezar708 5.05.2008, 22:15:33
Go to the top of the page
+Quote Post
nospor
post
Post #9





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




@l0ud odpowiednie wyrazenie regularne i daloby sie zapobiec Twoim przykladom.
Co do dzielenia przez zero to masz racje, tego nie wykryjemy ot tak sobie.
Jesli ktoś ma czas i chec to moze pobawić się w ONP - Odwrotna Notacja Polska - jest to algorytm na wyliczanie takich działań. Bardzo fajny, swego czasu implementowałem go w Pascalu.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 11:29