Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Działania w ciągu liczb? (kalkulator)
Forum PHP.pl > Forum > Przedszkole
konri24
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.
nospor
manual - eval()
szawel
wprowadzasz poprostu tego stringa

$wynik=eval($string);
konri24
OK, już wszystko wiem.
THX, za szybką odpowiedź.
l0ud
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...
nospor
@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.
l0ud
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...
Cezar708
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. ?>
nospor
@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.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.