Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] eval i tablica
Maxik
post
Post #1





Grupa: Zarejestrowani
Postów: 726
Pomógł: 129
Dołączył: 10.01.2008
Skąd: Gdańsk

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


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.


--------------------
Pomogłem? Kliknij przycisk Pomógł pod pomocnym Ci postem.
http://maxik.me/
Go to the top of the page
+Quote Post
erix
post
Post #2





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Ok, ale jakie jest pytanie, w czym tkwi problem? winksmiley.jpg


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

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
Maxik
post
Post #3





Grupa: Zarejestrowani
Postów: 726
Pomógł: 129
Dołączył: 10.01.2008
Skąd: Gdańsk

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


Takie, że to nie działa. Myślałem, że to logiczne winksmiley.jpg


--------------------
Pomogłem? Kliknij przycisk Pomógł pod pomocnym Ci postem.
http://maxik.me/
Go to the top of the page
+Quote Post
erix
post
Post #4





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




A sprawdzałeś po kolei wszystkie warunki? Sprawdziłeś wszystkie zmienne? Trochę samodzielności, na pewno znajdziesz gdzieś błąd. winksmiley.jpg


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

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
rzymek01
post
Post #5





Grupa: Zarejestrowani
Postów: 592
Pomógł: 62
Dołączył: 3.08.2006

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


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:

Ten post edytował rzymek01 26.01.2009, 20:31:42


--------------------
:]
Go to the top of the page
+Quote Post
Maxik
post
Post #6





Grupa: Zarejestrowani
Postów: 726
Pomógł: 129
Dołączył: 10.01.2008
Skąd: Gdańsk

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


Dzięki, rzeczywiście chodziło o cudzysłowia.


--------------------
Pomogłem? Kliknij przycisk Pomógł pod pomocnym Ci postem.
http://maxik.me/
Go to the top of the page
+Quote Post
rzymek01
post
Post #7





Grupa: Zarejestrowani
Postów: 592
Pomógł: 62
Dołączył: 3.08.2006

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


nie ma sprawy, polecam się na przyszłość


--------------------
:]
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: 19.08.2025 - 19:09