Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] eval i tablica
Forum PHP.pl > Forum > Przedszkole
Maxik
Postanowiłem zmienić system komend na taki oparty o tablicę. Wygląda to tak:
  1. <?php
  2. private $slashcmds = array(
  3. 'items' => array('info'=>'Lista rzeczy.', 'code'=>"$this->put('Lista itemów.', 'info');"),
  4. 'clear' => array('info'=>'Czyści ekran', 'code'=>"$this->clear(); $this->put('Maxiks Console', 'important'); $this->put('Wersja '.$this->version, 'info'); $this->put('Wpisz komendę...', 'info'); $this->put('Lista komend: wpisz help lub /help', 'info');"),
  5. 'help' => array('info'=>'Wyświetla ten ekran pomocy', 'code'=>"$this->put('Lista dostępnych komend:', 'info'); foreach($this->slashcmds as $name => $deeper_arr){ $this->put('/'.$name.' - '.$deeper['info'], 'info'); }"),
  6. 'quit' => array('info'=>'Zamyka konsolę', 'code'=>"$this->put('Do zobaczenia!', 'important');"),
  7. 'print_r' => array('info'=>'Wyświetla oczekujące wpisy', 'code'=>"echo '<PRE>'; print_r($_SESSION); echo '</PRE>';"),
  8. 'debug' => array('info'=>'Sprawdza poprawność działania konsoli', 'code'=>"$this->put('Debugger', 'important'); $this->put('Test', 'info'); $this->put(session_id(), 'important'); echo '<PRE>'; print_r($_SESSION); echo '</PRE>'; if($_COOKIE['PHPSESSID']==session_id()){    $this->put('Ciastko OK!', 'info'); } else{    $this->put('Ciastko złe', 'error'); }")
  9. );
  10. ?>


A funkcja przetwarzająca to:
  1. <?php
  2. public function parse_cmd_from_array($command){
  3.        $this->put($command, 'command');
  4.        if($command[0]=='/' and array_key_exists(substr($command, 1), $this->slashcmds)){
  5.            eval($this->slashcmds[substr($command, 1)]['code']);
  6.        } else{
  7.           $this->put('Polecenie nie zostało rozpoznane', 'error');                        
  8.        }
  9.        $this->ajax_check();
  10.    }
  11. ?>


Pewnie to jakiś głupi błąd, ale ja go nie widzę. Proszę o pomoc.
erix
Ok, ale jakie jest pytanie, w czym tkwi problem? winksmiley.jpg
Maxik
Takie, że to nie działa. Myślałem, że to logiczne winksmiley.jpg
erix
A sprawdzałeś po kolei wszystkie warunki? Sprawdziłeś wszystkie zmienne? Trochę samodzielności, na pewno znajdziesz gdzieś błąd. winksmiley.jpg
rzymek01
nie podałeś przydatnych funkcji, aby to na localu mozna było uruchomić, a na slepo tylko takie coś udało mi się zrobić (nawet nie wiem czy działa)
  1. <?php
  2. private $slashcmds = array(
  3. 'items' => array('info'=>'Lista rzeczy.', 'code'=>'$this->put('Lista itemów.', 'info');'),
  4. 'clear' => array('info'=>'Czyści ekran', 'code'=>'$this->clear(); $this->put('Maxiks Console', 'important'); $this->put('Wersja '.$this->version, 'info'); $this->put('Wpisz komendę...', 'info'); $this->put('Lista komend: wpisz help lub /help', 'info');'),
  5. 'help' => array('info'=>'Wyświetla ten ekran pomocy', 'code'=>'$this->put('Lista dostępnych komend:', 'info'); foreach($this->slashcmds as $name => $deeper_arr){ $this->put('/'.$name.' - '.$deeper['info'], 'info'); }'),
  6. 'quit' => array('info'=>'Zamyka konsolę', 'code'=>'$this->put('Do zobaczenia!', 'important');'),
  7. 'print_r' => array('info'=>'Wyświetla oczekujące wpisy', 'code'=>'echo '<PRE>'; print_r($_SESSION); echo '</PRE>';'),
  8. 'debug' => array('info'=>'Sprawdza poprawność działania konsoli', 'code'=>'$this->put('Debugger', 'important'); $this->put('Test', 'info'); $this->put(session_id(), 'important'); echo '<PRE>'; print_r($_SESSION); echo '</PRE>'; if($_COOKIE['PHPSESSID']==session_id()){    $this->put('Ciastko OK!', 'info'); } else{    $this->put('Ciastko złe', 'error'); }')
  9. );
  10.  
  11.  public function parse_cmd_from_array($command)
  12.  {
  13.    $this->put($command, 'command');
  14.    if ($command[0] =='/' && array_key_exists(substr($command, 1), $this->slashcmds))
  15.    {
  16.      eval($this->slashcmds[substr($command, 1)]['code']);
  17.    } else
  18.    {
  19.      $this->put('Polecenie nie zostało rozpoznane', 'error');                        
  20.    }
  21.  
  22.    $this->ajax_check();
  23.  }
  24. ?>


