Wątek przeniesiony 2016-02-06 16:08 z PHP przez dzek69.

Funkcja eval pokazuje błędy w niektórych przypadkach

0

Mam taki problem napisałem skrypt który tworzy sobie zadanie matematyczne dokładnie równanie typu 2 + 4 / 4 = i teraz problem w tym, że dla niektórych przypadków skrypt ten wywala błąd w pliku php takiej treśći.

[Sat Feb 06 15:50:05.600665 2016] [:error] [pid 29268] [client 127.0.0.1:39025] PHP Parse error:  syntax error, unexpected '17' (T_LNUMBER) in /var/www/html/pamiec/arytmetyka.php(29) : eval()'d code on line 1, referer: http://127.0.0.1/pamiec/arytmetyka.php?dzialanie=3%20?%204%20*%204&wynik=19&znak=43&poziom=3
 

Co może być tego powodem

Tutaj jest kod php.

  public function ustaw_znak($dzialanie,$ile_cyfr) {
    $j = 0;
    $ktory_znak = rand(1,$ile_cyfr-1);
    $bool = true;
    //print $ktory_znak;
    for ($i=0;$i <= strlen($dzialanie);$i++) {
      if ($dzialanie[$i] == "+" or $dzialanie[$i] == "-" or $dzialanie[$i] == "*" or $dzialanie[$i] == "/") $j++;
      if ($ktory_znak == $j and $bool == true) {
	$bool = !$bool;
	$dzialanie[$i] = "?";
      }
    }
    return $dzialanie;
  }
  
  public function stworz_zadania_aryt($ile_cyfr,$do_jakie_wart) {
    $rand = 0;
    $rand2 = 0;
    $tablica[0] = 2;
    $tablica[1] = 4;
    $dzialanie = "";
    $tablica[2] = 6;
    $tablica[3] = 8;
    $tablica[4] = 10;
    for ($i=1;$i<=$ile_cyfr;$i++) $liczba[$i] = rand(1,$do_jakie_wart);
    
    for ($i=1;$i <= count($liczba);$i++) {
      $znak = rand(1,4);
      if ($i != $ile_cyfr) {
	if ($znak == 1) $znak = " + ";
	else if ($znak == 2) $znak = " - ";
	else if ($znak == 3) $znak = " * ";
	else if ($znak == 4) $znak = " / ";

	if ( $znak == " / " and  ($liczba[$i] > 10 or $liczba[$i+1] > 10) ) {	 
	    $rand = rand(0,4);	    
	    $rand2 = rand(0,4);
	    $liczba[$i] = $tablica[$rand];
	    $liczba[$i+1] = $tablica[$rand2];
	    $dzialanie .= $liczba[$i] . $znak;
	    print "<font color=red>dupa</font>";
	    continue;
	}
	if ( $znak == " * " and ($liczba[$i] > 10  or $liczba[$i+1] > 10) ) {	 
	    $rand = rand(0,3);	    
	    $rand2 = rand(0,3);
	    $liczba[$i] = $tablica[$rand];
	    $liczba[$i+1] = $tablica[$rand2];
	    $dzialanie .= $liczba[$i] . $znak;
	    print "<font color=green>dupa</font>";
	    continue;
	}
      $dzialanie .= $liczba[$i] . $znak;
      }
      else {
	$dzialanie .= $liczba[$i];
      } 
    }
    return $dzialanie;
  }
if (isset($_GET["dzialanie"]) ) {
  //if ($_GET["znak"] == "-") {
  //print "sadasdasdad";
  $znak = chr($_GET["znak"]);
  print "<font color=red>$znak</font>";
  //}
  $dzialanie0 = str_replace("?",$znak,$_GET["dzialanie"]);
  eval("\$wynik2 = $dzialanie0;");
  $bool = false;
  
  print "<font color=red>wynik = $wynik2<br>wynik2 = $_GET[wynik]</font>";
  if ($wynik2 == $_GET["wynik"]) {
  $bool = true;
  
  }
}

