Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: "exec" i "foreach"
Forum PHP.pl > Forum > PHP
morrison
mam taki kod:

  1. <?php
  2.  
  3. exec($command_1,$output1);
  4. print &#092;"Wynik wykonania operacji: <br />\";
  5.  
  6. foreach ($output1 as $line) {
  7.  echo &#092;"$line <br />n\";
  8. }
  9.  
  10.  
  11. ?>


ale niestety jesli polecenie systemowe nie wykona sie poprawnie, na ekran nie zostaje wypisany error. Jak to zmodyfikowac aby zobaczyc komunikat o bledzie?
hombrerro
Powinieneś użyć funkcji passthru która zwraca cały output z wykonanego polecenia systemowego a nie tylko ostatnią linie.
morrison
zrobilem tak:
  1. <?php
  2.  
  3. passthru($command_1,$output1);
  4. print &#092;"Wynik wykonania operacji: $output1<br />\";
  5.  
  6. foreach ($output1 as $line) {
  7.  echo &#092;"$line <br />n\";
  8. } 
  9.  
  10. ?>

i jest blad w lini z foreach ze zly argument. Natomiast w $output1 zwraca "0" gdy polecenie sie wykona poprawnie a gdy nie to np zwraca "4". Nie zwraca mi calego komunikatu bledu sad.gif
dr_bonzo
Manual
Cytat
If the return_var argument is present, the return status of the Unix command will be placed here


Czyli dziala tak jak ma dzialac: zwraca ci 0, 4 itd., co nie jest tablica (foreach())

Passthru nie zwraca zadnego komunikatu od polecenia -- on go wypisuje, jak chcesz go wrzucic do zmiennej to uzyj tego skryptu (z manuala):
  1. <?php
  2. passthru(&#092;"<i>command</i>\");
  3. $var = ob_get_contents();
  4. ob_end_clean(); //Use this instead of ob_flush()
  5. ?>
hombrerro
Ach...

Jeżeli podasz nazwę zmiennej w passthru to output zapisany w tejże zmiennej nie będzie tablicą tylko po prostu outputem z polecenia.

Nie będziesz mógł zatem użyć foreach, tylko jakoś przeparsować wynik polecenia.

Zaraz postaram się to sprawdzić o ile uda mi się włączyć 2 komp.


Passthru zwraca bezpośrednio output - zapomniało mi się - ale w ten sposób jaki przedstawił dr bonzo masz sobie cały output w jednej zmiennej i możesz z tym zrobić niemalże prawie wszystko winksmiley.jpg
morrison
dzieki za podpowiedzi, ale jak na razie nie udalo mi sie uzyskac wyswietlenia bledu na ekranie przegladarki. Podpowiedzcie jesli wiecie, skoro passthru zwraca int, czyli 0, 4 itd to rozumiem ze zwrocone 0 oznacza wykonanie sie komendy unixowej ,natomiast kazda inna cyfra oznacza nie wykonanie sie jej? Czy tez nie do konca tak jest?
hombrerro
Sprawdz manual php online w komentarzach masz cos takiego np:

The documention does not mention that passthru() will only display standard output and not standard error.

If you are running a script you can pipe the STDERR to STDOUT by doing

exec 2>&1

Eg. the script below will actually print something with the passthru() function...

#!/bin/sh
exec 2>&1
ulimit -t 60
cat nosuchfile.txt
hwao
a nie mozna tak?smile.gif
  1. <?php
  2. echo `$command_1`;
  3. ?>
morrison
Cytat(hwao @ 2005-06-04 18:35:05)
a nie mozna tak?smile.gif
  1. <?php
  2. echo `$command_1`;
  3. ?>

nie, tak nie działa. Wydawać by się mogło, że to proste, wyświetlić komunikat błędu w przeglądarce. sad.gif
dotychczas mam taki kod:
  1. <?php
  2.  
  3. $command_3 = 'java -classpath '.$prefix_1.'/gnujaxp.jar:'.$prefix_1.'/xt.jar -Dcom.jclark.xsl.sax.parser=gnu.xml.aelfred2.SAXDriver com.jclark.xsl.sax.Driver '.$prefix_2.'/publ.xml '.$prefix_1.'/bibteXML2bibtex.xsl '.$prefix_2.'/'.$_SESSION['fileYearConvert'].'.bib';
  4.  
  5. passthru($command_3,$output_3);
  6. if ($output_3 == 0) {
  7. print '<br />Polecenie java wykonane poprawnie. Plik publ.xml zostal skonwertowany do pli
  8. u '.$_SESSION['fileYearConvert'].'.bib<br /><br />';
  9. } else {
  10. print '<br /><font color=#ff0000>Wystapil blad!. Polecenie java nie zostalo wykonane. Skontaktuj sie z admini
  11. tratorem systemu.</font><br /><br />';
  12. }
  13.  
  14.  
  15. ?>

Czy potrafi ktoś go zmodyfikować tak bym otrzymał treść błędu??
ActivePlayer
  1. <?php
  2.  
  3. $command_3 = 'java -classpath '.$prefix_1.'/gnujaxp.jar:'.$prefix_1.'/xt.jar -Dcom.jclark.xsl.sax.parser=gnu.xml.aelfred2.SAXDriver com.jclark.xsl.sax.Driver '.$prefix_2.'/publ.xml '.$prefix_1.'/bibteXML2bibtex.xsl '.$prefix_2.'/'.$_SESSION['fileYearConvert'].'.bib';
  4.  
  5. passthru($command_3,$output_3);
  6. $var = ob_get_contents();
  7. if ($output_3 == 0) {
  8. print '<br />Polecenie java wykonane poprawnie. Plik publ.xml zostal skonwertowany do pli
  9. u '.$_SESSION['fileYearConvert'].'.bib<br /><br />';
  10. } else {
  11. print '<br /><font color=#ff0000>Wystapil blad!. Polecenie java nie zostalo wykonane. Skontaktuj sie z admini
  12. tratorem systemu.</font><br /><br />';
  13. print_r($var);
  14. }
  15. ?>

moze tak ? no bo w sumie:
Execute an external program and display raw output.
Cysiaczek
zrobię tzw. UP postu

Lepiej tak jak pisał ~hombrerro
  1. <?php
  2. exec("polecenie 2>&1", $out);
  3. print_r($out);
  4. ?>


Wszytskie linie w tablicy, co jest przydatne
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.