chodzi o to, że pozamieniałem " z tych komend na apostrofy, bo jak miałes " to ten kod juz się wczesniej wykonywał, tzn. przed evalem :/


EDIT:
a mi działa tongue.gif
wywaliłem ten substr, ale ty spowrotem możesz wrzucić, bo ja po prostu nie pisałem `/items` a `items`

  1. <?php
  2. /*wywaliłem substr(..., 1), bo dla mnie było zbedne*/
  3.  
  4. class test
  5. {
  6.  private $slashcmds = array(
  7. 'items' => array('info'=>'Lista rzeczy.', 'code'=>'$this->put('Lista itemów.', 'info');'),
  8. 'clear' => array('info'=>'Czyści ekran', 'code'=>'$this->clear(); $this->put('Maxiks Console', 'important'); $this->put('Wersja '.$this->version, 'info'); $this->put('Wpisz komendę...', 'info'); $this->put('Lista komend: wpisz help lub /help', 'info');'),
  9. 'help' => array('info'=>'Wyświetla ten ekran pomocy', 'code'=>'$this->put('Lista dostępnych komend:', 'info'); foreach($this->slashcmds as $name => $deeper_arr){ $this->put('/'.$name.' - '.$deeper['info'], 'info'); }'),
  10. 'quit' => array('info'=>'Zamyka konsolę', 'code'=>'$this->put('Do zobaczenia!', 'important');'),
  11. 'print_r' => array('info'=>'Wyświetla oczekujące wpisy', 'code'=>'echo '<PRE>'; print_r($_SESSION); echo '</PRE>';'),
  12. 'debug' => array('info'=>'Sprawdza poprawność działania konsoli', 'code'=>'$this->put('Debugger', 'important'); $this->put('Test', 'info'); $this->put(session_id(), 'important'); echo '<PRE>'; print_r($_SESSION); echo '</PRE>'; if($_COOKIE['PHPSESSID']==session_id()){    $this->put('Ciastko OK!', 'info'); } else{    $this->put('Ciastko złe', 'error'); }')
  13. );
  14.  
  15.  public function parse_cmd_from_array($command)
  16.  {
  17.    $this->put($command, 'command');
  18.    if (array_key_exists($command, $this->slashcmds))
  19.    {
  20.      eval($this->slashcmds[$command]['code']);
  21.    } else
  22.    {
  23.      $this->put('Polecenie nie zostało rozpoznane', 'error');                        
  24.    }
  25.  
  26. //    $this->ajax_check();
  27.  }
  28.  
  29.  public function put($s1, $s2)
  30.  {
  31.    echo '<b>'.$s2.':</b> '.$s1.'<br/>';
  32.  }
  33. }
  34.  
  35. $oT = new test;
  36. $oT->parse_cmd_from_array('items');
  37. ?>


funkcje składowe też sam zrobiłem, ale działa biggrin.gif

PS. jakby ktoś nie wierzył to tu jest screen:
Maxik
Dzięki, rzeczywiście chodziło o cudzysłowia.
rzymek01
nie ma sprawy, polecam się na przyszłość
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.