$wynik = "";
$dzialanie = $zadanie->stworz_zadania_aryt($dane_poziomu[0],$dane_poziomu[1]);
eval("\$wynik = $dzialanie;");
print "<font color=gray>$dzialanie </font>";
if ($dane_poziomu[2] == 0) $dzialanie = $zadanie->ustaw_znak($dzialanie,$dane_poziomu[0]);












?>

<div id=glowna>
<div id=glowna2>


</div>
<div id=glowna3>
  <?php
    if ($dane_poziomu[2] == 0) {
      print ("<div align=center><font class=strona>Co wstawisz w miejsce znaku zapytania</font>
      
      <br>");
      if ($bool == true and isset($_GET["wynik"]) ) print "<font color=blue>dobrze</font><br>";
      else if ($bool != true and isset($_GET["wynik"]) ) print "<font color=blue>źle</font><br>";
      $plus = ord("+");
      $minus = ord("-");
      $mnoz = ord("*");
      $dziel = ord("/");
      print ("<font class=strona2>$dzialanie" . " = " . $wynik . "</font><br>
      <a class=znaki href=\"./arytmetyka.php?dzialanie=$dzialanie&wynik=$wynik&znak=$plus&poziom=$poziom\">+</a> &nbsp
      <a class=znaki href=\"./arytmetyka.php?dzialanie=$dzialanie&wynik=$wynik&znak=$minus&poziom=$poziom\">-</a> &nbsp
      <a class=znaki href=\"./arytmetyka.php?dzialanie=$dzialanie&wynik=$wynik&znak=$mnoz&poziom=$poziom\">*</a> &nbsp
      <a class=znaki href=\"./arytmetyka.php?dzialanie=$dzialanie&wynik=$wynik&znak=$dziel&poziom=$poziom\">/</a> &nbsp<br>
            <a onclick=\"window.close()\" class=zamknij>zamknij</a>
      </div>");
    }
    else {
      print ("<div align=center>");
      if ( isset($_POST["wynik"]) and $_POST["wynik"] == $_POST["wynik2"]  ) print "<font color=blue>dobrze</font>";
      else if ( isset($_POST["wynik"]) and $_POST["wynik"] != $_POST["wynik2"]  ) print "<font color=blue>źle</font>";
      print ("<form action=./arytmetyka.php method=post id=aryt>
      <font class=strona>Oblicz podane wyrażenie</font><br>");
      print ("<font class=strona2>$dzialanie" . " = <input type=text size=3 name=wynik>
      <input type=hidden name=wynik2 value=$wynik></font>
      <input type=hidden name=poziom value=$poziom></font>
      <a onclick=\"document.getElementById('aryt').submit();\" href=# class=strona>Sprawdź</a><br>
      <a onclick=\"window.close()\" class=zamknij>zamknij</a>
      </div>
      </form>
      " );
    }
    
    
    
    
     
0

Nigdy nie używaj evala do zadań matematycznych. Nie po to to wynaleziono.

Jak chcesz się pchać w takie bzdury mimo wszystko, to po prostu przed każdym evalem zrób sobie var_dump z treści którą wrzucasz w evala i znajdziesz co temu evalowi podajesz.

0

Cały czas dostaje stringa.

0

Teraz właśnie widzę, że w przypadku kiedy nie może policzyć zadania, funkcja var_dump zwraca dziwnego stringa dla zadania
6 ? 2 + 5 = 8 zwraca coś takiego
6 - 2 5
Oczywiście algorytm działą w ten sposób, że ucina znaki = 8, a w miejsce wstawia znak który użytkownik wybrał i oblicza czy to się zgadza z liczbą 8

0

@pol90 ale ty zdajesz sobie sprawę z tego co by sie stało jakby ktoś zamiast twojego "działania" podał ci na wejściu złośliwy kod php do wykonania? ;]

0

A są może jakieś inne funkcje do obsługi typowo zadań matematycznych ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1